子makeを使うときの注意点

cd sub && makecd sub && $(MAKE)の違い

$(MAKE)をつかうと,コマンドラインに指定したmakeと同じ値が使われることが保障される. 例えば,あるMakefileがその中で別の子makeを呼ぶような場合,make -nとした場合に, 子makeの方もmake -nになってほしい. また,make VER=12とした場合に,子makeの方もマクロ定義VER=12が引き継がれてほしいはず. これを実現するためには,$(MAKE)とかいておかなければならない (直にmakeと書いた場合,当然 子makeにコマンドライン引数の-nVER=12は引き継がれない).

-C,-f,-o,-Wなど一部のオプションは子makeには引き継がれない仕様になっている. また,-jは特殊な引き継ぎ方をするようになっている.

MAKEFLAGS

makeを実行時に指定した引数が自動的に定義される. また,Makefileの中にMAKEFLAGS = -nと書いておくと, コマンドラインからmake -nとしたのと同じ意味になる. さらに,makeは同じ名前の環境変数をマクロの初期値として使用するため, シェルで環境変数MAKEFLAGSを指定しておくとその値が使われる.

MAKEOVERRIDES

MAKEOVERRIDES = コマンドラインで指定したマクロ群
MAKEFLAGS = makeのオプション群 $(MAKEOVERRIDES)

となっている.したがって,マクロは子makeに引き継ぎたくないときは, cd sub && $(MAKE) MAKEOVERRIDES= としておくとよい.

MAKELEVELS

親makeでは0,直下の子makeでは1というように定義されている.

override

マクロ定義の優先順位は,通常, 環境変数<Makefile中の指定<コマンドライン引数での指定の順になっているが, いくつかの方法で変更できる. まず,make -eとすると,Makefile中の指定<環境変数<コマンドライン引数での指定という順になる. また,Makefileの中に override CFLAGS += -g のように書いておくことで,このマクロ定義は必ず最優先になるようにすることができる. これはうっかり取り消ししてしまってはいけないようなオプションを指定するときに使えるテクニック.

マクロのexport/unexport

マクロをexportしておくと子makeからも見えるようになる(環境変数に設定する). 例えば,子makeでも親makeと同じCコンパイラを使いたいような場合, 親Makefileで次のようにexportしておき, 子Makefileの方ではCCを記述しないという風にしておくと,期待通りの動作になる.

CC = gcc
export CC

また,引数なしで単にexportとだけ書いておくとすべてのマクロがexportされる.


はたいたかし
トップ > 開発ツール > make