Un esempio minimo:Perché questo makefile rimuove il mio obiettivo?
%.txt: foo.log
# pass
%.log:
# pass
Run:
$ make a.txt --dry-run
# pass
# pass
rm foo.log
Perché l'ultima azione è rm foo.log? Come liberarsene?
Un esempio minimo:Perché questo makefile rimuove il mio obiettivo?
%.txt: foo.log
# pass
%.log:
# pass
Run:
$ make a.txt --dry-run
# pass
# pass
rm foo.log
Perché l'ultima azione è rm foo.log? Come liberarsene?
Si sta creando a.txt
tramite una catena di regole implicite (in questo caso regole implicite definite dall'utente). Quindi considera foo.log
un intermediate file e lo elimina quando ha raggiunto il suo scopo. È possibile ignorare questo comportamento dichiarando foo.log
un bersaglio secondario:
.SECONDARY: foo.log
Per impostazione predefinita, GNU make rimuove i file intermedi. Poiché% .txt dipende da% .log, make vuole rimuovere il file .log. Per evitare questo comportamento, contrassegnali come preziosi con .PRECIOUS o .SECONDARY.
.PRECIOUS: foo.log
Inoltre, è possibile fare in modo che nessun file intermedi vengono mai rimossi utilizzando .SECONDARY senza dipendenze.
.SECONDARY:
Vedere la sezione this del manuale di GNU make.
. SECONDARIO:% .log # non funziona, cosa devo fare per rendere generale la regola? –
Se vuoi che tutte le sostanze intermedie rimangano, dichiara semplicemente un obiettivo di .SECONDARY: senza dipendenze. In alternativa, è possibile utilizzare il carattere jolly con. PRECEDENTE. vale a dire. PRECEDENTE:% .log – Sean
@Sean: Strano che il carattere jolly funzioni con PRECIOUS, ma non con SECONDARY ... – Beta