web-dev-qa-db-ja.com

GNUコマンドライン経由で変数を作成する

GNU-make Makefileを使用して、複数のターゲット(allclean、およびいくつかのプロジェクト固有のターゲット)を含むCプロジェクトをビルドしています。デバッグのプロセスでは、Makefileを永続的に編集せずに、単一のビルドにいくつかのフラグを追加します(デバッグシンボルの追加やプリプロセッサフ​​ラグの設定など)。

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

make target CFLAGS+=-g

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

57
Michael Koval

オーバーライドディレクティブ を確認してください。おそらく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 
79
Carl Norum

レコードについては、@ Carl Norumの回答prependsコマンドラインの観点からの変数。

私は実際に追加する方法が必要で、思いつきました:

override CFLAGS := -Wall $(CFLAGS)
26
aib

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の影響を受ける変数を変更する方法がなくなります。

16
Jezz

ちょっと注意してください、私が混乱したので、これをファイル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がまったくなかったとき。追加しようとしている(+=)コマンドラインからは、その変数のすべてのインスタンスが上書きされます。
6
sdaau