Ecco una versione ridotta del mio Makefile:dipendenze Makefile non funzionano per obiettivo fasullo
.PHONY: all
all: src/server.coffee
mkdir -p bin
./node_modules/.bin/coffee -c -o bin src/server.coffee
Voglio correre make
e hanno solo lo ricompilare quando src/server.coffee
è cambiato. Tuttavia, ricompila ogni volta che corro make
:
$ make
mkdir -p bin
./node_modules/.bin/coffee -c -o bin src/server.coffee
$ make
mkdir -p bin
./node_modules/.bin/coffee -c -o bin src/server.coffee
Se cambio il mio Makefile non usare un obiettivo fasullo, funziona come previsto. Nuovo Makefile:
bin/server.js: src/server.coffee
mkdir -p bin
./node_modules/.bin/coffee -c -o bin src/server.coffee
Risultato:
$ make
mkdir -p bin
./node_modules/.bin/coffee -c -o bin src/server.coffee
$ make
make: `bin/server.js' is up to date.
Perché non si è rispettare i miei dipendenze con un obiettivo fasullo? Il motivo per cui lo chiedo è perché in realtà, non sto semplicemente compilando un singolo file in un singolo altro file, quindi non voglio dover tenere traccia dei nomi di tutti i file di output da utilizzare come target.
Giusto per essere chiari, un ** target vuoto ** deve essere un file ed è davvero usato solo per il suo timestamp? Esiste un altro tipo di '.PHONY' che consente a una regola di destinazione di avere un corpo di una ricetta (con comandi eseguiti) * e * eseguiti solo quando le dipendenze hanno bisogno di essere aggiornate? Sembra piuttosto spezzato, dato che avere '.PHONY' fa cose diverse a seconda che abbia o meno un corpo di ricette. – jozxyqk