Makefile 如何撤消中间文件删除

Makefile 如何撤消中间文件删除,makefile,Makefile,我有一个软件栈,它创建一些中间文件作为构建过程的一部分。出现了一些问题,构建中断。我想看看那些中间生成的文件。令我惊讶的是,这些文件正在作为构建过程的一部分被删除 Removing intermediate files... rm fact_test_without_proxies.c fact_test_main.c fact_test_without_proxies.o 我浏览了makefile,没有看到任何明确的删除规则。可以有任何隐式规则来删除中间文件。如果是,如何禁用这些隐式规则 只

我有一个软件栈,它创建一些中间文件作为构建过程的一部分。出现了一些问题,构建中断。我想看看那些中间生成的文件。令我惊讶的是,这些文件正在作为构建过程的一部分被删除

Removing intermediate files...
rm fact_test_without_proxies.c fact_test_main.c fact_test_without_proxies.o
我浏览了makefile,没有看到任何明确的删除规则。可以有任何隐式规则来删除中间文件。如果是,如何禁用这些隐式规则

只有在使用
--debug
选项执行make时,我才能看到打印
删除中间文件…

skmt@tux:~/coding/factorial/ut$ make --debug
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for x86_64-pc-linux-gnu
Reading makefiles...
Updating goal targets....
 File `check' does not exist.
   File `test_dept_run' does not exist.
     File `fact_test' does not exist.
       File `fact_using_proxies.o' does not exist.
           File `fact_test_without_proxies' does not exist.
            File `fact_test_without_proxies.o' does not exist.
             File `fact_test_without_proxies.c' does not exist.
              File `fact_test_main.c' does not exist.
             Must remake target `fact_test_main.c'.
nm -p fact_test.o | build_main_from_symbols >fact_test_main.c
             Successfully remade target file `fact_test_main.c'.
            Must remake target `fact_test_without_proxies.c'.
cp fact_test_main.c fact_test_without_proxies.c
            Successfully remade target file `fact_test_without_proxies.c'.
           Must remake target `fact_test_without_proxies.o'.
gcc  -I../src  -c -o fact_test_without_proxies.o fact_test_without_proxies.c
           Successfully remade target file `fact_test_without_proxies.o'.
          Must remake target `fact_test_without_proxies'.
gcc   fact_test_without_proxies.o fact.o fact_test.o   -o fact_test_without_proxies
fact.o: In function `unknown':
fact.c:(.text+0x67): undefined reference to `do_update'
collect2: ld returned 1 exit status
make: *** [fact_test_without_proxies] Error 1
Removing intermediate files...
rm fact_test_without_proxies.c fact_test_main.c fact_test_without_proxies.o

如果您使用的是GNUMake,则可以使用特殊目标
.preciouse

.PRECIOUS: fact_test_without_proxies.c fact_test_main.c fact_test_without_proxies.o
或者只是

.PRECIOUS: %.c %.o

它的唯一作用是,如果Make被终止或中断,这些文件将不会被删除。

您还可以使用.SECONDARY,它将保留指定的文件,即使生成未中断

e、 g


对目标的使用有限制,这会影响到以下人员的行为:

我有目标A/%.foo:和B/%.foo:,所以我设置了:

.PRECIOUS: %.foo
这是行不通的;我不明白为什么,但扩展不是这样工作的;我必须明确地列出目标,正如它们所写的那样:

.PRECIOUS: A/%.foo B/%.foo
但即使在阅读之后,我也不明白.PRECIOUS:和.SECONDARY:之间的区别


可以接受使用那些没有依赖项的特殊目标,但我认为这将是非常肮脏的编码,并且会产生副作用。有些人只是将.PRECIOUS:或.SECONDARY:放置在没有dep的情况下,然后,他们抱怨在构建失败后必须运行make clean…

谢谢这确实有帮助:)不仅如此,使用.PRECIOUS意味着即使make成功完成(即未被终止或中断),这些文件也不会被删除。“此外,如果目标是一个中间文件,在不再需要它之后,它将不会像通常那样被删除。[…]在后一方面,它与.SECONDARY特殊目标重叠。”-+1:与
.SECONDARY
不同,这是POSIX:我想这对filename
foo.bar.c
a.b.o
等不起作用?@Beta我做到了。这有点微妙。我很困惑make中的
%.foo
与bash中的“*.foo”类似。多注意一下我是如何构建我的目标的。这是用于目标匹配,而不是用于文件匹配。谢谢。除了此之外,.PRECIOUS“与.SECONDARY特殊目标重叠。”关于保留指定的文件,即使构建没有中断(引用自),您应该列出
.SECONDARY
的参数。如果不提供任何先决条件,则会保留所有中间文件,这不一定是您想要的。谢谢!不幸的是,在
.SECONDARY
中列出目标似乎不是针对
.o
以外的扩展。特别是
.d
依赖项文件会被删除,无论发生什么情况。这个解决方案虽然不是idea,但至少是有效的:)目前,模式规则在
中不起作用。次要的
先决条件,请参阅。显式文件名起作用。
.PRECIOUS: A/%.foo B/%.foo