794

変数をコマンド ライン引数として GNU Makefile に渡すことはできますか? つまり、最終的に Makefile の変数になるいくつかの引数を渡したいということです。

4

8 に答える 8

900

makefile の外部から変数を設定するには、いくつかのオプションがあります。

  • 環境から- 各環境変数は、同じ名前と値を持つメイクファイル変数に変換されます。

    -eオプション (aka ) をオンに設定することもでき--environments-overrideます。環境変数は、makefile に作成された割り当てをオーバーライドします (これらの割り当て自体がoverrideディレクティブを使用しない限り)。ただし、これはお勧めできません。?=割り当て (条件変数代入演算子、変数がまだ定義されていない場合にのみ効果があります):

    FOO?=default_value_if_not_set_in_environment
    

    特定の変数は環境から継承されないことに注意してください。

    • MAKEスクリプトの名前から取得されます
    • SHELLmakefile 内で設定されるか、デフォルトで設定され/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

于 2010-05-13T10:57:02.183 に答える
310

最も簡単な方法は次のとおりです。

make foo=bar target

次に、メイクファイルで を参照できます$(foo)。これは自動的にサブメイクに反映されないことに注意してください。

サブ makeを使用している場合は、次の記事を参照してください:サブ make への変数の伝達

于 2010-05-13T10:38:10.037 に答える
128

次のようなメイクファイルがあるとします。

action:
    echo argument is $(argument)

あなたはそれを呼び出すでしょうmake action argument=something

于 2010-05-13T10:38:10.287 に答える
27

マニュアルから:

make の変数は、make が実行されている環境から取得できます。make が起動時に認識するすべての環境変数は、同じ名前と値を持つ make 変数に変換されます。ただし、makefile での明示的な割り当て、またはコマンド引数による明示的な割り当ては、環境をオーバーライドします。

だからあなたはできる(bashから):

FOOBAR=1 make

FOOBARMakefileに変数が生成されます。

于 2010-05-13T10:38:17.610 に答える
7

ここで引用されていない別のオプションがあり、これは 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(それらすべてに特定の種類のアサート要素が含まれており、それらすべてをテストしたいだけだとします)
于 2015-05-21T02:53:20.387 に答える
5

Makefile というファイルを作成し、この $(unittest) のような変数を追加すると、ワイルドカードを使用しても Makefile 内でこの変数を使用できるようになります。

例 :

make unittest=*

BOOST_TEST を使用し、パラメーター --run_test=$(unittest) にワイルドカードを指定すると、正規表現を使用して Makefile を実行するテストを除外できます

于 2014-03-08T13:29:37.383 に答える
4
export ROOT_DIR=<path/value>

$(ROOT_DIR)次に、Makefile で変数を使用します。

于 2016-01-07T16:03:31.613 に答える