ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

【Makefile】変数の定義

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」のままです。
「?=」は変数がまだ未定義のときのみ代入をおこなう演算子です。