70

私はGNU-makeMakefileを使用して、いくつかのターゲット(、、およびいくつかのプロジェクト固有のターゲット)を持つCプロジェクトを構築していallますclean。デバッグの過程で、Makefileを永続的に編集せずに、単一のビルドにいくつかのフラグを追加したいと思います(たとえば、デバッグシンボルを追加したり、プリプロセッサフ​​ラグを設定したりします)。

過去に、私は次のようにそれを行いました(デバッグシンボルの例を使用):

make target CFLAGS+=-g

残念ながら、これはCFLAGS変数に追加するのではなく、変数をクリアしてコンパイルを停止します。との末尾に追加されたある種のダミー変数を定義せずにこれを行うクリーンな方法はCFLAGSありLDFLAGSますか?

4

4 に答える 4

92

オーバーライドディレクティブを確認してください。おそらくmakefileを一度変更する必要がありますが、それはあなたが望むことをするはずです。

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 
于 2010-01-24T23:37:42.283 に答える
31

記録のために、@ Carl Norumの回答は、コマンドラインの観点から変数の前に追加されます。

私は実際に追加する方法が必要で、次のことを思いつきました。

override CFLAGS := -Wall $(CFLAGS)
于 2012-02-27T12:47:22.307 に答える
23

作成する変数を渡す方法は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

于 2015-09-21T13:26:09.977 に答える
7

私が混乱したので、ちょっと注意してください-これをファイルにしましょう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一度使用された場合、それは別のステートメントでのみ追加できますoverride(通常の割り当ては無視されます)。
  • まったくなかったときoverride+=コマンドラインから(のように)追加しようとすると、その変数のすべてのインスタンスが上書きされます。
于 2013-04-17T04:06:12.597 に答える