web-dev-qa-db-ja.com

Make-他の出力を抑制せずにmakeエラーメッセージを抑制する方法

私は、実際にはMakeの単なるラッパーである単純なビルドシステムを実装しています。このビルドシステムはすでに独自のエラーメッセージを発行しているため、Makeに次のようなエラーメッセージを生成させたくありません。

make: *** [/cool/makefile:116: /fun/target.o] Error 1

失敗したとき。

私はすでに-sフラグを使用して、Makeの出力のほとんどを抑制しています。そして、Makeにエラーを無視させたくありません。それでも停止して、ステータスで終了したい。 Makeが実行しているタスクによってstderrに出力されたメッセージを引き続き表示したいので、make 2> /dev/nullですべてのエラー出力を強制終了することはできません。

Makeの出力を手動で解析およびサニタイズせずにこれを行う方法はありますか?私はGNU Make 4.2.1を使用していますが、GNU Make-specific solution。

3
Sam Marinelli

あなたのシステムはmakeのラッパーなので、makefileを生成すると思います。ジェネレーターを微調整して、メイクファイル内のすべてのシェルコマンドに2>&3を追加し、プログラムがファイル記述子3を標準エラー(ファイル記述子2)にリダイレクトし、ファイル記述子2を/dev/nullにリダイレクトするようにします。このようにして、makeプログラム自体が/dev/nullに送られる標準エラーに出力され、buildコマンドがラッパーの標準エラーに送られる標準エラーに出力されます。

手書きのメイクファイルを使用している場合は、メイクファイルが構文で乱暴になりすぎないことを前提として、それを変換してリダイレクトを追加できます(たとえば、コマンドを生成するマクロを作成するGNU make macros)。タブとオプションで@または-で始まり、前の行が円記号で終わらないすべての行について、タブとオプションのexec 2>&3;の後に@-を追加します。 。

Makefileを変更する代わりに、引数Shell=/path/to/Shell_wrapperを使用して呼び出すことができます。ここで、Shell_wrapperは、次のような別の記述子にリダイレクトされる標準エラーで引数を実行します。

#!/bin/sh
eval "$2" 2>&3