试图在 Makefile 目标中实现循环

Trying to implement a loop in Makefile target

这是我的目标,我想 运行 为列表变量中的每个元素创建一个循环。 问题是循环 运行s 但 test 变量值被传递为空

list = mlflow emr
common=$(someDir)/common
.PHONY:build
build:
    for var in $(list); do \
        cd ${common}; \
        test=$(git diff --name-only --diff-filter=AM master | grep ^$(var)/); \
        if [ "$(test)" != "" ]; then \
            echo "condition met"; \
        else \
            echo "It is Not Setup"; \
        fi \
    done

错误:

bash-5.0# sudo make build n=1
for var in mlflow emr; do \
    cd /mak/epa-toolchain/common; \
    test=; \
    if [ "" != "" ]; then \
        echo "condition met"; \
    else \
        echo "It is Not Setup"; \
    fi \
done
It is Not Setup
It is Not Setup

$ 是一个特殊的 make 字符:它引入了一个 make 变量引用。所以这个:

$(git diff --name-only --diff-filter=AM master | grep ^$(var)/)

不是 shell $(...) 命令,它是一个名字很奇怪的 make 变量。无论你想让 shell 看到 $,你都必须将它转义为 $$:

$$(git diff --name-only --diff-filter=AM master | grep ^$$var/)

(请注意,您必须将 $(var) 更改为 $$var,因为前者是对 make 变量 var 的引用,但您在 shell 中循环设置 shell 变量 var).

同上:

    if [ "$(test)" != "" ]; then \

必须是:

    if [ "$$test" != "" ]; then \

因为 test 是一个 shell 变量,而不是 make 变量。