web-dev-qa-db-ja.com

Makeにコマンドラインから追加の変数を渡す

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

513
Pablo

メイクファイルの外部から変数を設定する方法はいくつかあります。

  • 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変数をエクスポートすることもできます。

639
P Shved

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

make foo=bar target

それから、あなたのメイクファイルであなたは$(foo)を参照することができます。これはsub-makeに自動的には反映されません。

サブメイクを使用している場合は、この記事を参照してください。 サブメイクへの変数の伝達

167
Mark Byers

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

action:
    echo argument is $(argument)

あなたはそれをmake action argument=somethingと呼ぶでしょう

58
nc3b

マニュアルから

Make内の変数は、makeが実行されている環境から取得できます。起動時にmakeが見るすべての環境変数は、同じ名前と値を持つmake変数に変換されます。ただし、makefile内での明示的な代入、またはコマンド引数を使用した明示的な代入は、環境を無効にします。

だから(bashから)することができます:

FOOBAR=1 make

あなたのMakefileには変数FOOBARが入ります。

18
Thomas

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

それがあれば、

  • w/make -r class02付きのファイルをビルドして実行します。
  • すべてのmakeまたはmake allを使用してビルドします。
  • すべてのw/make -rをビルドして実行します(それらのすべてに特定の種類のassert要素が含まれていて、それらすべてをテストしたいとします)。
4
Ciro Costa

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

例:

make unittest=*

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

3
serup
export ROOT_DIR=<path/value>

その後、Makefileで変数$(ROOT_DIR)を使用します。

3
parasrish