我希望在我的makefile中检测一个条件,即某个工具的版本错误,并强制make失败,同时输出一个错误消息指示该项不是正确的版本。
有人能给出一个实现的例子吗?
我尝试了以下方式,但它不是正确的语法:
ifeq "$(shell svnversion --version | sed s/[^0-9\.]*://)" "1.4"
$error("Bad svnversion v1.4, please install v1.6")
endif
感谢。来自手册:
$(error Bad svn version v1.4, please install v1.6)
这将导致make
出现致命错误:
$ make
Makefile:2: *** Bad svn version v1.4, please install v1.6. Stop.
define err_mesg = 您的多行错误消息... endef
,然后使用 $(error $(err_mesg))
。Make将保留并输出err_mesg
,就像它原本写的那样。 - Alberto$
符号前面有空格并且不在配方中,会出现错误。 - M.M虽然$(error...)会起作用,但有时使用一个失败的规则更容易
test_svn_version:
@if [ $$(svn --version --quiet | \
perl -ne '@a=split(/\./); \
print $$a[0]*10000 + $$a[1]*100 + $$a[2]') \
-lt 10600 ]; \
then \
echo >&2 "Svn version $$(svn --version --quiet) too old; upgrade to v1.6";
false; \
fi
然后你将test_svn_version设为你最上层目标的先决条件。
$(error)
(解析时检查)和 false
或 exit 1
(运行时目标)之间的规则是:如果您的构建无法继续,请使用 $(error)
;否则,如果只有特定的目标在没有此前提条件的情况下无法构建,请使它们依赖于 test_svn_version
。 - Victor Sergienko条件语句也需要注意。
ifeq ($(shell svnversion --version | sed s/[^0-9\.]*://), 1.4) $(error 错误的svnversion版本v1.4,请安装v1.6) endif
--version
输出包含的不仅仅是版本号。尝试使用类似于ifeq "$(shell svn --version | sed -nE -e '/version/s/^.*([0-9]+\.[0-9]\+)\..*$$/\1/p')" "1.4"
的命令。 - D.Shawley^.*\([0-9][0-9]*\.[0-9][0-9]*\)\..*$$
。使用-E
可以启用扩展正则表达式,这允许使用更紧凑的表达式以及其他好处。 - D.Shawleyifeq ($(shell svnversion --version | sed '<regexp>'))
这样可以避免担心 shell 会吞噬和误解哪些特殊字符(除了单引号本身:将引用字符串中的单引号替换为'\''
(单引号反斜杠单引号单引号
) 来转义它们)。 - bambams