3

-Werror フラグをオーバーライドする簡単な方法への応答に少し混乱しましたか?

そこで、ここで具体的な質問をします。

複数の Makefile を一緒に使用しており、途中で CFLAGS が設定されています (-Werror -Wall .. など)。

しかし、Makefile の 1 つで、エラーが警告として扱われないようにしたいので、-Werror フラグを削除したいと思います。

これを達成するための最良の方法は何でしょうか?この Makefile だけで -Werror フラグが削除され、他のものでは通常の実行が行われますか?

ありがとう、サニー

4

3 に答える 3

5

これを行う正しい方法は、filter-out関数を使用することです。

置く

CFLAGS := $(filter-out -Werror,$(CFLAGS))

これをオーバーライドしたい Makefile で、その Makefile で の-Werror一部CFLAGSが削除されます。

ターゲット固有の変数値を使用して、これを使用して単一のターゲットのフラグをオーバーライドすることもできます。

CFLAGS = -Werror

all: foo bar

foo:
        echo cc $(CFLAGS) -o $@

bar: CFLAGS := $(filter-out -Werror,$(CFLAGS))

bar:
        echo cc $(CFLAGS) -o $@

fooCFLAGSを含むデフォルトでビルドされますが-Werrorbarなしでビルドされます。

--no-fooこれは、各プログラムがfor every--fooオプションを指定する必要がなく、すべてのプログラムのすべての引数に対して機能する汎用ソリューションです。Makeコマンドラインから実行できないため、リンク先の質問に直接回答しません。しかし、コマンドラインから Make 変数をオーバーライドしてビルドを強制することは、ビルドできないコードをさらに保守しにくくするかなり良い方法です!

于 2013-06-26T16:48:07.477 に答える
4

より簡単な方法

召喚できるらしい

gcc -c ... -Werror ... -Wno-error ...

GCCに文句を言わせることなく(GCC 4.7.1)。-Wno-errorそのため、1 つの makefile の必要な場所に CFLAGS の設定を追加することができます。GNU を使用している場合makeは、1 つの makefile に次を追加できます。

CFLAGS += -Wno-error

おそらくそれを必要とする単一のターゲットのためだけです。

難しい方法

それ以外の場合は、コンポーネントから CFLAGS を構築するためのシステムが必要です。SOに関する質問への回答をテストするために使用するメイクファイルにあるものは次のとおりです。

WFLAG1 = -Wall 
WFLAG2 = -Wextra
WFLAG3 = -Wmissing-prototypes 
WFLAG4 = -Wstrict-prototypes 
WFLAG5 = -Wold-style-definition
WFLAG6 =
WFLAGS = ${WFLAG1} ${WFLAG2} ${WFLAG3} ${WFLAG4} ${WFLAG5} ${WFLAG6} 
SFLAGS = -std=c99
GFLAGS = -g
OFLAGS = -O3
UFLAGS =
IFLAG1 = -I${HOME}/inc
IFLAGS = # ${IFLAG1}

CFLAGS   = ${OFLAGS} ${GFLAGS} ${IFLAGS} ${SFLAGS} ${WFLAGS} ${UFLAGS}

主なポイントは、各フラグが個別に調整できることです。${WFLAG1}のいずれかをに設定するか、コマンド ラインで卸売を${WFLAG6}設定するか、(実際に) を設定することで、警告フラグを制御できます。ただし、それぞれが個別に調整可能であり、警告を比較的簡単に調整できるためです (主な問題は、どの WFLAGn を上書きする必要があるかを判断することです)。${WFLAGS}${CFLAGS}

UFLAGS は「ユーザー フラグ」であり、コマンド ラインでのみ設定されます。フラグを設定することで、コマンド ラインにフラグを追加できます。

CFLAGS を設定する makefile システムの中心部分を変更する必要があるため、この方法は「より困難」です。また、同僚に一目で理解される可能性も低くなります。

于 2013-06-26T15:35:17.190 に答える