Makefile -- 如果未设置变量则出错

nat*_*ire 2 makefile

如果未设置变量,则遵循Abort makefile 中的建议我尝试使用ifndef但它不起作用。

生成文件:

foo:
        ifndef BAR
        $(error "Must set BAR")
        endif
Run Code Online (Sandbox Code Playgroud)

make foo BAR=quux不起作用:

Makfile:2: *** "Must set BAR". Stop.
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?是空格问题吗?还是我完全误解了?

(我正在使用 GNU Make)

我也试过:

foo:
ifndef BAR
$(error "Must set BAR")
endif
        echo $(BAR)
Run Code Online (Sandbox Code Playgroud)

这似乎是一种工作,但ifndef如果调用 Makefile 中更下方的目标(不需要设置变量),仍然会导致调用。

Bet*_*eta 6

从技术上讲,是的,这是一个空白问题,但更根本的是,它是一个范围问题。

ifndef... endif是一个制作条件。所以 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
Run Code Online (Sandbox Code Playgroud)

但是你做的是这样的:

foo:
    ifndef BAR
    $(error "Must set BAR")
    endif
Run Code Online (Sandbox Code Playgroud)

您在三行(ifndef...,$(error...endif)前放置了一个制表符,因此 Make 假定这些是命令,在foo配方执行时传递给 shell 。当 Make 执行该规则时,它$(error...)在将任何内容传递给 shell 之前扩展了 Make-syntax 语句——并以错误终止。