Un ejemplo mínimo:¿Por qué este archivo MAKE elimina mi objetivo?
%.txt: foo.log
# pass
%.log:
# pass
Run:
$ make a.txt --dry-run
# pass
# pass
rm foo.log
Por qué la última acción es foo.log rm? ¿Cómo deshacerse de él?
Un ejemplo mínimo:¿Por qué este archivo MAKE elimina mi objetivo?
%.txt: foo.log
# pass
%.log:
# pass
Run:
$ make a.txt --dry-run
# pass
# pass
rm foo.log
Por qué la última acción es foo.log rm? ¿Cómo deshacerse de él?
Está haciendo a.txt
por medio de una cadena de reglas implícitas (en este caso reglas implícitas que usted mismo definió). Por lo tanto, Make considera que foo.log
es intermediate file y lo elimina cuando cumple su función. Puede anular este comportamiento declarando foo.log
un objetivo secundario:
.SECONDARY: foo.log
Por defecto, GNU make elimina archivos intermedios. Como% .txt depende de% .log, make desea eliminar el archivo .log. Para evitar ese comportamiento, márcalos como preciosos con .PRECIOUS o .SECONDARY.
.PRECIOUS: foo.log
Además, puede hacerlo de modo que no hay archivos intermedios son siempre eliminados mediante el uso de .SECONDARY sin dependencias.
.SECONDARY:
Ver this sección del manual de fabricación GNU.
.SECONDARIO:% .log # doesnt work, ¿qué debo hacer para que la regla sea general? –
Si desea que todos los productos intermedios permanezcan, simplemente declare un objetivo de .SECONDARY: sin dependencias. Alternativamente, puedes usar el comodín con .PRECIOUS. es decir, .PRECIOUS:% .log – Sean
@Sean: extraño que el comodín funcione con PRECIOUS, pero no con SECONDARY ... – Beta