Makefile 为什么GNU Make有从文件创建file.out的默认规则?

Makefile 为什么GNU Make有从文件创建file.out的默认规则?,makefile,gnu-make,Makefile,Gnu Make,如果您阅读GNU Make手册的一节,就会发现它识别的后缀之一是.out,并且有一个内置规则: %.out: % # commands to execute (built-in): @rm -f $@ cp $< $@ 其中名称test.01是虚假目标,但其中一个依赖项是test.01.out。当主动运行时,不使用make-n;这很好,这给了我很多错误,比如: make[1]: Circular test.01 <- test.01.out dependency

如果您阅读GNU Make手册的一节,就会发现它识别的后缀之一是.out,并且有一个内置规则:

%.out: %
#  commands to execute (built-in):
    @rm -f $@ 
    cp $< $@
其中名称test.01是虚假目标,但其中一个依赖项是test.01.out。当主动运行时,不使用make-n;这很好,这给了我很多错误,比如:

make[1]: Circular test.01 <- test.01.out dependency dropped.
但这似乎并没有像我预期的那样,取消规则。这是GNU Make的预期功能吗


我想我必须通过将后缀改为.req或类似的东西来解决GNU Make的这个bug特性,但这是一个麻烦,我对.out规则为什么是标准GNU Make规则集的一部分感到困惑。

我不知道您关于使用此规则的问题的答案。我所能说的是,当GNUMake在1992年1月第一次被检查到源代码控制中时,这个规则就已经存在了。任何变更日志中都没有提到它,所以它可能可以追溯到最早的版本

实际规则被定义为模式规则,因此更改.suffix没有帮助。要摆脱它,您可以使用:

%.out : %

没有将删除模式规则的配方。

谢谢。因此,如果有一个答案是迷失在时间的迷雾中——我希望我能说我很惊讶,但我不是。有关如何抑制模式规则的信息很有帮助;谢谢你。确认使用.suffix进行fuzzing不会有助于抑制模式规则也是有帮助的。通过推断,我认为您自己没有使用该规则创建文件——这也不足为奇!我个人不在我的makefile中使用任何内置规则。根据我的经验,它们只对最简单的环境有用。一般来说,我总是发现我需要重新定义编译模式来添加新的变量,而其他的只是浪费时间。因此,我的makefile通常包含删除所有内置规则的节。如果您想知道.out的原因,您必须询问罗兰·麦格拉斯或RMS:@madscietric,或者可能是Unix神:-特别是参考文献3No,它与.out无关。从Jonathan的问题中可以看出,这不是一个链接行,而是一个复制命令。另外,像%.out%这样的模式将根据先决条件a创建文件a.out,这显然不适合编译程序。GNUMake确实有一个用于链接程序的内置模式,但它是%:%.o,它将从foo.o构建foo。
.SUFFIXES:
.SUFFIXES: .sh
%.out : %