2009-05-06 9 views
4

sconsのコマンドビルダーを使用して、特定のスクリプトを特定のファイルを生成するために呼び出す必要があることを指定しています。依存関係が変更された場合にのみSConsコマンドビルダが実行されるように制約する方法を教えてください。

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

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

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

答えて

11

まず、code/speed.pyのように見えるs出力ファイル名の制御なし...ハードコードされた出力ファイル名は通常、sconsの悪い習慣とみなされます(yaccツール参照)。 PDFのターゲットはreport.texからreport.pdfを生成し、

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

:それはこのように優れて読んでいました。私は、report.texからspeed_analysis.texへの暗黙的な依存関係があると推測しています(Texのincludeやそのようなものを通して)。

この

Depends(report, speed) 

はそれが欠けている場合は、その依存関係を表現するために正しいです。私はあなたが使用してDEPツリーを検証する必要があります...

PDFビルダーのためのスキャナはその暗黙の依存関係を見ていない驚いているものの:

scons --tree=all 

それは次のようになります。

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

今、スクリプト(speed.py)が常に実行中であることについての質問に答えるには、入力がないためです。スコオンがチェックすることはありません。そのスクリプトファイルは、何かを入力としていなければなりません。次の実行を短絡させるためのすべての直接的および暗黙的な依存関係について、sconsに伝える必要があります。

Command('speed_analysis.tex', 'code/speed.py', 'python $SOURCE -o $TARGET') 
1

たぶん、あなたの例は不完全ですが、あなたは行うことになっていません。私はあなたが第二として、あなたの依存関係を指定する必要があると思う

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

をコマンドへの引数:

関連する問題