0

一部のコンパイラでは、警告をエラーとして設定できます。これにより、コンパイラの警告を残さないようにすることができます。これを行うと、コードがビルドされないためです。これは良いことです。

残念ながら、一部のコンパイラにはwarnings-as-errors のフラグがありません。

この機能を提供するシェル スクリプトまたはラッパーを作成する必要があります。

おそらく、コンパイル コンソールの出力を解析し、コンパイラの警告 (またはエラー) があった場合は失敗を返し、それ以外の場合は成功を返します。「失敗」とは、オブジェクト コードを生成してはならない (と私は思う) ことも意味します。

上記の明示的な要件と、それ以外の場合はコンパイラと同じように動作するという次の暗黙の要件を満たす、記述できる最も短くて単純な UNIX/Linux シェル スクリプトは何ですか: - すべてのフラグ、オプション、引数を受け入れます - stdout と stderr のリダイレクトをサポートします- 指示どおりにオブジェクト コードとリンクを作成する

キーワード: エレガントで、すべての要件を満たしています。

おまけ: GNU make ファイルに簡単に組み込むことができます。

ご協力いただきありがとうございます。

=== 手がかり === 別の問題に対するこの解決策は、シェル関数 (?) を使用して bash の stderr リダイレクトにテキストを追加することで解決される可能性があります。私の質問?

===回答状況===

簡潔な回答をしてくれたCharlie Martinに感謝しますが、残念ながら、それは私が始めたものです。しばらく前にそれを使用し、オフィスで使用するためにリリースしましたが、数時間以内に最も重大な欠点が指摘されました。警告なしでコンパイルに合格しますが、エラーのみです。コンパイラが動作しないことが確実なオブジェクト コードを提供することになるため、これは非常に悪いことです。単純なソリューションは、リストされている他の要件も満たしていません。

Adam Rosenfieldの略記と、pipefailをソリューションに導入してくれたChris Doddに感謝します。Chris の答えは最も近いように見えます。パイプフェイルは、コンパイルが実際にエラーで失敗した場合に、必要に応じて失敗することを保証する必要があると思うからです。クリス、pipefail はすべてのシェルで機能しますか? 上記の暗黙の要件の残りについて何か考えはありますか?

4

5 に答える 5

1

make コマンドを、stdout ストリームと stderr ストリームを交換する「make」関数に置き換えるのはどうでしょうか。

# cf. http://codesnippets.joyent.com/posts/show/8769
unset -f make
function make() { 
   command make "${@}" 3>&2 2>&1 1>&3 3>&- | tee /dev/stderr | \
        grep -E -i --line-buffered 'error|warning' | \
        head -n 1 > stderr_make.log && { echo; return 1; }
   return 0 
}
于 2010-07-29T13:32:16.387 に答える
0

stdoutもログに記録できる「make」関数(Bash用)のさらに別のバージョンを次に示します。

# cf. http://wiki.bash-hackers.org/howto/redirection_tutorial
unset -f make
function make() {    # logs stdout & stderr
  { 
     { 
        command make "${@}" 3>&- | 
           tee stdout_make.log 2>&3 3>&- 
     } 2>&1 >&4 4>&- | 
        grep -E -i --line-buffered 'error|warning' 2>&3 3>&- | 
           head -n 1 > stderr_make.log && 
              { echo; cat stderr_make.log; echo; return 1; }
  } 3>&2 4>&1 

  return 0 
}
于 2010-07-30T09:37:56.557 に答える
0

これでうまくいくはずです:

$ if compile-command |& tee /dev/tty | grep -q 'Warning'; then false; else true; fi

この|&構文は の省略形です2>&1 |(つまり、 と の両方stdoutstderrパイプラインにリダイレクトします)。パイプtee /dev/ttyラインに配置すると、コンソールにコンパイラの出力が引き続き表示されることが保証され、パイプラインにパイプすると、grep -q 'Warning'警告が見つからない場合は終了ステータスが 1 になり、警告が見つかった場合は 0 になります。最後に、これを でラップするとif ...; then false; else true; fi、終了ステータスが逆になります。したがって、終了ステータスは、警告が見つからなかった場合 (成功) は 0 になり、警告が見つかった場合 (失敗) は 1 になります。

于 2009-04-20T21:51:06.867 に答える
0

うーん。

$ (コンパイルコマンド 2>&1 | grep '警告') && exit 1

これはあまり役に立ちませんが、「最短」を指定しました。もちろん、コンパイラに合わせて「警告」文字列を変更する必要があります。

より良いバージョンは、grep を介して出力をパイプし、警告を探し、フラグを設定することです。その後、フラグが設定されている場合は、見つかった警告に関するメッセージを出力し、リターン コードを 0 以外に設定して終了します。

于 2009-04-20T14:58:36.687 に答える
0

bash を使用している限り、次のようになります。

set -o pipefail; compile-command 2>&1 | if grep -q -i warning; then exit 1; fi

トリックを行う必要があります

于 2009-04-20T22:08:19.463 に答える