なんとかなるさね

マイコンをネタにブログを始めてみました


スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--/--   blog-entry-   category: スポンサー広告

go page top

HEW | KPIT GNUツールチェインを呼び出すMakefileを生成させてhmakeでビルド (3) 

前のエントリで書いたように、HEWでKPIT GNUツールチェインを使用している場合には、Makefileを生成
させようとすると、正しくない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


関連記事

2012/09/04   blog-entry-186   category: HEW

go page top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。