Make正在删除我的目标。为什么?

时间:2015-08-09 08:15:32

标签: makefile

来自docs

  

通常当配方行失败时,如果它已更改目标文件   根本没有,文件已损坏且无法使用 - 或者至少不是   完全更新。然而该文件的时间戳表示它现在已经完成了   date,所以下次'make'运行时,它不会尝试更新该文件。   情况与外壳被信号杀死时的情况相同;   * note Interrupts ::。所以一般来说,正确的做法是删除   目标文件,如果配方在开始更改文件后失败。   如果'.DELETE_ON_ERROR'显示为目标,'make'将执行此操作。这是   几乎总是你想做什么'做',但它不是历史的   实践;因此,为了兼容性,您必须明确请求它。

所以,这里有一个makefile:

# The idea here is to auto-generate the file ('make.include')
#    and to use it as a makefile.
# For simplicity, I replaced the "auto-generate" part, with "touch".
# I also simplified the dependency-tree with 'phony'.
#    In practice, we re-generate, only when "need" to.

make.include : phony
    +touch '$@'
    make -f '$@'

.PHONY: phony

运行:

$ make -q

我明白了:

touch 'make.include'
make: *** Deleting file 'make.include'

现在,我没有看到如何阻止make删除这个新自动生成的'make.include'(这可能是一个非常昂贵的重新运行过程),除非我诉诸{{1}特殊目标。

但是,要求用户明确定义他们的“宝贵”目标,并不符合上述文档的引用。正确?

1 个答案:

答案 0 :(得分:0)

这是因为您在+中使用+touch '$@'并使用make选项执行-q。从GNU Make Manual -q选项

  

“问题模式”。不要运行任何食谱或打印   任何事情;只返回退出状态,如果指定则为零   目标已经是最新的,如果需要重建,或者   两个如果遇到错误。请参阅而不是执行食谱。

+符号仅在使用make-t-n选项执行-q时才相关,它告诉make执行任何命令使用make-t-n中的任何一个选项执行-q前。因此,当您使用makefile执行当前make -q时,您要求make检查所有内容是否为最新而不运行任何命令,但因为您已指定+ } touch '$@' make之前必须执行此命令。要在执行之前保留所有内容make -q make必须删除使用+touch '$@'创建的文件。

专门回答你的问题。如果您不希望make删除make.include,那么您可以在问题中指定的make上没有-q选项的情况下运行makefile。< / p>

但是,目标的配方,即make.include不应该使用make -f make.include调用自己。重写makefile可能会更好,以便make.include的配方只创建make.include,然后在另一个配方中使用make -f make.include调用它。

make.include: 
    +touch $@

all: make.include
    make -f $<