cd sub && make
とcd sub && $(MAKE)
の違い
$(MAKE)
をつかうと,コマンドラインに指定したmake
と同じ値が使われることが保障される.
例えば,あるMakefileがその中で別の子make
を呼ぶような場合,make -nとした場合に,
子make
の方もmake -nになってほしい.
また,make VER=12とした場合に,子makeの方もマクロ定義VER=12が引き継がれてほしいはず.
これを実現するためには,$(MAKE)とかいておかなければならない
(直にmakeと書いた場合,当然 子makeにコマンドライン引数の-nやVER=12は引き継がれない).
-C,-f,-o,-Wなど一部のオプションは子makeには引き継がれない仕様になっている. また,-jは特殊な引き継ぎ方をするようになっている.
makeを実行時に指定した引数が自動的に定義される.
また,Makefileの中にMAKEFLAGS = -n
と書いておくと,
コマンドラインからmake -nとしたのと同じ意味になる.
さらに,makeは同じ名前の環境変数をマクロの初期値として使用するため,
シェルで環境変数MAKEFLAGS
を指定しておくとその値が使われる.
MAKEOVERRIDES = コマンドラインで指定したマクロ群 MAKEFLAGS = makeのオプション群 $(MAKEOVERRIDES)
となっている.したがって,マクロは子makeに引き継ぎたくないときは,
cd sub && $(MAKE) MAKEOVERRIDES=
としておくとよい.
親makeでは0,直下の子makeでは1というように定義されている.
マクロ定義の優先順位は,通常,
環境変数<Makefile中の指定<コマンドライン引数での指定の順になっているが,
いくつかの方法で変更できる.
まず,make -eとすると,Makefile中の指定<環境変数<コマンドライン引数での指定という順になる.
また,Makefileの中に
override CFLAGS += -g
のように書いておくことで,このマクロ定義は必ず最優先になるようにすることができる.
これはうっかり取り消ししてしまってはいけないようなオプションを指定するときに使えるテクニック.
マクロをexportしておくと子makeからも見えるようになる(環境変数に設定する). 例えば,子makeでも親makeと同じCコンパイラを使いたいような場合, 親Makefileで次のようにexportしておき, 子Makefileの方ではCCを記述しないという風にしておくと,期待通りの動作になる.
CC = gcc export CC
また,引数なしで単にexportとだけ書いておくとすべてのマクロがexportされる.