在调用特定的Makefile规则时强制定义特定的环境变量
考虑下面的Makefile在调用特定的Makefile规则时强制定义特定的环境变量,makefile,Makefile,考虑下面的Makefile rulea: echo rulea ruleb: echo ruleb 我希望在调用ruleb时定义环境变量SPL\u VAR,否则中止。调用rulea时,不应强制执行此约束。如何实现相同的功能?首先假设“已定义”表示“不扩展为空字符串”,而“中止”表示“停止并以非零退出状态退出” 解决方案1:您可以使用shell条件来实现这一点: ruleb: @if [ -n "$$SPL_VAR" ]; then \ echo rul
rulea:
echo rulea
ruleb:
echo ruleb
我希望在调用ruleb
时定义环境变量SPL\u VAR
,否则中止。调用rulea
时,不应强制执行此约束。如何实现相同的功能?首先假设“已定义”表示“不扩展为空字符串”,而“中止”表示“停止并以非零退出状态退出”
解决方案1:您可以使用shell条件来实现这一点:
ruleb:
@if [ -n "$$SPL_VAR" ]; then \
echo ruleb; \
else \
echo "SPL_VAR undefined, aborting"; \
exit 1; \
fi
ruled:
ifeq ($(SPL_VAR),)
$(error "SPL_VAR undefined, aborting")
else
@echo ruled
endif
解决方案2:相同想法的更紧凑形式:
rulec:
@[ -n "$$SPL_VAR" ] && echo rulec || \
{ echo "SPL_VAR undefined, aborting"; exit 1; }
解决方案3:制作文档说明:
make启动时看到的每个环境变量都被转换为具有相同名称和值的make变量
因此,还可以使用make条件:
ruleb:
@if [ -n "$$SPL_VAR" ]; then \
echo ruleb; \
else \
echo "SPL_VAR undefined, aborting"; \
exit 1; \
fi
ruled:
ifeq ($(SPL_VAR),)
$(error "SPL_VAR undefined, aborting")
else
@echo ruled
endif
解决方案4:最后,您还可以使用makeif
功能:
rulee:
$(if $(SPL_VAR),@echo rulee,$(error "SPL_VAR undefined, aborting"))
演示:
host> unset SPL_VAR
host> make ruleb
SPL_VAR undefined, aborting
make: *** [Makefile:4: ruleb] Error 1
host> make rulec
SPL_VAR undefined, aborting
make: *** [Makefile:12: rulec] Error 1
host> make ruled
Makefile:17: *** "SPL_VAR undefined, aborting". Stop.
host> make rulee
Makefile:23: *** "SPL_VAR undefined, aborting". Stop.
host> export SPL_VAR=foo
host> make ruleb rulec ruled rulee
ruleb
rulec
ruled
rulee
注意:如果“中止”表示“不执行此规则,但不停止”,只需将
退出1
替换为退出0
,$(错误…
替换为$(警告…
)。您是否尝试添加规则a
,并调用它?根据我的说明,它应该不需要设置SPL\u VAR
set。我没有尝试,因为我知道它会像您期望的那样工作。我认为解决方案3和4不适用,因为Makefile条件更像是预处理器指令,不管调用的规则如何,都会被解析和处理。另外exit 1
不会中止规则的处理,不幸的是。它从子shell退出。@Holmes.Sherlock:您在rule c
中使用了空格而不是制表符。请记住,“制作食谱”的前缀是制表符。