makefile - Makefile for loop - 变量永远不会被设置
问题描述
我有下面的 for 循环来迭代预定义的列表并设置在 make 中进一步使用的变量
for ENTRY in $(ARRAY); do \
if test "$${ENTRY}" = $(PRE_ID); then \
echo "$${ENTRY}"; \
PRE=1; \
NON_PRE=0; \
echo "$(PRE)"; \
else echo "$(PRE_ID)"; \
NON_PRE=1; echo "$(NON_PRE)"; \
fi \
done
在上述循环中,所有条件检查均正确执行,但未执行变量设置语句。$(PRE) 和 $(NON_PRE) 上的回声总是像“”一样打印为空。解决此问题的任何线索或提示都会有所帮助。
解决方案
您似乎对make
自己的指令和make
.
您在这里展示的不是(本身)有效的 Makefile 语法,而是一个 shell 脚本。唯一要做的make
就是扩展make
变量($(...)
/$$
部分),给出
for ENTRY in one two three; do \
if test "${ENTRY}" = whatever-PRE_ID-is; then \
echo "${ENTRY}"; \
PRE=1; \
NON_PRE=0; \
echo ""; \
else echo "whatever-PRE_ID-is"; \
NON_PRE=1; echo ""; \
fi \
done
(这里我假设PRE_ID
在 Makefile 的其他地方定义,但PRE
/NON_PRE
没有,所以它们变成......什么都没有)。然后将生成的命令传递给sh -c
并作为 shell 脚本执行。
shell 会将PRE
和设置NON_PRE
为 shell 变量,但是您的命令不会使用它们,并且一旦循环完成执行,它们就会消失(因为 shell 变量不会在 shell 死亡后持续存在)。
要修复此代码,您必须详细说明您要实现的目标,因为目前这有点XY 问题。由于make
(首先解析 Makefile 并make
处理变量,然后运行 shell 命令作为规则处理的一部分)的暂存性质,您根本无法make
从 shell 循环中设置变量。