我有这个make文件
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
选项param丢失。因此,似乎$(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 :(得分: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。您可以自动生成包含的文件。您可以定义一些变量,然后使用二次扩展。有一个很多方法可以做到这一点。
您无法在先决条件列表中使用特定于目标的变量。
答案 1 :(得分:0)
您不能像这样一起使用特定于目标的变量和简单的赋值。您告诉make在make parse时运行shell命令,但也告诉它只在特定目标上下文中设置$(CONFIG)
变量的内容。
您可以使用递归变量(并在每次使用变量时运行一次shell命令)或将CONFIG_FILES
分配与CONFIG
一起粘贴到每个特定于目标的上下文中。
答案 2 :(得分:0)
从:
行中删除CONFIG_FILES := …
。这迫使make
在makefile中的那一点评估CONFIG_FILES
,并且它没有目标(all
或debug
)的上下文来允许它为$(CONFIG)
提供一个值,因此它不提供一个值,这会导致您看到的错误。
使用:
CONFIG_FILES = $(shell python parse_config.py -i $(CONFIG))
答案 3 :(得分: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)