【问题标题】:Trying to implement a loop in Makefile target尝试在 Makefile 目标中实现循环
【发布时间】:2020-12-07 13:52:41
【问题描述】:

这是我的目标,我想为列表变量中的每个元素运行一个循环。 问题是循环运行,但 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

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    $ 是一个特殊的 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 变量。

    【讨论】:

    • 确实有效,感谢清晰的解释和及时的依赖
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多