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

Makefile Make正在删除我的目标。为什么?,makefile,Makefile,从: 通常当配方行失败时,如果它更改了目标文件 总之,该文件已损坏,无法使用——或者至少没有 完全更新。但该文件的时间戳显示,现在该文件的 日期,因此下次运行“make”时,它不会尝试更新该文件。 情况与炮弹被信号击毙时一样; *注意中断::。因此,通常正确的做法是删除 如果配方在开始更改文件后失败,则返回目标文件。 如果“.DELETE_ON_ERROR”显示为目标,则“make”将执行此操作。这是 几乎总是你想要“制造”做什么,但这不是历史 实践;因此,为了兼容性,您必须显式地请求它 所以,

从:

通常当配方行失败时,如果它更改了目标文件 总之,该文件已损坏,无法使用——或者至少没有 完全更新。但该文件的时间戳显示,现在该文件的 日期,因此下次运行“make”时,它不会尝试更新该文件。 情况与炮弹被信号击毙时一样; *注意中断::。因此,通常正确的做法是删除 如果配方在开始更改文件后失败,则返回目标文件。 如果“.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”(重新运行这个过程可能会花费相当大的成本),除非我求助于
.PRECIOUS
特殊目标


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

这是因为您在
+触摸“$@”
中使用
+
,并使用
-q
选项执行
make
。从中选择
-q
选项

“问题模式”。不要运行任何配方或打印 任何东西如果指定了 目标已经是最新的,如果需要重新制作,则为一个,或者 如果遇到错误,则返回两个。查看而不是执行配方

+
符号仅在使用
-t
-n
-q
选项执行
make
时才相关,它告诉make执行它前面的任何命令
make
使用任何选项执行
-t
-n
-q
。因此,当您使用
make-q
执行当前的
makefile
时,您要求
make
在不运行任何命令的情况下检查所有内容是否都是最新的,但因为您在
触摸“$@”
之前指定了
+
make
必须执行此命令。然后,要使所有内容保持在执行
make-q
make
之前的状态,必须删除使用
+触摸“$@”
创建的文件

具体回答你的问题。如果您不希望
make
删除
make.include
,则可以运行
make
,而不使用问题中指定的
makefile
上的
-q
选项

但是,目标的配方,即
make.include
不应使用
make-f make.include调用其自身。最好重写
make文件
,以便
make.include
的配方只创建
make.include
,然后在另一个配方中使用
make-f make.include调用它

make.include: 
    +touch $@

all: make.include
    make -f $<
make.include:
+触碰$@
全部:包括
make-f$<

这是因为您在
+触摸“$@”
中使用
+
并使用
-q
选项执行
make
。从中选择
-q
选项

“问题模式”。不要运行任何配方或打印 任何东西如果指定了 目标已经是最新的,如果需要重新制作,则为一个,或者 如果遇到错误,则返回两个。查看而不是执行配方

+
符号仅在使用
-t
-n
-q
选项执行
make
时才相关,它告诉make执行它前面的任何命令
make
使用任何选项执行
-t
-n
-q
。因此,当您使用
make-q
执行当前的
makefile
时,您要求
make
在不运行任何命令的情况下检查所有内容是否都是最新的,但因为您在
触摸“$@”
之前指定了
+
make
必须执行此命令。然后,要使所有内容保持在执行
make-q
make
之前的状态,必须删除使用
+触摸“$@”
创建的文件

具体回答你的问题。如果您不希望
make
删除
make.include
,则可以运行
make
,而不使用问题中指定的
makefile
上的
-q
选项

但是,目标的配方,即
make.include
不应使用
make-f make.include调用其自身。最好重写
make文件
,以便
make.include
的配方只创建
make.include
,然后在另一个配方中使用
make-f make.include调用它

make.include: 
    +touch $@

all: make.include
    make -f $<
make.include:
+触碰$@
全部:包括
make-f$<