makefile - tipos - Cómo deshacer la eliminación de archivos intermedios
transferencia de documentos definicion (3)
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.
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
.
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
Si estás usando GNUMake, puedes usar el objetivo especial .PRECIOUS
:
.PRECIOUS: fact_test_without_proxies.c fact_test_main.c fact_test_without_proxies.o
o solo
.PRECIOUS: %.c %.o
Su único efecto es que estos archivos no se eliminarán si Make es eliminado o interrumpido.
También puede usar .SECONDARY, que conservará los archivos especificados, incluso si la construcción no se rompe.
p.ej
.SECONDARY:
Existe una restricción en el uso de los objetivos, lo que afecta el comportamiento de .PRECIOUS:
Tengo objetivos A /%. Foo: y B /%. Foo:, así que he establecido:
.PRECIOUS: %.foo
y esto no funcionó; No entiendo por qué, pero la expansión no funciona de esta manera; Tenía que enumerar explícitamente los objetivos exactamente como están escritos:
.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 usar esos objetivos especiales sin depender, pero creo que esto sería una codificación muy sucia y esperaría efectos secundarios. Algunas personas acaban de decir .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 ...