为什么GNU Make有一个默认规则来从文件创建file.out?

时间:2017-10-14 19:48:28

标签: makefile gnu-make

如果你阅读了GNU Make手册的Catalog of Rules部分,结果发现它识别的后缀之一是.out并且有一个内置规则:

%.out: %
#  commands to execute (built-in):
    @rm -f $@ 
    cp $< $@

这意味着如果目录中有文件xyz,只需输入xyz.out即可创建make xyz.out

我的问题是(同一问题的两个变体):

  • 谁从这条规则中受益?
  • 人们在什么情况下使用它?

显然,我问,因为我设法违反规则。我有一些规则,如:

test.01: ${PROGRAM} ${DRIVER} test.01.tst test.01.out ${DATA.01}
    ${DRIVER} ${D_FLAGS} $@

其中名称test.01是假目标,但其中一个依赖项是test.01.out。当积极运行时(不使用make -n;工作正常),这会给我带来很多错误,如:

make[1]: Circular test.01 <- test.01.out dependency dropped.

我还尝试删除.out后缀:

.SUFFIXES:
.SUFFIXES: .sh

并没有像我预期的那样中性.out规则。这是GNU Make的预期功能吗?

我想我必须通过将后缀更改为.req或类似的东西来解决GNU Make的 bug 功能,但这是一个令人讨厌的问题我和我#39; m对为什么.out规则是标准GNU Make规则集的一部分感到困惑。

1 个答案:

答案 0 :(得分:1)

我不知道您对使用此规则的问题的答案。我可以说的是,1992年1月GNU make首次进入源代码控制时,这条规则已经存在。在任何ChangeLog中都没有提到它,所以可能它可以追溯到最早的版本。

实际规则被定义为模式规则,因此更改.SUFFIXES无济于事。要摆脱它,你可以使用:

%.out : %

(没有食谱)将删除模式规则。