在 Makefile 目标中测试一个变量

Test a variable in Makefile target

我试图让它工作,但变量似乎没有正确传递给 if 语句,因为它没有“进入”if 循环

apply_test:
                $(eval var=$(shell bash -c "echo 1"))        
                echo $(var)
ifeq ($(var),1)
        echo "inside the stmt"
        $(eval var=$(shell bash -c "echo 2")) 
endif
                echo $(var)

一般来说,我会尝试评估函数的return值,以执行后续的条件设置,例如在 if-stmt 中设置一个新变量。

我的方法有什么问题?

我的意思是,这里几乎所有的东西都有问题:)。您还没有对为什么 尝试做如此复杂的事情给出任何解释,但专家提示:

  • 任何时候你在食谱中使用 ifeq 等 make 条件,它很可能不会做你想做的,除非你非常确定你完全理解 makefile 的扩展规则.
  • 任何时候你在食谱中使用 $(shell ...),这几乎总是一个坏主意。
  • 任何时候你在食谱中使用 $(eval ...),这几乎 100% 绝对是个坏主意。

然而,只处理您眼前的问题:ifeq 解析 时处理 makefile。直到整个 makefile 被解析并且 make 决定将哪些目标 运行 之后,食谱才会 运行。因此,当 make 解析 makefile 并查看 ifeq 时,变量 var 尚未设置,因此它的计算结果为空字符串并且永远不会等于 1.

预计到达时间

在不了解您的要求的情况下,我会说实现此目的的“正确”方法是在配方中使用 shell 操作。看起来像这样:

apply_test:
        var=$$(echo 1) ; \       
        echo $$var; \
        if [ $$var = 1 ]; then \
            echo "inside the stmt"; \
            var=$$(echo 2); \
        fi; \
        echo $$var