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 と呼ばれる場合

Makefile

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:".