1. ホーム
  2. makefile

[解決済み】コマンドラインからmakeに追加の変数を渡す場合

2022-01-27 12:05:09

質問

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

どのように解決するのですか?

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 引数なしで