MAKEFLAGS
を除いて、make は環境変数をインポートし、定義済みのマクロと同様に扱います。次に、make は呼び出したコマンド (入れ子になった make コマンドを含む) にそれらの環境変数およびその値を渡します。
環境変数 SHELL
は、このバージョンの make にはインポートおよびエクスポートされません。
マクロは、メークファイルと同様に、コマンド行の引数としても指定できます。このため、マクロが複数の箇所で定義されている際に名前が衝突することがあります。make には、このような衝突を回避するための非常に複雑な優先順位の規則があります。
まず、条件付きマクロの定義は、定義されているターゲット (およびその依存関係) 内で常に有効です。
マクロ定義を引数として make を呼び出すと、その定義はメークファイル内のマクロ定義または環境変数からインポートされたマクロ定義よりも優先されます (ただし、入れ子にした make コマンドではこの優先順位とは異なる場合があります)。それ以外の場合は、メークファイルでマクロを定義 (または再定義) した場合は、最新の定義が適用されます。通常は、最新の定義が環境変数の定義よりも優先されます。
最後に、マクロがデフォルトのファイルだけで定義されている場合は、その値が使用されます。
入れ子にした make コマンドでは、通常はメークファイルでの定義が環境変数よりも優先されますが、これは定義がメークファイルに記述されている場合のみ該当します。対応する環境変数はこれとは無関係に伝達されます。
コマンド行での定義は、その定義を指定した make の実行でのみ、環境変数とメークファイルの定義を無効にします。コマンド行で指定した値は、入れ子にした make コマンドにも渡されますが、入れ子にした make コマンドでの定義と、入れ子にした make コマンドによりインポートされた環境変数によって無効になります。
-e オプションの動作はさらに一貫しています。環境変数は、メークファイルでのマクロ定義を無効にします。コマンド行での定義は、メークファイルおよび 環境変数での定義よりも常に優先して使用されます。ただし、-e を使用すると、メークファイルに含まれていない情報により構築の成否が左右される可能性があります。
このような複雑さを避けるために、特定の値を make コマンドの階層全体に渡す際には、環境変数を (C シェルで) 設定して、サブシェルで make -e を実行してください。
% (unsetenv MAKEFLAGS LDFLAGS; setenv CFLAGS -g; make -e)
以下のメークファイルを使用して、さまざまな場合をテストすることができます。
# top.mk MACRO= "Correct but unexpected." top: @echo "------------------------------ top" echo $(MACRO) @echo "------------------------------" $(MAKE) -f nested.mk @echo "------------------------------ clean" clean: rm nested
# nested.mk MACRO=nested nested: @echo "------------------------------ nested" touch nested echo $(MACRO) $(MAKE) -f top.mk $(MAKE) -f top.mk clean
以下に、マクロの割り当て順序の一覧表を示します。
表 4-17 マクロの割り当て順序の一覧表
-e なし |
-e を使用 |
---|---|
最上位の make コマンド |
|
条件付き定義 |
条件付き定義 |
make のコマンド行 |
make のコマンド行 |
最新のメークファイルの定義 |
環境変数の値 |
環境変数の値 |
最新のメークファイルの定義 |
定義済みの値 (ある場合) |
定義済みの値 (ある場合) |
入れ子にした make コマンド |
|
条件付き定義 |
条件付き定義 |
make のコマンド行 |
make のコマンド行 |
最新のメークファイルの定義 |
親の make コマンド行 |
環境変数 |
環境変数 |
定義済みの値 (ある場合) |
最新のメークファイルの定義 |
親の make コマンド行 |
定義済みの値 (ある場合) |