2012-01-17 7 views
4

私はsconsのエンドビルドコールバックのようなものを登録する方法を探しています。たとえば、今のようなことをしています。sconsのすべてのビルドの後にいくつかのコードを実行するにはどうすればよいですか?

def print_build_summary(): 
    failures = SCons.Script.GetBuildFailures() 
    notifyExe = 'notify-send ' 
    if len(failures) > 0: 
     notifyExe = notifyExe + ' --urgency=critical Build Failed' 
    else: 
     notifyExe = notifyExe + ' --urgency=normal Build Succeed' 

    os.system(notifyExe) 

atexit.register(print_build_summary) 

これは非対話モードでのみ機能します。私は、すべてのビルドの最後に、特にインタラクティブなsconsセッションで複数の 'build'コマンドを実行するときに、このようなものをポップアップできるようにしたいと考えています。

私が見つけた唯一の提案は、依存システムを使用するか、またはAddPostActionというglomを呼び出すことです。それは本当に依存関係ではないので(それは本当にビルドの一部ではない、厳密に言えば)、それは私にはそうではないように思えます。すべてのビルドの終わり。

ありがとうございます!

答えて

1

私はSConsが何か助けとなるものを提供していることを発見した。これは非常に便利な機能のようですが、おそらくSConsの開発者はこれらのスレッドを見て、提案を受け取ります...

私はソースコードを見て、それを行う方法を考え出しました。 scons.orgのSCons開発者にこの変更を提案しようとします。

興味がある場合、ファイルはengine/SCons/Script/Main.pyで、機能は_build_targets()です。この関数の最後では、ユーザが指定したコールバックへの呼び出しを追加するだけで済みます。もちろん、このソリューションは、ネットワーク内の複数の異なるマシンを構築する場合にはあまり役に立ちません。なぜなら、どこでも変更を必要に応じて移植する必要があるからです。しかし、1台のマシンにしか構築できない場合は、 SConsが正式に解決策を提供するまで/

変更を実装するのに手伝いが必要な場合はお知らせください。私ができることがわかります。

もう1つの方法は、コールをSConsにラップし、ラッパースクリプトで目的のアクションを実行させることですが、SConsインタラクティブモードでは役に立ちません。このことができます

希望、

ブレイディは

EDIT:私は何も悪いことは、依存関係を使用してないと思うhttp://scons.tigris.org/issues/show_bug.cgi?id=2834

6

私はこのための機能要求を作成しますこれを解決するシステムです。これは私が通常それを行う方法です。

def finish(target, source, env): 
    raise Exception('DO IT') 

finish_command = Command('finish', [], finish) 
Depends(finish_command, DEFAULT_TARGETS) 
Default(finish_command) 

これは、実行(そう、あなたはそれが常に最後に実行でしょうね - sconsのマニュアルでDEFAULT_TARGETSを参照)だのデフォルトのターゲットに依存コマンドを作成します。お役に立てれば。

+0

良い解決策ですが、デフォルトターゲットを構築している場合にのみ機能します。最後の2行を以下のように交換しました: 'Depends(finish_command、BUILD_TARGETS); '終了'がBUILD_TARGETSにない場合:BUILD_TARGETS.append( 'finish') ' –