在构建时定义 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
展开之前具有值。
也许出于某些原因您不能这样做,但如果是这样的话,您已经简化了您的示例太多,我们无法提供帮助。
我通过使用 jq
.
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
展开之前具有值。
也许出于某些原因您不能这样做,但如果是这样的话,您已经简化了您的示例太多,我们无法提供帮助。