[Linux] Makefile 指定運算子、命令列參數、與環境變數
Makefile 在專案中是很常用的東西,
不過語法真的是有很多不容易理解之處。
像最近也才再複習了一次它的指定運算子:
- = 是遞迴指定,可以在使用前的最後一刻再求值
- := 是一開始指定的地方就求值
- ?= 是變數從未設定過時,才賦值
- += 是附加值到原有變數上
不過,不管是哪一種,
都抵不過命令列參數的力量,會被覆寫掉。
例如下面的 Makefile:
aaa = 111 bbb := 222 ccc ?= 333 ccc += 444 all: @echo "$(aaa) - $(bbb) - $(ccc)"
平常執行 make 時,結果如下:
$ make 111 - 222 - 333 444
如果在命令列給定了參數的值 (下例中的 ccc),會直接覆蓋掉 Makefile 中的指定運算子,
就連 ?= 和 += 也都會無效…
但是,環境變數的值 (下例中的 aaa 和 bbb),則會被 Makefile 中的指定運算子蓋掉:
$ export aaa=555 $ bbb=666 make ccc=777 111 - 222 - 777
如果 Makefile 改成下面這樣,
沒有在 Makefile 中設定 aaa 和 bbb 變數:
ccc ?= 333 ccc += 444 all: @echo "$(aaa) - $(bbb) - $(ccc)"
那麼環境變數 aaa 和 bbb 就會有效果:
$ export aaa=555 $ bbb=666 make ccc=777 555 - 666 - 777
參考資料:
- Environment (GNU make)
- gnu make – What is the difference between the GNU Makefile variable assignments =, ?=, := and +=?
(本頁面已被瀏覽過 1,421 次)