来自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}特殊目标。
但是,要求用户明确定义他们的“宝贵”目标,并不符合上述文档的引用。正确?
答案 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 $<