私はMakeを取り巻くラッパーに過ぎないシンプルなビルドシステムを実装しています。このビルドシステムはすでに独自のエラーメッセージを表示しているため、Makeがこのようなエラーメッセージを生成したくありません。
make: *** [/cool/makefile:116: /fun/target.o] Error 1
失敗したとき。
私は-s
Makeのほとんどの出力を抑制するためにこのフラグを使用しました。私はMakeがエラーを無視したくありません。私はまだそれを停止し、状態で終了したいと思います。実行中のMakeジョブによって印刷されたメッセージをmake 2> /dev/null
見続けたいので、すべてのエラー出力を終了することはできません。stderr
Make出力を手動で解析して整理せずにこれを行う方法はありますか?私はGNU Make 4.2.1を使用しており、GNU Make専用のソリューションは気に入らない。
答え1
あなたのシステムはmake用のラッパーなので、makefileを生成するとします。2>&3
makefileにすべてのシェルコマンドを追加するようにジェネレータを調整し、プログラムがファイルディスクリプタ3を標準エラー(ファイルディスクリプタ2)にリダイレクトし、ファイルディスクリプタ2を/dev/null
。 itに追加する/dev/null
と、ビルドコマンドはラッパーの標準エラーに移動する標準エラーとして印刷されます。
手書きのmakefileを使用している場合、makefileの構文があまりにも混乱しない場合(たとえば、コマンドを生成する素晴らしいGNU makeマクロがない場合)、これらのリダイレクトを追加するように変換できます。タブとオプション、またはで@
始まり-
、前の行がバックスラッシュで終わらない各行の場合は、exec 2>&3;
タブと選択の後に追加します@-
。
makefileを変更する代わりに、引数を使用して呼び出すことができます。その後、SHELL=/path/to/shell_wrapper
引数shell_wrapper
を実行し、標準エラーを次のように別の記述子にリダイレクトします。
#!/bin/sh
eval "$2" 2>&3