如何在gnumake文件中强制出现错误

80

我希望在我的makefile中检测一个条件,即某个工具的版本错误,并强制make失败,同时输出一个错误消息指示该项不是正确的版本。

有人能给出一个实现的例子吗?

我尝试了以下方式,但它不是正确的语法:

ifeq "$(shell svnversion --version | sed s/[^0-9\.]*://)" "1.4"
$error("Bad svnversion v1.4, please install v1.6")
endif
感谢。

你可能想要将此与1.4进行比较。我已经安装了1.4.4版本,而--version输出包含的不仅仅是版本号。尝试使用类似于ifeq "$(shell svn --version | sed -nE -e '/version/s/^.*([0-9]+\.[0-9]\+)\..*$$/\1/p')" "1.4"的命令。 - D.Shawley
我的sed不接受-E选项:“sed:无效选项--E” - WilliamKF
1
它必须是make吗?我倾向于在configure中编写这些测试。 - Dirk Eddelbuettel
啊..那么请将表达式中的_match_部分更改为^.*\([0-9][0-9]*\.[0-9][0-9]*\)\..*$$。使用-E可以启用扩展正则表达式,这允许使用更紧凑的表达式以及其他好处。 - D.Shawley
我建议在 shell 中也引用正则表达式,以确保安全。例如:ifeq ($(shell svnversion --version | sed '<regexp>')) 这样可以避免担心 shell 会吞噬和误解哪些特殊字符(除了单引号本身:将引用字符串中的单引号替换为 '\'' (单引号反斜杠单引号单引号) 来转义它们)。 - bambams
3个回答

106

来自手册

$(error Bad svn version v1.4, please install v1.6)

这将导致make出现致命错误:

$ make
Makefile:2: *** Bad svn version v1.4, please install v1.6.  Stop.

2
顺便提一下,我想输出一个多行错误消息。为此,您可以 define err_mesg = 您的多行错误消息... endef,然后使用 $(error $(err_mesg))。Make将保留并输出err_mesg,就像它原本写的那样。 - Alberto
8
小小的陷阱:如果 $ 符号前面有空格并且不在配方中,会出现错误。 - M.M
4
在与shell条件语句一起使用时,似乎这并不起作用。 - CMCDragonkai

14

虽然$(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设为你最上层目标的先决条件。


这没起作用,我收到以下错误消息:/bin/sh: -c: line 0: unexpected EOF while looking for matching `)' /bin/sh: -c: line 1: syntax error: unexpected end of file - WilliamKF
1
@WilliamKF -- 在一行的末尾有一个虚假的空格在\后面导致了那个问题。我还修复了缺失的|。 - Chris Dodd
1
选择 $(error)(解析时检查)和 falseexit 1(运行时目标)之间的规则是:如果您的构建无法继续,请使用 $(error);否则,如果只有特定的目标在没有此前提条件的情况下无法构建,请使它们依赖于 test_svn_version - Victor Sergienko
非常感谢您的回答!您对一个相关问题:如何实现“检查目标”帮助了我很多。 - claudio

8

条件语句也需要注意。

ifeq ($(shell svnversion --version | sed s/[^0-9\.]*://), 1.4) 
    $(error 错误的svnversion版本v1.4,请安装v1.6)
endif 

3
为了使用这个,我不能在 $(error ...) 标签中。 - Jerinaw
No tabs, one must use spaces - Mikolasan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接