変数をコマンド ライン引数として GNU Makefile に渡すことはできますか? つまり、最終的に Makefile の変数になるいくつかの引数を渡したいということです。
8 に答える
makefile の外部から変数を設定するには、いくつかのオプションがあります。
環境から- 各環境変数は、同じ名前と値を持つメイクファイル変数に変換されます。
-e
オプション (aka ) をオンに設定することもでき--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
最も簡単な方法は次のとおりです。
make foo=bar target
次に、メイクファイルで を参照できます$(foo)
。これは自動的にサブメイクに反映されないことに注意してください。
サブ makeを使用している場合は、次の記事を参照してください:サブ make への変数の伝達
次のようなメイクファイルがあるとします。
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
(それらすべてに特定の種類のアサート要素が含まれており、それらすべてをテストしたいだけだとします)
Makefile というファイルを作成し、この $(unittest) のような変数を追加すると、ワイルドカードを使用しても Makefile 内でこの変数を使用できるようになります。
例 :
make unittest=*
BOOST_TEST を使用し、パラメーター --run_test=$(unittest) にワイルドカードを指定すると、正規表現を使用して Makefile を実行するテストを除外できます
export ROOT_DIR=<path/value>
$(ROOT_DIR)
次に、Makefile で変数を使用します。