回答:
makefileの外部から変数を設定するには、いくつかのオプションがあります。
環境から -各環境変数は、同じ名前と値を持つmakefile変数に変換されます。
-e
オプション(別名--environments-override
)をオンに設定することもできます。環境変数はmakefileへの割り当てをオーバーライドします(これらの割り当て自体がoverride
ディレクティブを使用している場合を除く)。ただし、これはお勧めできません。?=
割り当て(条件変数代入演算子。変数がまだ定義されていない場合にのみ効果があります):
FOO?=default_value_if_not_set_in_environment
特定の変数は環境から継承されないことに注意してください:
MAKE
スクリプトの名前から取得されますSHELL
makefile内で設定されるか、デフォルトに設定されます/bin/sh
(根拠:コマンドはmakefile内で指定され、それらはシェル固有です)。コマンドラインから - コマンドラインのmake
一部として変数割り当てを受け取り、ターゲットと混在させることができます。
make target FOO=bar
ただし、ディレクティブを割り当てで使用しない限り、メイクファイル内の変数へのすべての割り当てFOO
は無視されます。(効果は、環境変数のオプションの場合と同じです)。override
-e
親Makeからのエクスポート-MakefileからMakeを呼び出す場合は、通常、次のように明示的に変数の割り当てを記述しないでください。
# Don't do this!
target:
$(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS)
代わりに、これらの変数をエクスポートすることをお勧めします。変数をエクスポートすると、すべてのシェル呼び出しの環境になります。これらのコマンドからのMake呼び出しは、上記のようにこれらの環境変数を選択します。
# Do like this
CFLAGS=-g
export CFLAGS
target:
$(MAKE) -C target
引数なしで使用して、すべての変数をエクスポートすることもできexport
ます。
export PROJECT_MAKE_ARGS = CC=$(CC) CFLAGS=$(CFLAGS)
として、それをとして定義して渡すこともできmake -C folder $(PROJECT_MAKE_FLAGS)
ます。ライブラリのmakefileに環境を無視するように指示する方法がある場合、それは理想的です(-eの反対)。
make target FOO=bar
make FOO=bar target
?
最も簡単な方法は次のとおりです。
make foo=bar target
その後、メイクファイルでを参照できます$(foo)
。これはサブメイクに自動的に伝播しないことに注意してください。
サブメイクを使用している場合は、この記事を参照してください:サブメイクへの変数の通信
included
は、メインのメイクファイルのメイクファイルを意味しますか?
次のようなmakefileがあるとします。
action:
echo argument is $(argument)
あなたはそれを呼び出すでしょう make action argument=something
マニュアルから:
makeの変数は、makeが実行されている環境から取得できます。makeが起動時に参照するすべての環境変数は、同じ名前と値を持つmake変数に変換されます。ただし、makefileでの明示的な割り当て、またはコマンド引数による指定は、環境をオーバーライドします。
だからあなたは(bashから)することができます:
FOOBAR=1 make
FOOBAR
Makefileに変数が生成されます。
StallmanとMcGrathによるGNU Makeブックに含まれている、ここで引用されていない別のオプションがあります(http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.htmlを参照)。それは例を提供します:
archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif
特定のパラメータがに表示されるかどうかを確認する必要がありますMAKEFLAGS
。たとえば、c ++ 11のスレッドについて研究していて、研究を複数のファイル(class01
、...、classNM
)に分割していて、次のことを実行したいとします。すべてをコンパイルして個別に実行するか、1つずつコンパイルする時間を設定し、フラグが指定されている場合は実行します(-r
たとえば)。したがって、次のことを考え出すことができますMakefile
。
CXX=clang++-3.5
CXXFLAGS = -Wall -Werror -std=c++11
LDLIBS = -lpthread
SOURCES = class01 class02 class03
%: %.cxx
$(CXX) $(CXXFLAGS) -o $@.out $^ $(LDLIBS)
ifneq (,$(findstring r, $(MAKEFLAGS)))
./$@.out
endif
all: $(SOURCES)
.PHONY: clean
clean:
find . -name "*.out" -delete
それがあれば、あなたは:
make -r class02
含むファイルをビルドして実行します。make
またはmake all
;make -r
(それらのすべてに特定の種類のアサートスタッフが含まれていて、それらすべてをテストしたいとします)
make A='"as df"'