2016-09-13 11 views
0

コンパイル時に生成されたいくつかのログファイルを処理する必要があります。SConsで再構築した後にコンパイルされるファイルオブジェクトを取得するには?

一部のコンパイラは以前のビルドで作成されたログにエラーを追加するため、そのファイルが再度コンパイルされる場合は、前のビルドで生成されたエラーログファイルを削除する必要があります。

再構築中にコンパイルされるFileオブジェクトのリストが必要です。現在、ビルダーはコンパイルするすべてのファイルを戻します。

SConsでこれを達成することは可能でしょうか?

答えて

2

あなたはSConsの内部の「ウサギの穴」にあなたを非常に速く導く角度から問題に近づいています。

SConsはあなたのログファイルについて知らないので、教えてください。何らかの形で、SConsが知っているように、ビルドステップを特別なものとしてマーク(またはタグ)する必要があります。「ああ、foo.ofoo.cppから作成するには...後でfoo.logがあります。それについて。"

SideEffect()Clean()があります(UserGuideMAN 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"と呼ぶ必要がありますか? 最後に、は、私があなたに与えたコマンドラインだけを見ることができるとき、 "コンパイル"を定義しますか? ;)

関連する問題