Environment-Variables
GNU Make 僅在宏已存在時將其導出為環境變數
考慮以下內容
Makefile
:X = macro-X-value foo: echo $$X $(X)
這裡的目的是
X
同時用作環境變數和宏的名稱。使用時bmake
,它按預期工作:$ env X=env-X-value /usr/bin/bmake echo $X macro-X-value env-X-value macro-X-value $ env -i /usr/bin/bmake echo $X macro-X-value macro-X-value
但是當使用 GNU Make (v. 4.2.1) 時,行為變得很奇怪:
$ env X=env-X-value /usr/bin/gmake echo $X macro-X-value macro-X-value macro-X-value $ env -i /usr/bin/gmake echo $X macro-X-value macro-X-value
因此,似乎將宏
gmake
的值導出為 環境變數,但前提是外部環境已經 導出。X
X``X
我在POSIX Make description中找不到任何關於此的內容。事實上,那裡有這麼一點:
宏不會導出到要執行的命令的環境中。
$$ … $$
這種行為是否記錄在案?這是一個錯誤嗎?可以禁用嗎?
根據我從手冊中讀到的內容,GNU make 似乎將其變數視為 shell。當它啟動時,它從環境中導入變數到它的內部集,並且在執行命令時,將標記為導出的那些導出到它們的環境中。這意味著它只有一個用於所有變數的表,並且沒有同名的環境變數和非環境變數。
make 中的變數可以來自 make 執行的環境。make 在啟動時看到的每個環境變數都會轉換為具有相同名稱和值的 make 變數。
除非通過顯式請求,否則僅當變數最初在環境中定義或在命令行中設置時才會導出變數
$$ … $$如果要將特定變數導出到子 make,請使用 export 指令,如下所示:
export variable …
如果要防止變數被導出,請使用 unexport 指令,如下所示:
unexport variable …
據我測試,使用
unexport X
只是將其完全從啟動程序的環境中刪除,似乎沒有辦法保持與內部變數不同的值。使用
.POSIX
內置目標似乎也沒有改變這種行為,但是,似乎沒有 Make 對 POSIX 行為過於嚴格。