2012-03-09 14 views
26

Tengo una pila de software que crea algunos archivos intermedios como parte del proceso de compilación. Se produce un problema y se rompe la construcción. Quiero echar un vistazo a esos archivos generados intermedios. Para mi sorpresa, esos archivos se están eliminando como parte del proceso de compilación.Cómo deshacer la eliminación de archivos intermedios

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

Revisé los Makefiles No veo ninguna regla explícita que los elimine. ¿Puede haber reglas implícitas para eliminar archivos intermedios? En caso afirmativo, ¿cómo puedo desactivar esas reglas implícitas?

Veo la impresión Removing intermediate files... solo si make se ejecuta con la opción --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 

Respuesta

29

Si está utilizando gnumake, se puede usar el objetivo especial .PRECIOUS:

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

o simplemente

.PRECIOUS: %.c %.o 

Su único efecto es que estos archivos no se eliminarán si Make es asesinado o interrumpido.

+0

Gracias, esto de hecho ayudó :) – Kamath

+5

No solo eso, usando .PRECIOUS significa que estos archivos no se eliminarán aunque Make se complete con éxito (es decir, no se elimine ni se elimine). "Además, si el objetivo es un archivo intermedio, no se eliminará después de que ya no se necesite, como se hace normalmente. [...] En este último aspecto, se superpone con el objetivo especial .SECONDARIO". - https://www.gnu.org/software/make/manual/make.html – PonyEars

+2

+1: a diferencia de '.SECONDARY', esto es POSIX: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ make.html –

35

También puede usar .SECONDARY, que conservará los archivos especificados, incluso si la compilación no se rompe.

p. Ej.

.SECONDARY: 
+0

Gracias. Solo para agregar a eso, .PRECIOUS "se superpone con el objetivo especial .SECUNDARIO". con respecto a la preservación de los archivos especificados, incluso si la compilación no se rompe (cita de https://www.gnu.org/software/make/manual/make.html) – PonyEars

+4

Debe enumerar los argumentos a '.SECONDARY'. Si no se le otorgan requisitos previos, se conservarán * todos * los archivos intermedios, lo que no es necesariamente lo que desea. – Kaz

+0

¡Gracias!Lamentablemente, la inclusión de los objetivos en '.SECONDARY' parece estar rota para extensiones que no sean' .o'. Específicamente, los archivos de dependencia '.d' se eliminan sin importar qué. Esta solución, aunque no es idea, al menos funciona :) – foges

3

Hay una restricción en el uso de objetivos, que afecta el comportamiento de .PRECIOUS:

tengo objetivos A /% foo:. Y B /% foo:., Por lo que he puesto :

.PRECIOUS: %.foo 

y esto no funcionó; No entiendo por qué, pero la expansión no funciona de esta manera; Tuviera que lista explícitamente objetivos exactamente como se escriben:

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

Pero incluso después de leer https://www.gnu.org/software/make/manual/html_node/Special-Targets.html No entiendo la diferencia entre .PRECIOUS: y .SECONDARY:.

Se acepta el uso de esos objetivos especiales sin depender, pero creo que esto sería una codificación muy sucia y podría esperar efectos secundarios. Algunas personas acaban de poner .PRECIOUS: o .SECONDARY: sin dep, y más tarde, se quejan de que tienen que ejecutar make clean después de una compilación rota ...

Cuestiones relacionadas