BUILT_SOURCES = version.h
Tutti i file indicate come BUILT_SOURCES
saranno costruite prima di qualsiasi della compilazione normali regole funzionano.
Tuttavia, questo creerà un piccolo problema: quanto dovranno essere ricostruite su ogni make
invocazione version.h
, la ricompilazione di ogni file foo.c
che #include
s version.h
sarà attivato di nuovo su ogni make
corsa. Preferiremmo che la ricompilazione avvenga solo quando c'è effettivamente qualcosa che è cambiato.
Per ovviare a questo problema, utilizzare una dipendenza BUILT_SOURCES
su un file di timbri che viene "creato" ogni volta (non viene mai creato effettivamente, quindi la regola di generazione viene eseguita ogni volta). La regola di creazione per quel file di timbri crea un nuovo file version.h
come version.h.tmp
e copia solo da version.h.tmp
a version.h
se version.h.tmp
è in realtà diverso da version.h
(proprio come fa la regola version.h
). Quindi, se non è cambiato nulla nel version.h
, il suo timestamp (mtime) rimane lo stesso, e nessun accumulo di oggetti a seconda version.h
viene attivato:
BUILT_SOURCES = version.stamp
version.stamp:
echo '#define VERSION "'`hg id`'"' > version.h.tmp
cmp version.h.tmp version.h || mv version.h.tmp version.h
Questa soluzione farà quello che stai chiedendo.
Purtroppo, però, ci sarà un piccolo problema quando si sta costruendo da un tarball dist: Allora hg id
vi darà informazioni fasulle, e probabilmente non c'è version.h
nel tarball, in modo che il costruzione fallirà o contenere fasullo informazioni sulla versione .
Ho risolto questo problema per un progetto xf86-video-radeonhd che utilizza git
. Il file git-version.h
generato in questa soluzione contiene alcune informazioni sulla versione oltre a un numero di versione singolo. Si può vedere questa soluzione solo aggiornamento-se-diverso mia alla fine del git_version.sh e BUILT_SOURCES
collegamento (tra cui gestione delle spera tutto out-of-source-tree e da-dist-tarball casi di build) in RadeonHD.am se sei interessato.
Funziona alla grande, con una qualifica. Dal manuale di automake: "Potrebbe essere importante sottolineare che BUILT_SOURCES è onorato solo da" make all "," make check "e" make install ". Ciò significa che non è possibile creare un target specifico (ad esempio" make foo ") in un albero pulito se dipende da una fonte costruita. " Eppure, è la soluzione migliore che io conosca. – phs
Immagino che se qualcuno sa eseguire specificamente 'make foo', puoi ragionevolmente presumere una certa conoscenza di ciò che stanno costruendo, e quindi se hanno bisogno di accertarsi manualmente che i BUILT_SOURCES vengano ricostruiti. – ndim
Devi metterli in una linea singola tramite l'operatore '' && '', altrimenti renderemo felice di parallelizzare la tua versione. –