$@"(将输出重定向到目标)是错误的吗?-6ren"> $@"(将输出重定向到目标)是错误的吗?-很难相信,但在我看来,常见的 Makefile 习惯用法 ">$@"是错误的。特别是,其规则具有失败但使用此重定向的命令的目标将在第一次失败但随后不会失败。这是因为即使命令失败,重定向在创建最新(尽管-6ren">
gpt4 book ai didi

makefile - 常见的 Makefile 习惯用法 "> $@"(将输出重定向到目标)是错误的吗?

转载 作者:行者123 更新时间:2023-12-03 23:29:03 25 4
gpt4 key购买 nike

很难相信,但在我看来,常见的 Makefile 习惯用法 ">$@"是错误的。特别是,其规则具有失败但使用此重定向的命令的目标将在第一次失败但随后不会失败。这是因为即使命令失败,重定向在创建最新(尽管长度为零)目标的意义上“成功”。

在我看来,正确的做法是重定向到一个临时对象,成功后将这个临时对象重命名为目标。

这是 Makefile 示例:

bad-target:
command-that-will-fail > $@

good-target:
command-that-will-fail > $@.tmp || ( rm $@.tmp; false )
mv $@.tmp $@

clean:
rm -f bad-target good-target

这是说明问题及其解决方案的一系列命令:
$ make clean
rm -f bad-target good-target

$ make bad-target
command-that-will-fail > bad-target
/bin/sh: command-that-will-fail: not found
make: *** [bad-target] Error 127

$ make bad-target
make: `bad-target' is up to date.

$ make good-target
command-that-will-fail > good-target.tmp || ( rm good-target.tmp; false )
/bin/sh: command-that-will-fail: not found
make: *** [good-target] Error 1

$ make good-target
command-that-will-fail > good-target.tmp || ( rm good-target.tmp; false )
/bin/sh: command-that-will-fail: not found
make: *** [good-target] Error 1

最佳答案

如果您使用 GNU make,您还可以添加 .DELETE_ON_ERROR生成文件的特殊目标。如果在执行该文件的命令期间出现错误,这将导致 make 删除输出文件:

all: foo.o

foo.o:
echo bogus! > $@
exit 1

.DELETE_ON_ERROR:

这是此生成文件的示例:
$ gmake
echo bogus! > foo.o
exit 1
gmake: *** [foo.o] Error 1
gmake: *** Deleting file `foo.o'

这比您的版本更易于使用,因为您不需要修改 makefile 中的每个规则。

关于makefile - 常见的 Makefile 习惯用法 "> $@"(将输出重定向到目标)是错误的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3587182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com