根据Abort makefile if variable not set的建议我尝试使用ifndef
,但它无效。
生成文件:
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
。
答案 0 :(得分:4)
从技术上讲,是的,这是一个空白问题,但从根本上说这是一个范围问题。
ifndef... endif
是 Make 条件。所以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
你把一个TAB放在三行(ifndef...
,$(error...
和endif
)的前面,所以假设那些是命令,当有时候传递给shell foo
食谱已执行。当Make执行规则时,它会扩展Make-syntax语句$(error...)
- 并以错误终止 - 然后将任何内容传递给shell。
答案 1 :(得分:1)
您可以使用“if”功能。
foo :
$(if $(BAR),,$(error Must set BAR))