2010-07-22 15 views
5

L'idea è che un progetto abbia un singolo file con __DATE__ e __TIME__ in esso. Potrebbe essere interessante ricompilarlo senza modificare esplicitamente la data di modifica.Come si può forzare la ricompilazione di un singolo file in un Makefile?

modifica: $ (shell touch -c ..) potrebbe essere una buona soluzione se solo goffa.

+1

Questa potrebbe essere la soluzione sbagliata al tuo problema. Alcuni strumenti di controllo delle versioni possono scaricare dettagli della versione della fonte. Un po 'di hackery di script nel processo di compilazione e questi dettagli vengono integrati nel codice. Non importa se devi controllare l'origine e ricostruire tra dieci anni: le informazioni sulla tua versione rifletteranno ancora i dettagli di quel tag. – Steve314

+0

@ Steve314: più probabilmente vuole un box che menzioni il numero di build e la data di costruzione. –

+0

@Ken: in tal caso, il trucco dello strumento di versione è il modo giusto. Non vi è alcun motivo per cui l'hackeraggio della sceneggiatura non possa inserire i dettagli della versione nel codice (o nel file di risorse) per un riquadro di informazioni, e ottenere un numero di build in un riquadro di informazioni probabilmente richiede un intervento manuale facilmente dimenticato. Nemmeno make, il compilatore o il filesystem conoscono il tuo numero di build. – Steve314

risposta

8

Il linguaggio standard è di avere il file oggetto (non il file sorgente!) Dipenderà da un bersaglio che non esiste e non ha regole o dipendenze (questo obiettivo viene convenzionalmente chiamato FORCE), simili

always-recompile.o: FORCE 
FORCE: 

Questo si interrompe se in qualche modo viene creato un file denominato "FORCE". Con GNU Make è possibile invece utilizzare lo speciale .PHONY bersaglio, che non ha questa limitazione, ma che richiede di avere una regola esplicita per ricostruire quel file:

always-recompile.o: 
     $(CC) $(CFLAGS) -c -o always-recompile.o always-recompile.c 

.PHONY: always-recompile.o 

Vedere http://www.gnu.org/software/make/manual/html_node/Phony-Targets.html per maggiori dettagli.

+1

Dovresti fare ".PHONY: FORCE" perché always-recompile.o non è un bersaglio fasullo. Con ".PHONY: FORCE" non dovrebbe importare se viene creato un file chiamato FORCE. – camh

+0

Funziona davvero? Il GNU fa suoni manuali come bersagli fasulli non funzionano come dipendenze di bersagli reali. – zwol

1

Un modo per farlo è quello di eliminare il file oggetto corrispondente (.o o .obj) prima di eseguire make. Questo attiverà una ricompilazione (e ricollegamento) senza modificare la data di modifica del file sorgente.

Problemi correlati