2016-03-22 83 views
1

以下是我遇到的問題的一個簡化版本: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中證實了這種行爲。

回答

2

我相信這是該位的從手動

結果傳遞下去,或者出口,一個變量,使增加的變量,並將其值環境運行配方的每一行。 sub-make反過來使用環境來初始化其變量值表。查看環境中的變量。

這是在您的帖子中鏈接到的Communicating Variables to a Sub-make部分。

具體來說,沒有辦法(通過環境)指示哪些變量遞歸展開,哪些只是展開。 (並非沒有一些其他標記機構。)

對比度這

使自動向下通過命令行中定義的變量的值,通過將它們在MAKEFLAGS變量。

並且該變量(或MAKEOVERRIDES-*-command-variables-*-可變視情況而定)可以實際包含=/:=表示風味的事實。

+0

我明白你的觀點,利用系統的環境輸出變量,這些信息在環境中丟失。似乎應該明確說明這個事實以及將要使用的默認風格。我確認在命令行上使用:=確實保留了風格,但我無法累積第1個變量,它在每個子make調用時都會重置。這是一個不同的用例,謝謝澄清這一點。 – Samuel

+0

我同意這可能會更明確地陳述。你在makefile中用'override'累加了'lst'值,並且子make的值是原來的命令行值?因爲沒有「覆蓋」,分配將不會觸及命令行分配的變量。但我期望用'override lst + = c'等等,你會得到修改後的值傳遞給子構造。 –

+0

是的,我刪除了導出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