如果你阅读了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规则集的一部分感到困惑。
答案 0 :(得分:1)
我不知道您对使用此规则的问题的答案。我可以说的是,1992年1月GNU make首次进入源代码控制时,这条规则已经存在。在任何ChangeLog中都没有提到它,所以可能它可以追溯到最早的版本。
实际规则被定义为模式规则,因此更改.SUFFIXES
无济于事。要摆脱它,你可以使用:
%.out : %
(没有食谱)将删除模式规则。