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

问题描述:

如果你读了GNU进行手动的Catalog of Rules部分,事实证明,它识别后缀之一是.out,并有一个内置的规则:为什么GNU Make有一个默认规则来从文件创建file.out?

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

这意味着,如果你有一个文件xyz在一个目录中,你可以通过简单地输入make xyz.out来创建xyz.out

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

  • 谁从这个规则中获益?
  • 人们在什么情况下使用?

很显然,我这么问是因为我设法运行规则的犯规。我有一些规则,如:

test.01: ${PROGRAM} ${DRIVER} test.01.tst test.01.out ${DATA.01} 
    ${DRIVER} ${D_FLAGS} [email protected] 

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

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

我也试图与下降的.out后缀:

.SUFFIXES: 
.SUFFIXES: .sh 

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

我想我将不得不解决这个错误GNU的功能,通过改变我的后缀为.req或类似的东西做,但它是一个讨厌和我留下疑惑,为什么.out规则标准GNU Make规则集的一部分。

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

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

%.out : % 

(没有配方),它会删除模式规则。

+0

谢谢。所以,答案(如果有的话)在时间的迷雾中迷失了 - 我希望我能说我很惊讶,但我不是。有关如何抑制模式规则的信息很有帮助;谢谢你。确认以'.SUFFIXES'开头无助于抑制模式规则也是有帮助的。 (我推断,你自己并没有使用这个规则来创建文件 - 这也不奇怪) –

+0

我个人没有在我的makefile中使用任何buit-in规则。根据我的经验,它们仅适用于最简单的环境。一般来说,我总是发现我需要重新定义编译模式以添加新变量,而其他模块只是浪费时间。所以,我的makefiles通常包含一些段来删除所有内置规则。 – MadScientist

+1

如果你想知道'的原因。你必须问Roland McGrath或者RMS :) – MadScientist