2

次のようなコマンドを使用して、ディレクトリ内のファイルを更新しようとしています。

env.Command(Dir("./targetdir/"),
            ["./targetdir/file0", "./targetdir/file1", ...],
            "./somescript.sh $TARGET")

./targetdir/手動で変更したにもかかわらず、Scons は最新であると言い続けます。./targetdir/file0.

scons は、1 つのソース ファイルが変更されたので、コマンドを実行する必要があることを認識しているはずではありませんか? ターゲットがディレクトリであるという特殊性はありますか?

./somescript.sh ./targetdir/ファイルが変更されるたびにコマンドを実行したい./targetdir/。どうすればいいですか?

4

2 に答える 2

1

ここでの問題は、ターゲットがないことです。Scons は、ターゲットとソースがなければ、依存関係に関する情報を保存できません。したがって、解決策の1つは明示的なターゲットを使用します。

mycmd = Command('some_target', [], ['script.sh targetdir', Touch('$TARGET')])
or 
mycmd = Command('some_target', [], 'script.sh targetdir > $TARGET')
Depends(mycmd, Glob('targetdir/*'))

現在、scons には some_target という名前のターゲットがあり、それが targetdir 内のファイルに依存することがわかっています。私見、それのための特別なビルダー/ラッパーを作成し、バリアントディレクトリを使用してそこにターゲットを保存する最良の方法。

于 2012-09-12T10:19:12.243 に答える
1

SCons がターゲットをディレクトリにするのが好きだとは思いません。代わりに、個々のファイルをターゲットとして指定する必要があります。

補足として、ターゲットとソースに同じファイルを含めるつもりですか? これが「somescript.sh」の入力ファイルがないためである場合は、通常、スクリプトをソースとして提供できます。このように、SCons は、ターゲットとスクリプトを比較するのではなく、ターゲットとスクリプトを比較します。

env.Command(target = "#targetdir/file0",
            source = "#somescript.sh",
            action = "#somescript.sh $TARGET")

パスに「#」を使用していることに注意してください。これは、ルート SConsctruct からの相対を意味します。

于 2012-09-07T09:44:37.390 に答える