6

オフになる前に終了する他の多くのターゲットと gzip のいくつかのログ ファイルに依存する「クリーンアップ」ターゲットを挿入したいと考えています。一部のツールが失敗する可能性があるため、早期に gzip しないことが重要です。

Scons が実行するクリーンアップ ターゲットを挿入するにはどうすればよいですか?

たとえば、ターゲット foo と bar があります。ユーザーが指定しなくても、foo と bar に依存し、両方が完了した後に実行される「クリーンアップ」と呼ばれる新しいカスタム ターゲットを挿入したい

% scons foo cleanup

次のように入力してもらいます。

% scons foo

ただし、ユーザーが入力したかのように scons を実行する

% scons foo cleanup

クリーンアップ ターゲットを作成して sys.argv に追加しようとしましたが、コードに到達するまでに scons が sys.argv を既に処理しているように見えるため、手動で追加した「クリーンアップ」ターゲットを処理しません。 sys.argv.

4

3 に答える 3

13

文書化されていない機能を使用しないでください。クリーンアップターゲットを次_Add_Targetsの場所に追加できます。BUILD_TARGETS

from SCons.Script import BUILD_TARGETS
BUILD_TARGETS.append('cleanup')

文書化されていない関数の代わりに、この文書化されたターゲットのリストを使用すると、簿記を行うときに scons が混乱することはありません。このコメント ブロックは次の場所にありますSCons/Script/__init__.py

# BUILD_TARGETS can be modified in the SConscript files.  If so, we
# want to treat the modified BUILD_TARGETS list as if they specified
# targets on the command line.  To do that, though, we need to know if
# BUILD_TARGETS was modified through "official" APIs or by hand.  We do
# this by updating two lists in parallel, the documented BUILD_TARGETS
# list, above, and this internal _build_plus_default targets list which
# should only have "official" API changes.  Then Script/Main.py can
# compare these two afterwards to figure out if the user added their
# own targets to BUILD_TARGETS.

BUILD_TARGETS内部ヘルパー関数を呼び出す代わりに変更することを意図していると思います

于 2012-03-11T13:43:12.177 に答える
3

1つの方法は、gzipツールをログファイルの出力に依存させることです。たとえば、このCファイルがある場合、「hello.c」:

#include <stdio.h>
int main()
{
    printf("hello world\n");
    return 0;
}

そしてこのSConstructファイル:

#!/usr/bin/python
env = Environment()
hello = env.Program('hello', 'hello.c')
env.Default(hello)
env.Append(BUILDERS={'CreateLog':
    Builder(action='$SOURCE.abspath > $TARGET', suffix='.log')})
log = env.CreateLog('hello', hello)
zipped_log = env.Zip('logs.zip', log)
env.Alias('cleanup', zipped_log)

次に、「scons cleanup」を実行すると、必要な手順が正しい順序で実行されます。

gcc -o hello.o -c hello.c
gcc -o hello hello.o
./hello > hello.log
zip(["logs.zip"], ["hello.log"])

これは指定した内容ではありませんが、この例と要件の唯一の違いは、「クリーンアップ」が実際にzipファイルを作成するステップであるため、実行する必要があるステップであるということです。その依存関係(ログを生成するプログラムの実行、そのプログラムの作成)は自動的に計算されます。これで、次のようにエイリアス「foo」を追加して、目的の出力を取得できます。

env.Alias('foo', zipped_log)
于 2009-04-02T06:49:04.600 に答える