Environment-Variables

GNU Make 僅在宏已存在時將其導出為環境變數

  • April 26, 2021

考慮以下內容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。當它啟動時,它從環境中導入變數到它的內部集,並且在執行命令時,將標記為導出的那些導出到它們的環境中。這意味著它只有一個用於所有變數的表,並且沒有同名的環境變數和非環境變數。

6.10 環境變數

make 中的變數可以來自 make 執行的環境。make 在啟動時看到的每個環境變數都會轉換為具有相同名稱和值的 make 變數。

5.7.2 將變數傳遞給 Sub-make

除非通過顯式請求,否則僅當變數最初在環境中定義或在命令行中設置時才會導出變數

$$ … $$如果要將特定變數導出到子 make,請使用 export 指令,如下所示: export variable …

如果要防止變數被導出,請使用 unexport 指令,如下所示:

unexport variable …

據我測試,使用unexport X只是將其完全從啟動程序的環境中刪除,似乎沒有辦法保持與內部變數不同的值。


使用.POSIX內置目標似乎也沒有改變這種行為,但是,似乎沒有 Make 對 POSIX 行為過於嚴格。

引用自:https://unix.stackexchange.com/questions/646255