以下是我遇到的問題的一個簡化版本:GNU品牌:導出一個簡單擴展型變量
main.mk:
export lst :=
tmp := a
lst += $(tmp)
$(warning lst is $(lst))
tmp := b
lst += $(tmp)
$(warning lst is $(lst))
all:
$(MAKE) -f sub.mk
sub.mk:
tmp := c
lst += $(tmp)
$(warning lst is $(lst))
tmp := d
lst += $(tmp)
$(warning lst is $(lst))
運行make -f main.mk會打印以下內容:
main.mk:7: lst is a
main.mk:11: lst is a b
make -f sub.mk
sub.mk:4: lst is a b c
sub.mk:8: lst is a b d d
我將lst定義爲main.mk中的簡單擴展變量,爲什麼要將它轉換爲submake中的遞歸擴展變量?
我閱讀以下內容:
https://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_6.html#SEC59 https://www.gnu.org/software/make/manual/html_node/Variables_002fRecursion.html
既不指出,當exportd到submake變量失去了它的 「味道」。
我能夠很容易地加入這sub.mk解決這個問題:
lst := $(lst)
似乎是一個黑客,但。難道我做錯了什麼?
我在Cygwin中使用GNU Make v4.1,我也使用GNU Make v3.81在Linux中證實了這種行爲。
我明白你的觀點,利用系統的環境輸出變量,這些信息在環境中丟失。似乎應該明確說明這個事實以及將要使用的默認風格。我確認在命令行上使用:=確實保留了風格,但我無法累積第1個變量,它在每個子make調用時都會重置。這是一個不同的用例,謝謝澄清這一點。 – Samuel
我同意這可能會更明確地陳述。你在makefile中用'override'累加了'lst'值,並且子make的值是原來的命令行值?因爲沒有「覆蓋」,分配將不會觸及命令行分配的變量。但我期望用'override lst + = c'等等,你會得到修改後的值傳遞給子構造。 –
是的,我刪除了導出lst,並在每個lst + =語句前面添加覆蓋。我閱讀了這些文章:gnu.org/software/make/manual/html_node/Options_002fRecursion.html,gnu.org/software/make/manual/html_node/Overriding.html和gnu.org/software/make/manual/html_node/ Override-Directive.html,他們沒有明確說明行爲。我在兩個文件中檢查了MAKEOVERRIDES,並且它總是等於命令行值(在Cygwin make v4.1和Linux make v3.81中確認)。我可能會手動修復MAKEOVERRIDES以獲得預期的行爲,或將lst:= $(lst)傳遞給子版本。 – Samuel