HEW | KPIT GNUツールチェインを呼び出すMakefileを生成させてhmakeでビルド (3)
前のエントリで書いたように、HEWでKPIT GNUツールチェインを使用している場合には、Makefileを生成
させようとすると、正しくないMakefileを生成しますので、HEWが出力するビルドログを併用して、生成
されたMakefileを修正するSEDのスクリプトを書きました。それに加えて、そのSEDのスクリプトをHEWの
Consoleウィンドウ上で実行するTCL/TKコマンドのスクリプトも書いてみました。
HEWKGhmake.hdc
内容は以下の通りです。
させようとすると、正しくないMakefileを生成しますので、HEWが出力するビルドログを併用して、生成
されたMakefileを修正するSEDのスクリプトを書きました。それに加えて、そのSEDのスクリプトをHEWの
Consoleウィンドウ上で実行するTCL/TKコマンドのスクリプトも書いてみました。
HEWKGhmake.hdc
内容は以下の通りです。
# HEWでKPIT GNUツールチェインを使用している場合には、Makefileを生成させようとすると、正しくない
# Makefileを生成します。このスクリプトは、HEWが出力するビルドログを併用して、生成されたMakefileを
# 修正するSEDのスクリプトをHEWのConsoleウィンドウ上で実行するTCL/TKコマンドのスクリプトです。
# (このスクリプトは、SED、UWSC、HMAKEの3つのプログラムと組み合わせて使用するようになっています。
# また、HEWKGhmake.sed、HEWKGhmake.uws、HEWKGhmake.batの3つのスクリプトを併用します。)
# HEWKGhmake.hdc (2012/09/03版)
# HEWのConsoleウィンドウで以下のようにTCL/TKコマンドのスクリプトを実行します。
# SUBMIT $(WORKSPDIR)\\make\\HEWKGhmake.hdc
# 実行後、HEWのConsoleウィンドウで以下のコマンドが使用出来るようになります。
# kgm → Makefile生成、ビルドログ出力、SEDスクリプトによるMakefile修正、を順次行います。
# kmk → 修正されたMakefileを使用してhmakeでビルドします。
# kcl → ビルド生成物をクリーンします。(CLEAN WAITを実行しているだけです。)
# kbu → HEWで普通にビルドします。(BUILD WAITを実行しているだけです。)
# HEWKGhmake.hdcをHEWのコマンドライン引数として指定する方法もあります。
# (1) Hew2.exe "ow WorkSpaceファイル名" "SUBMIT $(WORKSPDIR)\\make\\HEWKGhmake.hdc"
# (2) Hew2.exe "ow WorkSpaceファイル名" "SUBMIT $(WORKSPDIR)\\make\\HEWKGhmake.hdc" "kgm"
# (3) Hew2.exe "ow WorkSpaceファイル名" "SUBMIT $(WORKSPDIR)\\make\\HEWKGhmake.hdc" "kgm" "QUIT"
# 次のような動作になります。
# (1) → HEW起動時にHEWKGhmake.hdcを実行しますが、それ以上のことはしません。
# (2) → HEW起動時にHEWKGhmake.hdcを実行し、その後、続けてkgmコマンドを実行します。
# (3) → HEW起動時にHEWKGhmake.hdcを実行し、kgmコマンドを実行し、その後、HEWを終了します。
# ワークスペースのパス表記として、フォルダの区切りに'\'でも"\\"でも両方使用できます。
# (例) E:\work\workspace\TestKpitGnuH8SXH8SH8_MakefileGeneratedbyHew\TestKpitGnuH8SXH8SH8_MakefileGeneratedbyHew.hws
# (例) E:\\work\\workspace\\TestKpitGnuH8SXH8SH8_MakefileGeneratedbyHew\\TestKpitGnuH8SXH8SH8_MakefileGeneratedbyHew.hws
tcl enable
# 環境の設定
set HMAKE E:\\tools\\micom\\Renesas\\HEW\\hmake.exe
set SED E:\\tools\\micom\\Renesas\\e2-P-Helios\\eclipse\\msys\\bin\\sed.exe
set UWSC E:\\utils\\uwsc\\uwsc.exe
# ワークスペースフォルダのパスを取得する
set MSG [LOG $(WORKSPDIR)\\________.___ ; LOG - ; LOG] ; # MSGの例 Log file = C:\WorkSpace\________.___, Logging is off
set WORKSPDIR [string range $MSG D'11 D'[expr D'[string length $MSG] - D'29 - D'1]]
file delete $WORKSPDIR\\________.___
# LOGコマンドの実行によりセッションの変更があったと認識されるのでセッションを保存する
# そうしないと、セッションを保存するかどうかを確認するダイアログが表示されてしまう
SAVE_SESSION
# ファイル名やフォルダ名の定義
set HEWKGBuildOptions_mak $WORKSPDIR\\make\\HEWKGBuildOptions.mak
set HEWKGBuildOptions_log $WORKSPDIR\\make\\HEWKGBuildOptions.log
set SED_Script $WORKSPDIR\\make\\HEWKGhmake.sed
set BAT_Script $WORKSPDIR\\make\\HEWKGhmake.bat
set UWSC_Script $WORKSPDIR\\make\\HEWKGhmake.uws
set Makefile $WORKSPDIR\\make\\Makefile.mak
set Makefolder $WORKSPDIR\\make
proc kgm_genmak {} {
global HEWKGBuildOptions_mak
global UWSC
global UWSC_Script
# 現在有効なプロジェクトの現在のコンフィグレーションに対してメイクファイルを生成させる
# ただし、KPIT GNUツールチェインに対して生成されたメイクファイルの内容は正しくない
file delete $HEWKGBuildOptions_mak
GENERATE_MAKE_FILE CCCP SCAN NOSUB HMAKE WDAB $HEWKGBuildOptions_mak
while {[file exists $HEWKGBuildOptions_mak] == 0} { ; # ファイルが生成されるまでWAITする
exec $UWSC $UWSC_Script
SLEEP 1000 ; # ms
}
SLEEP 1000 ; # ms
# UWSC_Scriptは以下のようなスクリプトです(先頭のタブ文字と'#'は除きます)
#id = GETID("gnubp", "", 0.1)
#CLKITEM(id, "OK", CLK_BTN)
}
proc kgm_rebuild {} {
global HEWKGBuildOptions_log
# 現在有効なプロジェクトの現在のコンフィグレーションをリビルドしてビルドログを取得する
# このビルドログを利用して、正しくないメイクファイルの内容を補正する
# ビルドログのフォルダ名やファイル名はHEWのオプションダイアログで設定する
file delete $HEWKGBuildOptions_log
CLEAN WAIT
BUILD WAIT
}
proc kgm_sed {} {
global HEWKGBuildOptions_mak
global Makefile
global Makefolder
global SED
global SED_Script
# SEDのスクリプトを実行して、正しくないメイクファイルの内容を補正する
cd $Makefolder
exec $SED -f $SED_Script $HEWKGBuildOptions_mak | $SED -f $SED_Script | $SED -f $SED_Script > $Makefile
}
proc kgm {} {
# 現在有効なプロジェクトの現在のコンフィグレーションに対してメイクファイルを生成させる
# ただし、KPIT GNUツールチェインに対して生成されたメイクファイルの内容は正しくない
kgm_genmak
# 現在有効なプロジェクトの現在のコンフィグレーションをリビルドしてビルドログを取得する
# このビルドログを利用して、正しくないメイクファイルの内容を補正する
# ビルドログのフォルダ名やファイル名はHEWのオプションダイアログで設定する
kgm_rebuild
# SEDのスクリプトを実行して、正しくないメイクファイルの内容を補正する
kgm_sed
}
proc kcl {} {
CLEAN WAIT
}
proc kbu {} {
BUILD WAIT
}
proc kmk {} {
global HMAKE
global Makefile
global Makefolder
global env
global BAT_Script
# パイプ接続モードでopenを実行するとフォルダの区切り文字の取り扱いが変なので補正する
set _HMAKE_ [string map {\\ \\\\} $HMAKE]
set _Makefile_ [string map {\\ \\\\} $Makefile]
set _COMSPEC_ [string map {\\ \\\\} $env(COMSPEC)]
set _BAT_Script_ [string map {\\ \\\\} $BAT_Script]
cd $Makefolder
# HEWのConsoleウィンドウにhmake自体とhmakeから起動された各commandのメッセージ出力を
# 表示し、かつ、標準出力と標準エラー出力の前後関係が維持されたまま表示されるようにする
# 以下の方法では、期待したように動作しない
# set fd [open "|$_HMAKE_ $_Makefile_" r]
# set fd [open "|$_COMSPEC_ /c $_HMAKE_ $_Makefile_" r]
# set fd [open "|$_BAT_Script_ exec -stderr $_HMAKE_ $_Makefile_" r]
# 以下の方法なら、期待したように動作する
set fd [open "|$_BAT_Script_ exec -stdout $_HMAKE_ $_Makefile_" r]
while {![eof $fd]} {
puts [gets $fd]
update
}
close $fd
# BAT_Scriptは以下のようなバッチファイルです(先頭のタブ文字と'#'は除きます)
#@if $%1==$exec if $%2==$-stderr %3 %4
#@if $%1==$exec if $%2==$-stdout %3 %4 2>&1
# 今後の改善点のメモ
# パイプ接続モードでopenした入力先から1行分を取得する(or入力が無くなる)までgetsから返って
# 来ない。また、getsから返って来るまで、Windowsのメッセージループも止まっている。当然、
# HEWも一時的に応答なしの状態になってしまう。ノンブロッキングリードで入力をチェックしつつ、
# メッセージループを回す方法が分かれば、一時的にせよ応答なしの状態になる点を改善したい。
}
また、このスクリプトでは、前回のSEDのスクリプトの他に、以下のスクリプトも併用します。
HEWKGhmake.uws
id = GETID("gnubp", "", 0.1)
CLKITEM(id, "OK", CLK_BTN)
HEWKGhmake.bat
@if $%1==$exec if $%2==$-stderr %3 %4
@if $%1==$exec if $%2==$-stdout %3 %4 2>&1
- 関連記事
-
- HEW | IronPython + HEW TargetServerでGDBSERVERを作る (SH-2)
- HEW | IronPython + HEW TargetServerでGDBSERVERを作る (RX600)
- HEW | IronPython + HEW TargetServerでGDBSERVERを作る (R8C)
- HEW | IronPython + HEW TargetServerでGDBSERVERを作る (H8SX)
- HEW | IronPythonからHEW TargetServerを制御する為の小技 (3)
- HEW | IronPythonからHEW TargetServerを制御する為の小技 (2)
- HEW | e2studio + HEWで生成したMakefile + KPIT GNU C Compilerでビルド
- HEW | KPIT GNUツールチェインを呼び出すMakefileを生成させてhmakeでビルド (3)
- HEW | KPIT GNUツールチェインを呼び出すMakefileを生成させてhmakeでビルド (2)
- HEW | KPIT GNUツールチェインを呼び出すMakefileを生成させてhmakeでビルド (1)
- HEW | KPIT GNUツールチェインを呼び出すMakefileを生成させる時にちょっと便利なツール
- HEW | HEW起動時のコマンドライン引数にHEW Consoleウィンドウのコマンドを複数記述する小技
- HEW | ConsoleウィンドウのTCL/TKコマンドでMakefileを生成させてHEWを終了させる小技
- HEW | ConsoleウィンドウのTCL/TKコマンドでプレースホルダの値を取得する小技
- HEW | ConsoleウィンドウのTCL/TKコマンドでデフォルト基数に依存しないスクリプトを書く小技
2012/09/04 blog-entry-186 category: HEW
| h o m e |