makeの再帰と値の受け渡しについて
makefile中でサブディレクトリのmakefileや別のタスクを呼びたい時がある。このような場合には $(MAKE)
を使う(くわしくはこのあたり)。起動している自身のコマンドで呼び出してくれるので便利(たとえばmakeがgmake
などのコマンド名だった場合にgmake
が使われるということ)
foo: $(MAKE) -f foo.mk
この時の値の受け渡しについて
通常は変数は引き継がない
通常は変数は引き継がない。例えば以下のように :default:
を入れた変数VALUEを用意し、そこからfoo.mkを呼ぼうとしても伝搬しない。
VALUE ?= :default: foo: $(MAKE) -f foo.mk
foo.mk は以下のような定義
value: @echo 'this is input message "${VALUE}".'
以下のような結果に終わる。
$ make make -f foo.mk this is input message "".
陽に渡す方法
直接環境変数経由で渡すことができる。Makefile中では環境変数で渡された値も変数として利用できる。以下の様な感じ。
VALUE ?= :default: foo: VALUE=${VALUE} $(MAKE) -f foo.mk
直接渡せば、foo.mkでも使われる。
$ make VALUE=:default: make -f foo.mk this is input message ":default:".
?=
はデフォルトの値を定義という意味に近いのでmakeを呼び出す際に値を与えると自由に変更できる。
$ VALUE=bar make VALUE=bar make -f foo.mk this is input message "bar".
exportを使う場合
exportという修飾子を使うと暗黙に受け渡される変数になる(この辺参照)。
export VALUE ?= :default: foo: $(MAKE) -f foo.mk
直接受け渡さなくても引き継がれる。
$ make make -f foo.mk this is input message ":default:". $ VALUE=bar make make -f foo.mk this is input message "bar".
ネストした場合は?
Makefile -> foo.mk -> bar.mk と呼ばれる場合
export VALUE ?= :default: foo: $(MAKE) -f foo.mk bar
foo.mk
value: @echo 'this is input message "${VALUE}".' bar: make -f bar.mk
bar.mk
value: @echo 'this is input message "${VALUE}".'
しっかり引き継がれている。
$ make make -f foo.mk this is input message ":default:".