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

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

Makefile 在專案中是很常用的東西,

不過語法真的是有很多不容易理解之處。

像最近也才再複習了一次它的指定運算子:

  • = 是遞迴指定,可以在使用前的最後一刻再求值
  • := 是一開始指定的地方就求值
  • ?= 是變數從未設定過時,才賦值
  • += 是附加值到原有變數上

 

不過,不管是哪一種,

都抵不過命令列參數的力量,會被覆寫掉。

例如下面的 Makefile:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
aaa = 111
bbb := 222
ccc ?= 333
ccc += 444
all:
@echo "$(aaa) - $(bbb) - $(ccc)"
aaa = 111 bbb := 222 ccc ?= 333 ccc += 444 all: @echo "$(aaa) - $(bbb) - $(ccc)"
aaa = 111
bbb := 222
ccc ?= 333
ccc += 444

all:
        @echo "$(aaa) - $(bbb) - $(ccc)"

 

平常執行 make 時,結果如下:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ make
111 - 222 - 333 444
$ make 111 - 222 - 333 444
$ make
111 - 222 - 333 444

 

如果在命令列給定了參數的值 (下例中的 ccc),會直接覆蓋掉 Makefile 中的指定運算子,

就連 ?= 和 += 也都會無效…

但是,環境變數的值 (下例中的 aaa 和 bbb),則會被 Makefile 中的指定運算子蓋掉:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ export aaa=555
$ bbb=666 make ccc=777
111 - 222 - 777
$ export aaa=555 $ bbb=666 make ccc=777 111 - 222 - 777
$ export aaa=555
$ bbb=666 make ccc=777
111 - 222 - 777

 

如果 Makefile 改成下面這樣,

沒有在 Makefile 中設定 aaa 和 bbb 變數:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
ccc ?= 333
ccc += 444
all:
@echo "$(aaa) - $(bbb) - $(ccc)"
ccc ?= 333 ccc += 444 all: @echo "$(aaa) - $(bbb) - $(ccc)"
ccc ?= 333
ccc += 444

all:
        @echo "$(aaa) - $(bbb) - $(ccc)"

 

那麼環境變數 aaa 和 bbb 就會有效果:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ export aaa=555
$ bbb=666 make ccc=777
555 - 666 - 777
$ export aaa=555 $ bbb=666 make ccc=777 555 - 666 - 777
$ export aaa=555
$ bbb=666 make ccc=777
555 - 666 - 777

 

參考資料:

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

發佈留言

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

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