2012-10-19 87 views
8

我嘗試在當前項目中實現非遞歸構建系統。我所面臨的是變量範圍。目標特定變量不適合我的需求,因爲變量常常定義目標而不是先決條件。 我需要的是:GNU Make。範圍限於單個Makefile的變量

Makefile1:

SOMEVAR := original_value 
include Makefile2 
$(warning $(SOMEVAR)) 

Makefile2:

#some magic here to do what I want and make me happy 
SOMEVAR := included_value 
#and maybe here 

而且我想輸出是 'original_value'。

有什麼策略可以讓它變成現實嗎?

編輯:我來的那一刻唯一的解決辦法是強制和組織自己把所有inlcudes在每個特定Makefile結尾,並使用直接變量賦值:=

+0

該解決方案聽起來不錯。它出什麼問題了?什麼是'SOMEVAR',它用於什麼? – Beta

+1

在這個解決方案中,我不喜歡的是它非常不穩定。如果一個可以代替我的地方的可憐人不會得到這個想法,那麼他會得到很多驚喜 –

+1

如果Makefile2被多次包含,並且它定義了一個指向'$(SOMEVAR)'的配方, ,那麼它就會崩潰 - 配方執行時會評估配方中的變量,這意味着它們都會看到'$(SOMEVAR)'的最後一個值,而不是配方定義時的值。 –

回答

5

一種策略是老式的解決方案當你擁有的全局變量是變量名稱衝突時:以窮人名字空間的形式向你的變量名稱添加一個前綴。

Makefile1:

Makefile1_SOMEVAR := original_value 
include Makefile2 
$(warning $(Makefile1_SOMEVAR)) 

Makefile2:

# no magic needed 
Makefile2_SOMEVAR := included_value 
# rest of Makefile2 uses $(Makefile2_SOMEVAR) of course 

變戲法似的,有了這樣的約定就好像每個makefile文件都有自己的局部變量(或者,至少,它自己的變量一個不會與任何其他makefile衝突的名稱空間)。