2009-11-22 14 views
5

Mi piacerebbe creare un file Makefile.am che genera un file di intestazione menzionato in un file xxx.c.Dipendenza intestazione in automake

Diciamo che xxx.c contiene:

#include <version.h> 
... 

e che ho una regola per creare alla fine del Makefile.am:

version.h: 
     echo '#define VERSION "'`hg id`'"' > version.h.tmp 
     cmp version.h.tmp version.h || mv version.h.tmp version.h 

Cosa devo cambiare per rendere la compilazione xxx.c dipende da version.h? Ho provato nodist_progname_SOURCES=version.h, ma non sembra farlo.

risposta

10
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.

+0

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

+0

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

+0

Devi metterli in una linea singola tramite l'operatore '' && '', altrimenti renderemo felice di parallelizzare la tua versione. –

Problemi correlati