2009-11-22 15 views
5

Je voudrais créer un fichier Makefile.am qui génère un fichier d'en-tête mentionné dans un fichier xxx.c.Dépendance d'en-tête dans automake

Disons que xxx.c contient:

#include <version.h> 
... 

et que j'ai une règle pour créer à la fin de Makefile.am:

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

Que dois-je changer pour que la compilation xxx.c dépend de version.h? J'ai essayé nodist_progname_SOURCES=version.h, mais cela ne semble pas le faire.

Répondre

10
BUILT_SOURCES = version.h 

Tous les fichiers mentionnés comme BUILT_SOURCES seront construits avant l'une des règles de compilation normales sont.

Cependant, cela va créer un léger problème: Comme version.h devra être reconstruit à chaque invocation make, la recompilation de chaque fichier qui foo.c#include s version.h sera déclenché à nouveau sur chaque course make. Nous préférerions que la recompilation ne se produise que lorsqu'il y a quelque chose qui a changé. Pour contourner ce problème, utilisez une dépendance BUILT_SOURCES sur un fichier de tampon qui est "créé" à chaque fois (il n'est jamais créé, donc la règle de construction s'exécute à chaque fois). La règle de génération pour ce fichier de tampon crée un nouveau fichier version.h en tant que version.h.tmp et copie uniquement version.h.tmp en version.h si version.h.tmp est réellement différent de version.h (exactement comme votre règle version.h). Donc, si rien n'a changé dans version.h, son horodatage (mtime) reste le même, et aucune accumulation d'objets en fonction de version.h est déclenché:

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 

Cette solution fera ce que vous demandez.

Malheureusement, il y aura un léger problème lorsque vous construisez à partir d'un dist tarball: Alors hg id vous donnera des informations fausses, et il n'y a probablement pas version.h dans votre tarball, de sorte que la construction échouera ou contenir des informations sur la version bogus .

J'ai résolu ce problème pour le projet xf86-video-radeonhd qui utilise git. Le fichier git-version.h généré dans cette solution contient plus d'informations de version qu'un simple numéro de version. Vous pouvez voir cette solution si-différente mise à jour uniquement- de moi à la fin de git_version.sh et BUILT_SOURCES branchement (y compris le traitement de l'espérons tous hors source arbre et de-dist-tarball construction cas) en RadeonHD.am si vous êtes intéressé.

+0

Cela fonctionne très bien, avec une qualification. Extrait du manuel d'automake: «Il est important de souligner que BUILT_SOURCES n'est honoré que par« make all »,« make check »et« make install », ce qui signifie que vous ne pouvez pas créer de cible spécifique (par exemple,« make foo »). un arbre propre si cela dépend d'une source construite. " Pourtant, c'est la meilleure solution que je connaisse. – phs

+0

Je suppose que si quelqu'un sait exécuter spécifiquement 'make foo', vous pouvez raisonnablement supposer une certaine connaissance de ce qu'ils construisent, et donc s'ils doivent s'assurer manuellement que les BUILT_SOURCES sont reconstruits. – ndim

+0

Vous devez les mettre dans une seule ligne via l'opérateur '' && '', sinon make sera heureux de paralléliser votre construction version.h. –