プログラミングユーティリティ

入れ子にした make コマンドにパラメータを渡す

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 コマンド行

定義済みの値 (ある場合)