2012-03-09 14 views
26

Ho uno stack software che crea alcuni file intermedi come parte del processo di generazione. C'è qualche problema in arrivo e la costruzione si rompe. Voglio dare un'occhiata a quei file intermedi generati. Con mia sorpresa quei file vengono eliminati come parte del processo di compilazione.Come annullare la cancellazione di file intermedi

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

Sono passato attraverso i Makefile Non vedo alcuna regola esplicita cancellandoli. Possono esistere regole implicite per eliminare i file intermedi. Se sì, come posso disabilitare quelle regole implicite?

Vedo la stampa Removing intermediate files... solo se la marca viene eseguita con l'opzione --debug.

[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 

risposta

29

Se stai usando gnumake, è possibile utilizzare la speciale bersaglio .PRECIOUS:

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

o semplicemente

.PRECIOUS: %.c %.o 

Il suo unico effetto è che questi file non verranno eliminati se Make viene ucciso o interrotto.

+0

Grazie a questo effettivamente aiutato :) – Kamath

+5

Non solo, utilizzando. PRECIOUS significa che questi file non verranno eliminati anche se Make viene completato correttamente (cioè, non viene ucciso o interrotto). "Inoltre, se il target è un file intermedio, non verrà eliminato dopo che non è più necessario, come avviene normalmente. [...] In quest'ultimo aspetto si sovrappone al target speciale .SECONDARY." - https://www.gnu.org/software/make/manual/make.html – PonyEars

+2

+1: a differenza di '.SECONDARY', questo è POSIX: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ make.html –

35

È anche possibile utilizzare. SECONDARIO, che conserva i file specificati anche se la generazione non si interrompe.

ad es.

.SECONDARY: 
+0

Grazie. Giusto per aggiungere a questo, PRECIOUS "si sovrappone all'obiettivo speciale .SECONDARY." per quanto riguarda la conservazione dei file specificati anche se la compilazione non si interrompe (citazione da https://www.gnu.org/software/make/manual/make.html) – PonyEars

+4

È necessario elencare gli argomenti su '. SECONDARIO'. Se non viene fornito alcun prerequisito, fa sì che vengano mantenuti * tutti i file intermedi, il che non è necessariamente ciò che si desidera. – Kaz

+0

Grazie!Sfortunatamente elencare gli obiettivi in ​​". SECONDARIO" sembra essere rotto per estensioni diverse da ".o". In particolare i file di dipendenza '.d' vengono eliminati indipendentemente da cosa. Questa soluzione, pur non essendo un'idea, funziona almeno :) – foges

3

C'è una restrizione sull'uso di obiettivi, che influisce sul comportamento di .PRECIOUS:

ho obiettivi A /% pippo:. E B /% pippo:., Quindi ho impostato :

.PRECIOUS: %.foo 

e questo non ha funzionato; Non capisco perché, ma l'espansione non funziona in questo modo; Ho dovuto elencare esplicitamente obiettivi esattamente come sono scritte:

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

Ma anche dopo aver letto https://www.gnu.org/software/make/manual/html_node/Special-Targets.html Non capisco la differenza tra .PRECIOUS: e .SECONDARY:.

È accettato l'uso di questi obiettivi speciali senza dipendere, ma penso che questo sarebbe molto sporco nella codifica e si aspetterebbe effetti collaterali. Alcune persone hanno appena messo .PRECIOUS: o .SECONDARY: senza dep, e più tardi, si lamentano devono eseguire make clean dopo una build rotta ...

Problemi correlati