在makefile中,尽管变量具有不同的值,但不会被覆盖,这也会导致错误的ifeq

问题描述 投票:0回答:1

考虑此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

当我运行命令make run时,会发生这种情况。

make run
IS_FIRSTRUN is <false>
In false statement, IS_FIRSTRUN after that is <false>

当我运行命令make firstrun时,会发生这种情况。

make firstrun
IS_FIRSTRUN is <true>
In false statement, IS_FIRSTRUN after that is <true>

如执行make firstrun时所看到的,我希望执行true的if条件,但不会执行。我想知道我为什么做错什么。

makefile
1个回答
1
投票

您不能在ifeq条件语句中使用特定于目标的变量。]​​>

条件语句在第一次读取makefile文件时由make解析。在make实际构建目标并运行配方时,直到第二遍才定义特定于目标的变量。请参阅GNU make manual的内容:

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

[只是因为ifeq出现在配方的中间并不意味着它是配方的一部分:只有缩进TAB的行才是配方的一部分。

如果要对特定于目标的变量进行检查,则需要在配方中使用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
© www.soinside.com 2019 - 2024. All rights reserved.