2014-07-01 2 views
1

Mon but est de construire une bibliothèque qui inclut des informations de version.bjam - comment toujours exécuter un script shell avant de construire une cible?

J'ai un script qui va mettre à jour ./version.cppuniquement lorsque la version a réellement changé. Ceci pour éviter les reconstructions inutiles.

J'ai une cible lib qui englobe *.cpp, ce qui inclut version.cpp.

Le problème est que si je cours bjam je peux le voir exécuter le script, et mettre à jour version.cpp, mais la bibliothèque n'est pas reconstruite.

Seulement quand je lance bjam ne plus il voit que version.cpp a changé, et la reconstruction de la lib

Mon fichier confiture:

Echo [ SHELL "./write_version.sh" ] ; 

lib foo 
    : [ glob *.cpp ] 
    ; 

Sortie de course bjam (deux fois):

$ bjam 
Updating version.cpp 

...found 119 targets... 

$ bjam 
...found 121 targets... 
...updating 3 targets... 
gcc.compile.c++ ../foo/bin/gcc-4.8/debug/link-static/version.o 
gcc.archive ../foo/bin/gcc-4.8/debug/link-static/libfoo.a 
...updated 3 targets... 

Question:

Comment puis-je obtenir à la fois le script et la construction de la bibliothèque de travailler ensemble?

Répondre

1

Le problème est que les dépendances sont résolues lorsque le Jamfile est chargé

-à-dire: dans l'exemple Jamfile:

lib foo 
    : [ glob *.cpp ] 
    ; 

les fichiers sont cpp globbed et stat'd lorsque le Jamfile est chargé. Tout ce qui n'est pas périmé ne sera pas reconstruit.

Après le chargement du Jamfile, bjam exécute le script qui génère le version.cpp mis à jour, qui est trop tard.

Un travail consiste à exécuter le script shell dans le Jamroot. De cette façon version.cpp est mis à jour avant le Jamfile qui l'utilise est chargé. Le fichier est stat'd, trouvé pour être mis à jour, et lib foo reconstruit.

Jamroot:

Echo [ SHELL "./write_version.sh" ] ; 

build-project foo ; 

foo Jamfile:

lib foo 
    : [ glob *.cpp ] 
    ; 
Questions connexes