コマンドライン引数として変数をGNU Makefileに渡すことはできますか?言い換えれば、私は最終的にMakefileの変数になるいくつかの引数を渡したいと思います。
メイクファイルの外部から変数を設定する方法はいくつかあります。
From environment - 各環境変数は、同じ名前と値を持つmakefile変数に変換されます。
また、-e
オプション(別名--environments-override
)を設定すると、環境変数がmakefileへの割り当てを上書きします(これらの割り当て自体が override
ディレクティブ を使用している場合を除く)。ただし、お勧めできません。 ?=
代入を使用する(条件付き変数代入演算子、変数がまだ定義されていない場合にのみ効果があります)。
FOO?=default_value_if_not_set_in_environment
特定の変数は環境から継承されません。
MAKE
はスクリプトの名前から得られますShell
は、メイクファイル内で設定されるか、デフォルトで/bin/sh
に設定されます(根拠:コマンドはメイクファイル内で指定され、それらはシェル固有です)。 コマンドラインから - make
は、ターゲットと混在して、彼のコマンドラインの一部として変数の割り当てを取ることができます。
make target FOO=bar
しかし、makefile内の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
を使用してall変数をエクスポートすることもできます。
最も簡単な方法は次のとおりです。
make foo=bar target
それから、あなたのメイクファイルであなたは$(foo)
を参照することができます。これはsub-makeに自動的には反映されません。
サブメイクを使用している場合は、この記事を参照してください。 サブメイクへの変数の伝達
次のようなメイクファイルがあるとします。
action:
echo argument is $(argument)
あなたはそれをmake action argument=something
と呼ぶでしょう
マニュアルから :
Make内の変数は、makeが実行されている環境から取得できます。起動時にmakeが見るすべての環境変数は、同じ名前と値を持つmake変数に変換されます。ただし、makefile内での明示的な代入、またはコマンド引数を使用した明示的な代入は、環境を無効にします。
だから(bashから)することができます:
FOOBAR=1 make
あなたのMakefileには変数FOOBAR
が入ります。
StallmanとMcGrathによるGNU Make bookに含まれていない、ここで引用されていない別のオプションがあります( 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
)に分割したとします。フラグが指定されている場合は一度に実行し、実行してください(たとえば-r
)。だから、あなたは次のMakefile
を思い付くことができます:
CXX=clang++-3.5
CXXFLAGS = -Wall -Werror -std=c++11
LDLIBS = -lpthread
SOURCES = class01 class02 class03
%: %.cxx
$(CXX) $(CXXFLAGS) -o [email protected] $^ $(LDLIBS)
ifneq (,$(findstring r, $(MAKEFLAGS)))
./[email protected]
endif
all: $(SOURCES)
.PHONY: clean
clean:
find . -name "*.out" -delete
それがあれば、
make -r class02
付きのファイルをビルドして実行します。make
またはmake all
を使用してビルドします。make -r
をビルドして実行します(それらのすべてに特定の種類のassert要素が含まれていて、それらすべてをテストしたいとします)。Makefileという名前のファイルを作成してこの$(unittest)のような変数を追加すると、ワイルドカードを使用してもMakefile内でこの変数を使用できます。
例:
make unittest=*
BOOST_TESTを使用し、パラメータ--run_test = $(unittest)にワイルドカードを指定すると、正規表現を使用してテストを除外することができます。Makefileに実行させます。
export ROOT_DIR=<path/value>
その後、Makefileで変数$(ROOT_DIR)
を使用します。