あなたはSConsの内部の「ウサギの穴」にあなたを非常に速く導く角度から問題に近づいています。
SConsはあなたのログファイルについて知らないので、教えてください。何らかの形で、SConsが知っているように、ビルドステップを特別なものとしてマーク(またはタグ)する必要があります。「ああ、foo.o
をfoo.cpp
から作成するには...後でfoo.log
があります。それについて。"
SideEffect()
とClean()
があります(UserGuideとMAN pageを参照)。前者は、いくつかのビルド・ステップが特別な(ログ)ファイルに書き込むが、すべて同じファイル名を使用するように特に設計されています。 SConsが "-j
"オプションで呼び出されても、単一のビルドステップをシーケンスで実行する必要があります。 あなたは、これは現在、あなたのためのケースであるかどうかについての更なる情報を与えられていないが、私はSideEffectはあなたの問題を解決するために、すべてで必要とされていないので、それは...ないと仮定します。
./runme.sh
==========
#!/bin/sh
cp $1 $2
echo "Hi there" >> out.log
./SConstruct
============
env = Environment()
t = env.Command('out.txt', 'in.txt', './runme.sh $SOURCE $TARGET')
env.Clean(t, 'out.log')
追加することでClean()
の仕様では、実際のターゲットout.txt
がを削除した場合にout.log
ファイルを削除する必要があることをSConsは承知しています。。 コンパイルコマンドごとにこれを行うのが面倒なことが判明した場合は、小さなPythonラッパーメソッドを記述するか、独自の「疑似ビルダー」を記述することもできます。後者の詳細とガイドラインについては、ToolsForFools Guideをご覧ください。 はい、明示的に "scons -c
"ログファイルとすべてのターゲットのクリーンアップを呼び出す必要があります... SConsは自動的にログファイルを各リビルドで削除しません。欲しいです。あなた(または他のユーザ)はいくつかのビルドからのログ出力を連結したいかもしれないので、SConsはどのように知っていますか?
あなたが実際に尋ねた質問にもう少し詳しく述べると、SConsが知っていることは、ターゲットとソースファイルがあることです。ソースファイルが変更された(最新ではない)か、ターゲットがまだ存在しない場合、ターゲットをビルドするために実行できるアクションのリストが分かります。これは、単一の文字列、Python関数、またはそれらを組み合わせたリストです。しかし、SConsがそれらの単一のアクションが何であるかを調べようとするセマンティック分析は続けられません。。実行可能ファイル "gcc
"はコンパイルのステップでなければならないため、 "推測"しようとすると、あまりにも簡単なアプローチです。コンパイラに任意の名前のリンクを使用するとどうなりますか?さまざまな目的のために異なるコンパイラ名の巨大なツリーにまたがるクロスコンパイルはどうですか? Insure ++のようなパフォーマンス分析とメモリチェックツールはどうですか?ここで "insure gcc
"と呼ぶ必要がありますか? 最後に、は、私があなたに与えたコマンドラインだけを見ることができるとき、 "コンパイル"を定義しますか? ;)