Makefile -- 如果变量未设置,则报错

4
根据 Abort makefile if variable not set 上的建议,我正在尝试使用 ifndef,但它不起作用。

Makefile:

foo:
        ifndef BAR
        $(error "Must set BAR")
        endif

但是,make foo BAR=quux 不起作用:
Makfile:2: *** "Must set BAR". Stop.

什么情况?是空格的问题吗?还是我完全误解了?(我正在使用GNU Make)我也尝试过:
foo:
ifndef BAR
$(error "Must set BAR")
endif
        echo $(BAR)

"这似乎有点起作用,但如果在 Makefile 中调用了进一步的目标(该目标不要求设置变量),则仍会导致 ifndef 被调用。"
2个回答

9
从技术上讲,是的,这是一个空格问题,但更根本的是作用域问题。
#ifndef ... endif 是Makefile的条件语句。因此,在执行任何规则之前,Make会对其进行评估。由于ifndef不是配方的一部分,因此它不应该前面加TAB。这样就可以正常工作:
ifndef BAR
$(error "Must set BAR") # this is a Make error
endif

foo:
ifndef BAR
    echo "Must set BAR" # this is a shell command
    exit 1              # this is another shell command
endif

但是你所做的是这样的:
foo:
    ifndef BAR
    $(error "Must set BAR")
    endif

您在这三行代码(ifndef...$(error...endif)前面加了一个TAB,因此Make认为这些是命令,在执行foo规则时传递给shell。当Make执行规则时,它展开了Make语法的语句$(error...)并在将任何内容传递给shell之前终止并出现了错误。


2
您可以使用“if”函数来实现此目的。 foo : $(if $(BAR),,$(error 必须设置BAR))
注意:本文中保留了HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接