【问题标题】:Makefile recipe for target failed when executing phony command执行虚假命令时,目标的 Makefile 配方失败
【发布时间】:2017-10-20 19:49:26
【问题描述】:

以下 makefile 是为生成两个文件的差异而创建的, file1file2:

.PHONY: patch
patch:
    diff file1 file2 > file12.patch

file1的内容:

xxx

file2

xxx
yyy

但是当我发出make patch时,错误来了:

diff file1 file2 > file12.patch
Makefile:3: recipe for target 'patch' failed
make: *** [patch] Error 1

但是,可以通过以下方式在终端中生成补丁: diff file1 file2 > file12.patch.

file12.patch 的内容

1a2
> yyy

令人惊讶的是,我回去检查文件夹,make patch 确实生成了正确的补丁文件。

我无法理解的是 make 错误?例如这个错误肯定会停止make过程,之后跳过所有命令。

有人能解释一下这种制造行为吗?谢谢!

【问题讨论】:

    标签: makefile


    【解决方案1】:

    无法创建上面引用的 makefile:.PHONY 目标的配方被忽略。它必须是这样的:

    .PHONY: patch
    patch:
            diff file1 file2 > file12.patch
    

    Make 通过查看命令的退出代码来确定命令是成功还是失败。如果退出代码为 0,则 make 假定命令成功。如果它不是 0,则假定它失败了。

    您看到的错误表明 diff 命令以非 0 退出代码退出。

    diff 手册说:

    退出状态 0 表示没有发现差异,1 表示有些 发现了差异,2代表麻烦。

    因此,由于您的差异确实发现了一些差异,因此它以代码 1 退出,这使得解释为失败。您可能希望将您的食谱更改为:

    .PHONY: patch
    patch:
            diff file1 file2 > file12.patch || [ $? -eq 1 ]
    

    所以如果diff 失败,您可以进一步检查退出代码是否为 2。

    【讨论】:

    • 修复:Makefile 中的最后退出状态$? 应写为$$?
    猜你喜欢
    • 2013-11-08
    • 2017-02-15
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 2017-05-17
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多