在makefile中,变量不会被覆盖,尽管它显示了不同的值,这也会导致错误的ifeq

在makefile中,变量不会被覆盖,尽管它显示了不同的值,这也会导致错误的ifeq,makefile,Makefile,考虑一下这个Makefile #!/bin/sh IS_FIRSTRUN:=false .PHONY: firstrun firstrun: export IS_FIRSTRUN:=true firstrun: run .PHONY: run run: @echo "IS_FIRSTRUN is <${IS_FIRSTRUN}>" ifeq (${IS_FIRSTRUN},true) @echo "In true statement, IS_FI

考虑一下这个Makefile

#!/bin/sh
IS_FIRSTRUN:=false

.PHONY: firstrun
firstrun: export IS_FIRSTRUN:=true
firstrun: run

.PHONY: run
run: 
        @echo "IS_FIRSTRUN is <${IS_FIRSTRUN}>"
ifeq (${IS_FIRSTRUN},true)
        @echo "In true statement, IS_FIRSTRUN after that is <${IS_FIRSTRUN}>"
endif

ifeq (${IS_FIRSTRUN},false)
        @echo "In false statement, IS_FIRSTRUN after that is <${IS_FIRSTRUN}>"
endif
#/垃圾箱/垃圾箱
IS_FIRSTRUN:=false
.假:第一轮
firstrun:export是_firstrun:=true
第一次跑步:跑步
.骗子:快跑
运行:
@echo“IS_FIRSTRUN IS”
ifeq(${IS_FIRSTRUN},true)
@echo“在true语句中,IS_FIRSTRUN在那之后是”
恩迪夫
ifeq(${IS_FIRSTRUN},false)
@echo“在错误的陈述中,是_FIRSTRUN,在那之后是”
恩迪夫
当我运行命令make run时,就会发生这种情况

make run
IS_FIRSTRUN is <false>
In false statement, IS_FIRSTRUN after that is <false>
make firstrun
IS_FIRSTRUN is <true>
In false statement, IS_FIRSTRUN after that is <true>
make run
第一次跑步是吗
在虚假陈述中,是_FIRSTRUN之后的
当我运行命令makefirstrun时,就会发生这种情况

make run
IS_FIRSTRUN is <false>
In false statement, IS_FIRSTRUN after that is <false>
make firstrun
IS_FIRSTRUN is <true>
In false statement, IS_FIRSTRUN after that is <true>
makefirstrun
第一次跑步是吗
在虚假陈述中,是_FIRSTRUN之后的

正如您在执行makefirstrun时所看到的,我希望执行if条件for true,但它没有执行。我想知道我做错了什么和为什么。

不能在
ifeq
条件语句中使用特定于目标的变量

make在读取makefiles时,会在第一次传递期间解析条件语句。特定于目标的变量直到第二阶段才定义,此时make实际上正在构建目标并运行配方。请参见上面的说明:

与自动变量一样,这些值仅在目标配方的上下文中可用(以及在其他特定于目标的分配中)

只是因为<代码> IFEQ 出现在配方的中间,并不意味着它是配方的一部分:只有用标签缩进的线条才是配方的一部分。

如果希望对特定于目标的变量执行检查,则需要在配方中使用shell条件构造,而不是生成条件构造,类似于以下内容:

run: 
        @echo "IS_FIRSTRUN is <${IS_FIRSTRUN}>"
        @if [ '${IS_FIRSTRUN}' = true ]; then \
            echo "In true statement, IS_FIRSTRUN after that is <${IS_FIRSTRUN}>"; \
        fi

        @if [ '${IS_FIRSTRUN}' = false ]; then \
            echo "In false statement, IS_FIRSTRUN after that is <${IS_FIRSTRUN}>"; \
        fi
运行:
@echo“IS_FIRSTRUN IS”
@如果['${IS_FIRSTRUN}'=true];然后\
echo“在true语句中,IS_FIRSTRUN在该语句之后”\
fi
@如果['${IS_FIRSTRUN}'=false];然后\
echo“在错误的陈述中,在那之后是第一次”\
fi

感谢您的澄清。这真的帮了大忙。