6

私はSConsを使用して作業中のプロジェクトをビルドしています。GCC からのテキスト出力を解析して、各ターゲットのすべてのコンパイラ警告の概要レポートを作成しようとしています。これは、ビルド スクリプトが非常に長いためです。コンソールへの大量のテキスト出力。

Google とこのサイトをかなり長い間検索してきましたが、これを達成するために SCons に組み込まれている方法が見つかりません。この例に従って、stdout および stderr ストリーム全体をファイルにリダイレクトしようとしましたが、SCons 自体からの出力のみがキャプチャされ、それが呼び出すツールの出力はキャプチャされません。

次に考えたのは、SCons が引数をコンパイルして GCC に送信する場所を見つけ、引数文字列の末尾にリダイレクトを追加することでした。ドキュメントを読んだ後、構築変数CCCOMCXXCOMコンパイルに使用されるコマンドラインが含まれているようです。ただし、以下の行を SConstruct に追加しても、SCons が実行しているコマンド ラインは何も変更されていません。

baseEnv['CCCOM'] += " 2> gcc-c-output.txt"
baseEnv['CXXCOM'] += " 2> gcc-cxx-output.txt"

うまくいったことの 1 つは、SCons コマンド全体で stderr ストリームをリダイレクトすることでした。

scons 2> stderr.txt

ただし、これは避けたいと思います。可能であれば、SCons 内にすべてを含めます。また、必ずしもファイルに出力する必要はありません。ビルドの最後に解析してファイルに保存するためにアクセスできる限り、どこにでも保存できます。

私は長い間検索して何も思いつかなかったので、他に何を試すべきかわかりません。このようなことをしたいと思ったのは私が初めてではないと信じなければなりません。

4

5 に答える 5

5

何が間違っていたのかがわかったので、ここで自分の質問に答えます。CCCOMおよびCXXCOM変数は修正するのに適切なものでしたが、問題は共有ライブラリ オブジェクトを作成していたため、これらの変数が使用されていなかったことです。私が修正すべきだったのはSHCCCOMSHCXXCOMです。

次のコードは、GCC 警告出力をリダイレクトするジョブを実行します (警告とエラーは stderr のみに書き込まれます)。

baseEnv['SHCCCOM'] += " 2> gcc-c-output.txt"
baseEnv['SHCXXCOM'] += " 2> gcc-cxx-output.txt"

検索時にこのトピックに関する多くの情報を見つけることができなかったので、この回答が他の人に役立つことを願っています.

于 2012-06-21T21:42:41.510 に答える
3

env['SPAWN']完全に制御するには、コンストラクション変数をオーバーライドできます。次に、引数で指定されたコマンド ラインを実行する Python メソッドを指定します。通常、この引数を使用してサブプロセスを生成します (何らかの形式の を使用subprocess.Popen)。これにより、デフォルトのパススルー置換が作成されますenv['SPAWN']

しかし今では、subprocess.Popen呼び出しを完全に制御できます。またはその両方を任意のバッファ/ファイルにSTDOUT自由にリダイレクトできます。STDERRコンソールに出力したり、ファイルに保存したりする前に、その出力に対して後処理を行うこともできます。たとえば、これを使用して、警告を黄色で、エラーを赤で色付けしました。

をオーバーライドする方法のサンプル コードについては、SCons Wiki のこのページenv['SPAWN']を参照してください。

于 2012-07-18T18:44:06.837 に答える
0

CCCOMおよび構築変数の代わりに、およびCXXCOM変数を試しましたか? 念のため、SCons 構築変数の完全なリストを次に示しますCCCXX

内部でリダイレクトを行うシステム上のスクリプトをCC設定することを検討することもできます。CXX

編集:変数CCCOMCXXCOM変数は、すべてのCFlagsなどを含むソースファイルを実際にコンパイルするために使用されるコマンドであることを忘れていました。読み取り専用変数だと思っていたので、それらを設定できたことに驚いています。

于 2012-06-21T13:51:36.663 に答える
0

どうですか:

baseEnv['SHCCCOM'] += " 2> ${SOURCE}gcc-c-output.txt"
baseEnv['SHCXXCOM'] += " 2> ${SOURCE}gcc-cxx-output.txt"

これにより、ソース ファイルごとに個別のファイルが作成されます。

于 2015-07-29T18:09:31.130 に答える