首页 > 解决方案 > 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) 上的回声总是像“”一样打印为空。解决此问题的任何线索或提示都会有所帮助。

标签: makefile

解决方案


您似乎对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 循环中设置变量。


推荐阅读