Makefileの変数の定義の理解ができてなかったので調べてみました。
「=」の場合
コード
x = hoge y = $(x) fuga x = piyo .PHONY: test test: @echo $(x) @echo $(y)
実行結果
$ make test piyo piyo fuga
補足
「make」 において 「=」 は 「recursive expansion」(再帰的な展開)で処理します。
「y = $(x) fuga」と定義すると、「x 」の値が更新されるたびに 「y」 の値は更新されるため、「x = hoge」は上書きされて表示されません。
「:=」の場合
コード
x := hoge y := $(x) fuga x := piyo .PHONY: test test: @echo $(x) @echo $(y)
実行結果
$ make test piyo hoge fuga
補足
「make」 において 「:=」 は単純に展開される変数として処理します。
もし、以下のように1行目がない場合は、未定義の 「x」 は空文字として処理されます。ですので 「y」 の値は「fuga」になります。
y := $(x) fuga x := piyo
「?=」の場合
コード
x ?= hoge y ?= $(x) fuga x ?= piyo .PHONY: test test: @echo $(x) @echo $(y)
実行結果
$ make test hoge hoge fuga
補足
「x」が「hoge」のままです。
「?=」は変数がまだ未定義のときのみ代入をおこなう演算子です。