2014-01-09 21 views
1

我有這個make文件使用使內置shell函數變量在一個Makefile

all : CONFIG=config.ini 
debug : CONFIG=config-debug.ini 

CONFIG_FILES := $(shell python parse_config.py -i $(CONFIG)) 

all: $(CONFIG) $(CONFIG_FILES) 
    echo $(CONFIG) $(CONFIG_FILES) 

當我運行make all這表明一些Python錯誤說-i選項參數是丟失。所以看來$(CONFIG)沒有經歷shell的功能。

make all如何調用python parse_config.py -i 'config.ini'

相同的方式make debug調用python parse_config.py -i 'config-debug.ini'

更新

運行make all SHELL+=-x後,我得到下面的輸出。

+ python parse_config.py -p static -i 
usage: parse_config.py [-h] -i INPUT_JSB3 [-p PREFIX] 
parse_config.py: error: argument -i: expected one argument 

但在那之後,我得到

+ python parse_config.py -p static -i static/config.ini 

並作出似乎繼續工作。

回答

0

這可以使用MAKECMDGOALS變量來完成。

ifeq ($(findstring debug,$(MAKECMDGOALS)),debug) 
CONFIG=config-debug.ini 
else 
CONFIG=config.ini 
endif 

CONFIG_FILES := $(shell python parse_config.py -i $(CONFIG)) 

all: $(CONFIG) $(CONFIG_FILES) 
    echo $(CONFIG) $(CONFIG_FILES) 
0

您不能像這樣一起使用目標特定的變量和簡單的賦值。您正在告訴make在make解析時運行shell命令,但也告訴它只在特定目標上下文中設置$(CONFIG)變量的內容。

您可以使用遞歸變量(並在每次使用變量時運行一次shell命令),也可以將CONFIG_FILES賦值分配到每個特定於目標的上下文以及CONFIG中。

+0

有關'遞歸變量'的任何示例? –

+0

正常的'='賦值是''遞歸擴展變量'與賦值爲':='的簡單擴展變量相比。 –

+0

那麼只使用'='不會改變行爲。 –

0

CONFIG_FILES := …行中刪除:行。這會強制make在makefile文件中評估CONFIG_FILES,並且它沒有目標上下文(alldebug)以允許它爲$(CONFIG)提供值,因此它不提供一個值,這會導致你看到的錯誤。

用途:

CONFIG_FILES = $(shell python parse_config.py -i $(CONFIG)) 
+0

這不起作用。我仍然有同樣的錯誤。 –

+0

這應該工作(並且我在我的回答中也是這樣說的)。將編輯過的makefile添加到問題中,並給我們確切的make輸出。還有'make all SHELL + = - x'的輸出。 –

+0

我已更新我的問題。 –

1

的問題是這樣的:

all : CONFIG=config.ini 

all: $(CONFIG) $(CONFIG_FILES) 
     ... 

將無法​​正常工作。目標特定變量的值僅爲可用裏面的的配方。您不能使用特定於目標的變量作爲先決條件。這也是爲什麼當您在先決條件列表中使用它時,它沒有在$(CONFIG_FILES)變量中設置。

ETA:

你可以做這樣的事情:

CONFIG_FILES = $1 $(shell python parse_config.py -i $1) 

all: $(call CONFIG_FILES,config.ini) 
debug: $(call CONFIG_FILES,config-debug.ini) 

可能。你可以明確地寫出來。你可以運行遞歸make調用覆蓋CONFIG_FILES。您可以自動生成包含的文件。你可以定義一些變量,然後使用二次擴展。有一個很多的方法來做到這一點。

你只是不能用prerequisites列表中的目標特定變量來完成它。

+0

'parse_config.py'提供了一個文件列表。那麼我如何使用該列表作爲先決條件呢?任何想法? –

+0

「recursive make invocation」上的任何示例都解決了這個問題? –