6

コンパイラからの出力を解析し、使用する IDE (ビジュアル スタジオ) が解析できるようにエラー メッセージを再フォーマットする簡単なプログラムを作成しています。nmakeビルドに使用すると、次のようなコマンド ラインを使用してコンパイラが呼び出されます。

cc166.exe SOME_FLAGS_HERE MyCFile.c 2>&1 | TaskingVXToVisualReformat.exe

問題は、コンパイラの戻りコード が にcc166フィードバックされないことnmakeです。リフォーマッタのリターン コードのみが使用されます。つまり、リフォーマット プログラムからゼロが返された場合、nmake は中止せずにビルドを続行します。cc166.exeコンパイラ ( )から にリターン コードをフィードバックするにはどうすればよいnmakeですか?

再フォーマット プログラムがコンパイラのリターン コードを読み取り、それを使用して独自のリターン コードを決定する方法はありますか? リフォーマッタは C# で書かれています。

4

2 に答える 2

2

コンパイル手順を bash スクリプトに入れ、パイプフェイル機能を利用します。

パイプラインの終了ステータスは、pipefail オプションが有効になっていない限り、パイプラインの最後のコマンドの終了ステータスです。pipefail が有効になっている場合、パイプラインの戻りステータスは、最後 (右端) のコマンドがゼロ以外のステータスで終了するか、すべてのコマンドが正常に終了した場合はゼロになります。

簡単なテストで試してみましょう。

$ cat bash_pipe.sh
#!/bin/bash
set -o pipefail
ls $1 2>&1 | perl -ne '{print;}'

既存のファイルで実行すると、終了コードは 0 になります (パイプを介して渡されます)。

$ ./bash_pipe.sh bash_pipe.sh 
bash_pipe.sh
$ echo $?
0

反対側では、コマンドは存在しないファイルで失敗します。

./bash_pipe.sh inexistent
ls: cannot access inexistent: No such file or directory
echo $?
2

したがって、あなたの場合、コンパイル手順を次のようなスクリプトに入れる必要があります

$ cat compilation_script.sh
#!/bin/bash
set -o pipefail
cc166.exe SOME_FLAGS_HERE $1 2>&1 | TaskingVXToVisualReformat.exe

直接(可能であれば)または間接的に呼び出す

bash -c "compilation_script.sh MyCFile.c"

注: pipefail オプションは、bash バージョン 3 で導入されました。

于 2014-11-17T15:30:28.507 に答える
0

1 つのコマンドを 2 つに分割し、コンパイル結果を一時ファイルに保持できます。

cc166.exe SOME_FLAGS_HERE MyCFile.c > CCRESULT.TXT 2>&1
if not errorlevel 1 TaskingVXToVisualReformat.exe < CCRESULT.TXT
于 2011-05-09T11:23:42.103 に答える