GNU-make Makefileを使用して、複数のターゲット(all
、clean
、およびいくつかのプロジェクト固有のターゲット)を含むCプロジェクトをビルドしています。デバッグのプロセスでは、Makefileを永続的に編集せずに、単一のビルドにいくつかのフラグを追加します(デバッグシンボルの追加やプリプロセッサフラグの設定など)。
過去に、私はそれを次のように行いました(デバッグシンボルの例を使用):
make target CFLAGS+=-g
残念ながら、これはCFLAGS
変数に追加するのではなく、代わりにクリアしてコンパイルを停止します。 CFLAGS
とLDFLAGS
の最後に追加される何らかのダミー変数を定義せずにこれを行うクリーンな方法はありますか?
オーバーライドディレクティブ を確認してください。おそらくmakefileを一度変更する必要がありますが、必要なことを行う必要があります。
メイクファイルの例:
override CFLAGS += -Wall
app: main.c
gcc $(CFLAGS) -o app main.c
コマンドラインの例:
$ make
gcc -Wall -o app main.c
$ make CFLAGS=-g
gcc -g -Wall -o app main.c
レコードについては、@ Carl Norumの回答prependsコマンドラインの観点からの変数。
私は実際に追加する方法が必要で、思いつきました:
override CFLAGS := -Wall $(CFLAGS)
Makeに変数を渡すには2つの方法があります。
コマンドライン引数を使用する:
make VAR=value
使用環境:
export VAR=var; make
または(現在のコマンドの環境のみを変更するため、より良い)
VAR=var make
それらはわずかに異なります。最初のものはより強力です。それはあなたが望むものを知っていることを意味します。 2番目はヒントのように考えられます。それらの違いは演算子についてです=
および+=
(override
なし)。これらの演算子は、変数がコマンドラインで定義されている場合は無視されますが、環境で変数が定義されている場合は無視されません。したがって、Makefileに次のものを含めることをお勧めします。
CC ?= gcc
CFLAGS += -Wall
INTERNAL_VARS = value
そしてそれを次のように呼び出します:
CFLAGS=-g make
-Wall
、次を使用できます。
make CFLAGS=
override
キーワードを使用しないでください。使用すると、override
の影響を受ける変数を変更する方法がなくなります。
ちょっと注意してください、私が混乱したので、これをファイルtestmake
としましょう:
$(eval $(info A: CFLAGS here is $(CFLAGS)))
override CFLAGS += -B
$(eval $(info B: CFLAGS here is $(CFLAGS)))
CFLAGS += -C
$(eval $(info C: CFLAGS here is $(CFLAGS)))
override CFLAGS += -D
$(eval $(info D: CFLAGS here is $(CFLAGS)))
CFLAGS += -E
$(eval $(info E: CFLAGS here is $(CFLAGS)))
次に:
$ make -f testmake
A: CFLAGS here is
B: CFLAGS here is -B
C: CFLAGS here is -B
D: CFLAGS here is -B -D
E: CFLAGS here is -B -D
make: *** No targets. Stop.
$ make -f testmake CFLAGS+=-g
A: CFLAGS here is -g
B: CFLAGS here is -g -B
C: CFLAGS here is -g -B
D: CFLAGS here is -g -B -D
E: CFLAGS here is -g -B -D
make: *** No targets. Stop.
override
ディレクティブをtestmake
ファイルから削除すると:
$ make -f testmake
A: CFLAGS here is
B: CFLAGS here is -B
C: CFLAGS here is -B -C
D: CFLAGS here is -B -C -D
E: CFLAGS here is -B -C -D -E
make: *** No targets. Stop.
$ make -f testmake CFLAGS+=-g
A: CFLAGS here is -g
B: CFLAGS here is -g
C: CFLAGS here is -g
D: CFLAGS here is -g
E: CFLAGS here is -g
make: *** No targets. Stop.
そう、
override
を1回使用した場合、override
を含む別のステートメントでのみ追加できます(通常の割り当ては無視されます)。override
がまったくなかったとき。追加しようとしている(+=
)コマンドラインからは、その変数のすべてのインスタンスが上書きされます。