[Linux] Makefile 指定運算子、命令列參數、與環境變數

[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

 

參考資料:

(本頁面已被瀏覽過 1,421 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料