.make 和管道的 DELETE_ON_ERROR 行为

.make 和管道的 DELETE_ON_ERROR 行为

如果规则失败,目标.DELETE_ON_ERROR将告诉 make 删除目标。但这不适用于管道,因为退出状态值$?保存的是管道中最后一个程序的值。例如,以下 makefile 不会删除新创建的文件

.DELETE_ON_ERROR:
foo:
    false | true > foo

如果管道中的任何程序失败(即,如果数组的任何元素中有非零值$PIPESTATUS),是否有办法让 make 将规则视为失败?

答案1

如果您使用的是 bash,您还可以全局设置 pipelinefail 选项。我在 makefile 的开头有过一次,即使在管道中间它也能捕获错误:

# Make sure any errors in the middle of a pipe cause the build to fail
SHELL=/bin/bash -e -o pipefail

(根据 MadScientist 的评论从 /bin/sh 更改为 /bin/bash)

答案2

如果您确定您的 makefile 将具有bash其 shell,您可以尝试设置 pipelinefail 选项:

SHELL=bash
.DELETE_ON_ERROR:
foo:
    set -o pipefail; false | true > foo

由于规则的每一行都在单独的 shell 实例中运行,因此您必须将其添加set -o pipefail到要应用此规则的每一行。

如果您希望它可以在任何 POSIX 上工作sh(而不仅仅是 POSIX bash),那么答案就更加复杂。

相关内容