【问题标题】:Use make variable in builtin shell function in a Makefile在 Makefile 的内置 shell 函数中使用 make 变量
【发布时间】:2014-01-28 14:12:42
【问题描述】:

我有这个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 选项参数丢失。所以看起来$(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

make 似乎还能继续工作。

【问题讨论】:

    标签: python shell build makefile


    【解决方案1】:

    问题是这样的:

    all : CONFIG=config.ini
    
    all: $(CONFIG) $(CONFIG_FILES)
            ...
    

    不会工作。目标特定变量的值在配方内部可用。您不能使用特定于目标的变量作为先决条件。这也是为什么在先决条件列表中使用 $(CONFIG_FILES) 变量时没有设置它的原因。

    预计到达时间:

    你可以这样做:

    CONFIG_FILES = $1 $(shell python parse_config.py -i $1)
    
    all: $(call CONFIG_FILES,config.ini)
    debug: $(call CONFIG_FILES,config-debug.ini)
    

    也许吧。你可以明确地写出来。您可以运行覆盖 CONFIG_FILES 的递归 make 调用。您可以自动生成包含的文件。您可以定义一些变量,然后使用二次扩展。有很多方法可以做到这一点。

    您无法在先决条件列表中使用特定于目标的变量来做到这一点。

    【讨论】:

    • parse_config.py 提供文件列表。那么我该如何使用该列表作为先决条件呢?有什么想法吗?
    【解决方案2】:

    这可以使用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)
    

    【讨论】:

      【解决方案3】:

      您不能像这样同时使用特定于目标的变量和简单的赋值。您告诉 make 在 make 解析时运行 shell 命令,但还告诉它只在特定目标上下文期间设置 $(CONFIG) 变量的内容。

      您可以使用递归变量(每次使用该变量时运行一次 shell 命令)或将 CONFIG_FILES 赋值与 CONFIG 一起粘贴到每个目标特定的上下文中。

      【讨论】:

      • 有什么关于recursive variable的例子吗?
      • 正常的= 分配是recursively expanded variable 与分配给:=simply expanded variable 相比。
      • 好吧,只使用= 不会改变行为。
      【解决方案4】:

      CONFIG_FILES := … 行中删除:。这迫使make 在makefile 中评估CONFIG_FILES,并且它没有目标的上下文(alldebug)允许它为$(CONFIG) 提供值所以它没有提供一个,这会导致您看到的错误。

      用途:

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

      【讨论】:

      • 这应该有效(这也是我在回答中所说的)。请将编辑后的 ​​makefile 添加到问题中,并为我们提供确切的 make 输出。也是make all SHELL+=-x的输出。
      • @shiplu.mokadd.im:如果从all 行的依赖项中删除$(CONFIG_FILES) 会发生什么?如果事情开始好转,我有一些理论;如果他们不这样做,我的理论就无关紧要了。但我可能会在几个小时内无法再次回复。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多