runテストを再実行する方法

BBv2で作成した実行ファイルを起動するのには、通常testingモジュールのrunルールを使うと思います。
ただし、これは自動単体テスト向けの機能なので、実行ファイルが更新されない限り再度実行されることはありません。
これはGUIプログラムを単に起動したい場合には不便な仕様なので、Hamigakiライブラリではexecというルールを準備しているわけですが、tutorial準備している間に無理やり再実行させる方法を思いついたので書いてみました。

import testing ;

# 何か起動したいもの
local t = [ run hello.cpp ] ;

# BBv2オブジェクトはモジュールとして使える
module $(t)
{
    rule hook-generate ( property-set )
    {
        IMPORT os : name : $(__name__) : os.name ;
        IMPORT path : basename : $(__name__) : path.basename ;
        IMPORT path : join : $(__name__) : path.join ;
        IMPORT path : native : $(__name__) : path.native ;

        # 本来の処理
        local g = [ generate $(property-set) ] ;

        # 二番目に仮想ターゲットが入っている
        local v = $(g[2]) ;
        local a = [ $(v).actual-name ] ;

        local s = ;
        if ( [ os.name ] in NT CYGWIN )
        {
            s = ".exe" ;
        }

        local p = [ $(v).path ] ;
        local b = [ path.basename [ $(v).name ] ] ;
        local e = [ path.join $(p) $(b) ] ;
        e = [ path.native $(e:S=$(s)) ] ;

        if [ CHECK_IF_FILE $(e) ]
        {
            # 実行ファイルが残っているので.runファイルだけ更新させる
            ALWAYS $(a) ;
        }
        else
        {
            # 実行ファイルが残っていないので.exeファイルを更新させる
            ALWAYS $(a:S=$(s)) ;
        }
        return $(g) ;
    }

    # インスタンスのメソッドを上書き(特異メソッドもどき)
    IMPORT $(__name__) : hook-generate : : $(__name__).generate ;
}

単にrunで作ったターゲットをALWAYS(常に更新)にしたいだけなんですが、そのために必要なパス情報は仮想ターゲットが生成されるまで確定しないので、そのタイミングで捕捉してしまおうというわけです。
なお、runルールで生成された実行ファイルは通常削除されますが、テストに失敗した場合や--preserve-test-targetsオプションをしていした場合は残るので、実行ファイルの有無でALWAYSにするファイルを変えています。


まぁ、普通は

ALWAYS <p..\\bin\\exe\\hello.test\\msvc-8.0\\debug\\threading-multi>hello.run ;

みたいにデバッグ中だけ直書きした方が手っ取り早いとは思います。