在Makefile中的内置shell函数中使用make变量

时间:2014-01-09 20:12:25

标签: python shell build makefile

我有这个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

似乎还在继续发挥作用。

4 个答案:

答案 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,并且它没有目标(alldebug)的上下文来允许它为$(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)