2010-03-20 13 views
7

Ho un makefile con qualcosa come i seguenti obiettivi:makefile: eseguire un bersaglio da un altro bersaglio, più comandi aggiuntivi

 
install: 
    do a whole bunch of stuff to install 

dist: install 
    cp README.txt $(INSTALL_DIR) 
    zip $(INSTALL_DIR) 

Sto cercando di non ripetere i comandi dal bersaglio install e fare dist eseguire install prima eseguendo i propri comandi.

Chiamare make dist esegue effettivamente tutti i comandi dall'obiettivo install ma poi si ferma e non esegue i propri comandi, ad es. il cp.

Mi manca qualcosa?

+0

Normalmente, la tua regola 'install' dipenderebbe 'tutti' o giù di lì, e 'all' farebbe il 'intero gruppo di cose da costruire ', lasciando' installare 'per fare' tutta una serie di cose da installare '. –

+0

@ Jonathan Sì, è proprio quello che sta facendo. Lo modificherò. – cschol

risposta

9

cercano di aggiungere questa riga nel makefile

.PHONY: installare dist

+0

Era così. Puoi spiegare perché è necessario? Grazie. – cschol

+0

La directory di installazione è stata chiamata "install" (o forse "dist")? Questo tende a confondere le cose. La notazione '.PHONY' (un'estensione GNU Make) significa all'incirca che il 'target' deve essere trattato come sempre non aggiornato. –

+6

Per approfondire ciò che Jonathan ha detto su .PHONY, pensala in questo modo: Make presuppone che tutti i target siano file effettivi e guarda se riesce a trovare il file, se il file non può essere considerato obsoleto e la regola eseguito. .PHONY dice che non è veramente un file, quindi non cercarlo o cerca di abbinarlo a nessun pattern/regole e, naturalmente, se c'è davvero un file/una directory chiamata, non prendi quel file l'obiettivo, potenzialmente trattando l'obiettivo come aggiornato. http://www.gnu.org/s/hello/manual/make/Phony-Targets.html – jhabbott

Problemi correlati