Bash makefile:如果变量为空,则单个make目标失败
我对构建makefile还不熟悉,并且正在尝试确定如果变量为空,构建目标将如何失败。我希望能够将变量作为环境变量或make参数传入 假设我有这样一个makefile:Bash makefile:如果变量为空,则单个make目标失败,bash,makefile,build,scripting,gnu-make,Bash,Makefile,Build,Scripting,Gnu Make,我对构建makefile还不熟悉,并且正在尝试确定如果变量为空,构建目标将如何失败。我希望能够将变量作为环境变量或make参数传入 假设我有这样一个makefile: VER ?= step0: echo "step0 should work" step1: echo "step1 should enforce variable" ifeq($(VER), "") $(error VER is not set) endif echo "Su
VER ?=
step0:
echo "step0 should work"
step1:
echo "step1 should enforce variable"
ifeq($(VER), "")
$(error VER is not set)
endif
echo "Success: Value of Ver ${VER}"
step2:
echo "step2 should work"
step1:
some command
ifeq ($(A),$(B))
another command
endif
yet another command
我希望能够运行以下测试用例:
VER="foo" make step1
# should result in printing the "Success:" line
或
或
或
但是,当我使用上述任何一种方法运行make步骤
时,我总是会得到VER未设置
错误
简单地说,如何在特定的make目标中测试变量,并在未设置时以错误消息响应?(但其他make目标并不关心是否设置了变量)以下几点:
首先,必须将Make命令和shell命令整齐地分开。这:
ifeq ($(A),$(B))
...
endif
是Make语法。如果将ifeq(…)
传递给shell,您可能会遇到问题。makefile配方中的命令是要传递给shell的shell命令。若要在规则的中间使用“生成<代码> IFEQ 条件”,请这样做:
VER ?=
step0:
echo "step0 should work"
step1:
echo "step1 should enforce variable"
ifeq($(VER), "")
$(error VER is not set)
endif
echo "Success: Value of Ver ${VER}"
step2:
echo "step2 should work"
step1:
some command
ifeq ($(A),$(B))
another command
endif
yet another command
请注意,ifeq
和endif
前面没有选项卡;这些不是要传递给shell的命令,而是供Make使用的命令
第二,这:
ifeq(...)
ifeq ($(VER), "")
应该是这样的:
ifeq (...)
ifeq ($(VER),)
空间很重要(至少在我的Make版本中是如此)
第三,这:
ifeq(...)
ifeq ($(VER), "")
应该是这样的:
ifeq (...)
ifeq ($(VER),)
除非您确实希望变量包含字符串'''''
(你可以自己最后一次发现它们,单独使用ifeq
;总是单独测试新工具。)
在这些更改之后,makefile对我有效。如果对您不起作用,请告诉我,我们会解决的。有几件事:
首先,必须将Make命令和shell命令整齐地分开。这:
ifeq ($(A),$(B))
...
endif
是Make语法。如果将ifeq(…)
传递给shell,您可能会遇到问题。makefile配方中的命令是要传递给shell的shell命令。若要在规则的中间使用“生成<代码> IFEQ 条件”,请这样做:
VER ?=
step0:
echo "step0 should work"
step1:
echo "step1 should enforce variable"
ifeq($(VER), "")
$(error VER is not set)
endif
echo "Success: Value of Ver ${VER}"
step2:
echo "step2 should work"
step1:
some command
ifeq ($(A),$(B))
another command
endif
yet another command
请注意,ifeq
和endif
前面没有选项卡;这些不是要传递给shell的命令,而是供Make使用的命令
第二,这:
ifeq(...)
ifeq ($(VER), "")
应该是这样的:
ifeq (...)
ifeq ($(VER),)
空间很重要(至少在我的Make版本中是如此)
第三,这:
ifeq(...)
ifeq ($(VER), "")
应该是这样的:
ifeq (...)
ifeq ($(VER),)
除非您确实希望变量包含字符串'''''
(你可以自己最后一次发现它们,单独使用ifeq
;总是单独测试新工具。)
在这些更改之后,makefile对我有效。如果对您不起作用,请告诉我,我们会解决的。谢谢您帮助我解决这个问题。这有助于了解make语法的缩进与目标块无关。有了你的建议,我得以使它发挥作用。再次感谢。谢谢你帮我解决这个问题。这有助于了解make语法的缩进与目标块无关。有了你的建议,我得以使它发挥作用。再次感谢。