Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 命令失败时如何中止生成文件?_Makefile_Gnu Make - Fatal编程技术网

Makefile 命令失败时如何中止生成文件?

Makefile 命令失败时如何中止生成文件?,makefile,gnu-make,Makefile,Gnu Make,在开始编译之前,我想检查是否有第三方库可用。使用pkg config很容易,但我想要一条比以下更好的错误消息: pkg-config gtk+-3.0 make: *** [Makefile:17: gtk+-3.0] Error 1 在阅读了这里的一些答案后,我发现了一个令人满意的代码: gtk+-3.0: $(shell pkg-config $@) ifneq ($(.SHELLSTATUS),0) $(error $@ is not installed)

在开始编译之前,我想检查是否有第三方库可用。使用
pkg config
很容易,但我想要一条比以下更好的错误消息:

pkg-config gtk+-3.0
make: *** [Makefile:17: gtk+-3.0] Error 1
在阅读了这里的一些答案后,我发现了一个令人满意的代码:

gtk+-3.0:
    $(shell pkg-config $@)
    ifneq ($(.SHELLSTATUS),0)
        $(error $@ is not installed)
    endif
但错误总是被触发的

如果我将
$(错误)
替换为
echo
我有一个语法错误:

ifneq (0,0)
/bin/sh: -c: line 0: syntax error near unexpected token `0,0'
/bin/sh: -c: line 0: `ifneq (0,0)'
make: *** [Makefile:3: gtk+-3.0] Error 1
archlinux上的GNU Make 4.2.1。

当命令失败时,Make已经停止。只要写

gtk+-3.0:
        pkg-config $@
或者为了更好地控制信息

gtk+-3.0:
        @if pkg-config $@; then \
           printf '%s\n' "All good!"; \
        else \
           printf '%s\n' "Not installed." >&2; \
           exit 1; \
        fi
注意make总是使用bourneshell(可能是
/bin/sh
),因此对于简单的命令不需要
$(shell)
。使用make条件也不像您预期的那样。GNU make手册提供了所有详细信息

Make在命令失败时已经停止。只要写

gtk+-3.0:
        pkg-config $@
或者为了更好地控制信息

gtk+-3.0:
        @if pkg-config $@; then \
           printf '%s\n' "All good!"; \
        else \
           printf '%s\n' "Not installed." >&2; \
           exit 1; \
        fi

注意make总是使用bourneshell(可能是
/bin/sh
),因此对于简单的命令不需要
$(shell)
。使用make条件也不像您预期的那样。GNU make手册提供了所有详细信息

我不理解
$(shell…
在这里的用法。只需使用
pkg config$@
作为命令,并删除
ifneq…
内容。对不起,我忘记了问题的一部分:“使用用户可以理解的消息中止”。我不理解
$(shell…
这里。只需使用
pkg config$@
作为命令,并删除
ifneq…
内容。对不起,我忘记了问题的一部分:“使用用户可以理解的消息中止”。