如果未设置变量,则遵循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 中更下方的目标(不需要设置变量),仍然会导致调用。
从技术上讲,是的,这是一个空白问题,但更根本的是,它是一个范围问题。
该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 语句——并以错误终止。