2012-03-09 6 views
26

ビルドプロセスの一部として中間ファイルを作成するソフトウェアスタックがあります。問題が発生し、ビルドが中断します。私はそれらの中間生成ファイルを見たいと思います。驚いたことに、これらのファイルはビルドプロセスの一部として削除されています。中間ファイルの削除を取り消す方法

Removing intermediate files... 
rm fact_test_without_proxies.c fact_test_main.c fact_test_without_proxies.o 

私はMakefilesを通過しましたが、削除する明示的なルールはありません。中間ファイルを削除するための暗黙のルールがありますか?はいの場合、どうすれば暗黙のルールを無効にできますか?

Removing intermediate files...は、--debugオプションでmakeを実行した場合のみ表示されます。

[email protected]:~/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 

答えて

29

あなたがGNUMakeを使用している場合、あなたは特別なターゲット.PRECIOUS使用することができます。

.PRECIOUS: fact_test_without_proxies.c fact_test_main.c fact_test_without_proxies.o 

か、単に

.PRECIOUS: %.c %.o 

をその唯一の効果は、これらのファイルがあれば削除されないということですメークが殺されたり中断されたりする。

+0

これは本当に助けてくれてありがとう:) – Kamath

+5

それだけでなく、.PRECIOUSこれらのファイルは、Makeが正常に完了しても削除されないことを意味します(つまり、killまたは中断されません)。 "また、ターゲットが中間ファイルである場合、通常行われているように、もはや必要なくなった後は削除されません。[...]この後者の点では、.SECONDARY特殊ターゲットと重複します。 - https://www.gnu.org/software/make/manual/make.html – PonyEars

+2

+1: '.SECONDARY'と違って、これはPOSIXです:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ make.html –

35

.SECONDARYを使用することもできます.SECONDARYは、ビルドが中断しなくても指定したファイルを保持します。

.SECONDARY: 
+0

ありがとうございます。それに加えて、.PECOは ".SECONDARY特別なターゲットと重複しています。"ビルドが壊れていなくても指定されたファイルを保存することについて(https://www.gnu.org/software/make/manual/make.htmlからの引用) – PonyEars

+4

'.SECONDARY'に引数をリストアップするべきです。前提条件が与えられていない場合、*すべての中間ファイルが保持されますが、これは必ずしもあなたが望むものではありません。 – Kaz

+0

ありがとう!残念なことに '.SECONDARY'のターゲットを' .o'以外の拡張ではリストされていないように見えます。特に '.d'依存ファイルは何があっても削除されます。このソリューションは、アイデアではありませんが、少なくとも動作します:) – foges

3

あり.PRECIOUSの動作に影響を与え、ターゲットの使用上の制限は、次のとおりです。fooとB /%::。。私はターゲットA /%fooのを持って

、私は設定しています:

.PRECIOUS: %.foo 

これは機能しませんでした。私は理由を理解できませんが、拡張はこのようには機能しません。そして.SECONDARY:

.PRECIOUS: A/%.foo B/%.foo 

しかし、たとえhttps://www.gnu.org/software/make/manual/html_node/Special-Targets.htmlを読んだ後、私は.PRECIOUSの違いを理解していない:私は彼らが書かれているとおりに明示的にターゲットを一覧表示する必要がありました:。

これらの特別なターゲットをdependなしで使用することは認められていますが、これは非常に汚いコーディングであり、副作用が予想されます。いくつかの人々は単に置く.PRECIOUS:.SECONDARY:depなし、後で、彼らは壊れたビルドの後にきれいに実行しなければならないと不平を言う...

関連する問題