在构建时定义 makefile 变量并在 foreach 中使用它

Defining makefile variable at build time and using it in foreach

我通过使用 jq.

解析 json 文件来定义一个 makefile 变量
define variable
    $(eval objects := $(shell jq -c '.abc.values[]' config.json))
endef
target_a:
    $(variable)
    @echo "from target-a: $(objects)"
target_b: $(foreach X, $(objects), stage_$(X))

我得到的输出与 json 列表相同:

from target-a: first second

这意味着变量已正确初始化,但 foreach 未触发任何 stage_% 目标。这是为什么?

基本上你的 makefile 不能工作。分两个不同的步骤进行:首先 所有 makefile 都被完全解析并创建目标和先决条件的内部图。 第二个 遍历该图并调用所有食谱。第一步必须定义所有先决条件。所有配方仅在第二步展开。

在这里,您已经将 objects 变量的扩展添加到 target_a 的配方中,因此在第二步之前不会发生这种情况,如果 make 决定重建目标 target_a 因为它已经过时了。但是,target_b的先决条件的定义在很久以前就已经发生了,在make第一步解析makefile的时候。

您可以在您的示例中执行此操作,它会起作用:

objects := $(shell jq -c '.abc.values[]' config.json)

target_a:
        @echo "from target-a: $(objects)"

target_b: $(foreach X, $(objects), stage_$(X))

此处,objects 在解析 makefile 时展开,因此它将在 target_b 展开之前具有值。

也许出于某些原因您不能这样做,但如果是这样的话,您已经简化了您的示例太多,我们无法提供帮助。