4

scons でコマンド ビルダーを使用して、特定のファイルを生成するために特定のスクリプトを呼び出す必要があることを指定しています。

ファイルが以前に生成されてから変更された場合にのみ、スクリプトを実行したいと思います。コマンドビルダーのデフォルトの動作は、常にスクリプトを実行するようです。どうすればこれを変更できますか?

これは私の現在のSConstructです:

speed = Command('speed_analysis.tex','','python code/speed.py')
report = PDF(target = 'report.pdf', source = 'report.tex')
Depends(report, speed)
4

2 に答える 2

11

まず、code/speed.py出力ファイル名を制御できないようです...ハードコードされた出力ファイル名は、通常、sconsでは悪い習慣と見なされます(yaccツールを参照)。次のように読みやすくなります。

speed = Command('speed_analysis.tex', [], 'python code/speed.py -o $TARGET')

これで、PDFターゲットはreport.pdffromを生成しreport.texます。report.texからへの暗黙の依存speed_analysis.tex関係があると思います(Texインクルードなどを介して)。

これ:

Depends(report, speed)

依存関係が欠落している場合は、その依存関係を表現するのが正しいです。PDFビルダーのスキャナーがその暗黙の依存関係を認識していなかったことに驚いていますが...

以下を使用してdepツリーを検証する必要があります。

scons --tree=all

次のようになります。

+ report.pdf
  + report.tex
  + speed_analysis.tex
    + code/speed.py
    + /usr/bin/python
  + /usr/bin/pdflatex

さて、スクリプト()が常に実行されているという質問に答えるのspeed.pyは、入力がないためです。sconsがチェックするものは何もありません。そのスクリプトファイルは、pyファイル自体のみの場合、入力として何かを読み取っている必要があります。後続の実行を短絡させるには、すべての直接および暗黙の依存関係についてsconsに通知する必要があります。

Command('speed_analysis.tex', 'code/speed.py', 'python $SOURCE -o $TARGET')
于 2010-03-25T03:43:09.080 に答える
1

あなたの例は不完全かもしれませんが、そうすべきではありません:

env = Environment()
env.Command(....

Command の 2 番目の引数として依存関係を指定する必要があると思います。

Command('speed_analysis.tex','code/speed.py','python code/speed.py')
于 2009-05-06T15:07:13.650 に答える