L'utilisation de CMake pour obtenir au moment de la construction de révision Subversion
Avec CMake, je peux obtenir la révision Subversion à l'aide de Subversion_WC_INFO
. Toutefois, cela n'arrive qu'à configurer l'heure -- tous les faire utilisera cette mise en cache de révision.
Je voudrais obtenir la révision svn à moment de la construction (c'est à dire, à chaque fois Faire est d'exécuter). Comment puis-je faire cela?
OriginalL'auteur paleozogt | 2010-09-23
Vous devez vous connecter pour publier un commentaire.
C'est plus d'une douleur à faire que cela doit l'être. Vous pouvez exécuter un programme au moment de la construction pour extraire les informations de version subversion. CMake lui-même peut être utilisé comme programme à l'aide de son langage de script. Vous pouvez lancer CMake script à l'aide de la ligne de commande-P drapeau. Le morceau de code pour faire ce serait (Pour être placé dans le fichier
getsvn.cmake
):Cet extrait de la révision subversion de l'information et de l'écrit dans un fichier d'en-tête. Ce fichier d'en-tête est mise à jour uniquement lorsque cela est nécessaire pour éviter de recompiler tout le temps. Dans votre programme, vous devez inclure que le fichier d'en-tête pour obtenir à la SVNVERSION définir.
La
CMakeLists.txt
fichier que vous devez exécuter le script serait quelque chose comme ceci:Vous devez utiliser
add_custom_target
etadd_custom_command
car il n'y a pas d'apports à l'svnheader.h de fichier, il "apparaît de nulle part" de cmake. J'ai déjà abordé la question de l'inutile reconstruit dans le getsvn.cmake fichier même si, pour la reconstruction de la "svnheader" cible est un no-op si la révision subversion n'a pas changé.Enfin, un exemple
main.c
fichier:Ce fait n'est pas exactement ce à quoi on pourrait s'attendre. Il n'est pas automatiquement mise à jour
revision.h
quandmake
est appelé. Votre solution doit être légèrement modifié - je vais le mettre dans une réponse, donc je peux utiliser les balises de code...Viens de tester ce nouveau, comme je l'ai fait à l'origine, et cela fonctionne bien comme prévu. Vous obtenez même une "Génération svnheader.h" message à chaque appel de faire, que vous n'avez pas dans votre version modifiée. Aussi,
revision.h
n'est pas dans le code, peut-être que vous avez un copier-coller de l'erreur?Désolé pour la "révision.h", c'est la façon dont il est appelé dans mon code je ne mêler lors de la frappe ici, ce n'est pas le problème. Étrange que cela fonctionne pour vous, mais pas pour moi. Pourriez-vous essayer de tester comme suit: 1. Créer de nouveaux (vide) répertoire de construction 2.
cmake
etmake
3. commentaire de lafile(write ..)
dans votre getsvn.cmake 4. editsvnversion.h.txt
à la main 5.make
Ne l'étape 5 mise à jour de votre svnversion.h? Ce n'est pas pour moi (alors que l'étape 2 fonctionne toujours très bien, bien sûr).Et de vrai, ma version n'est malheureusement pas question d'une "génération svnheader.h" message.
OriginalL'auteur richq
Je crois que j'ai trouvé le problème @janitor048 eu avec @richq de réponse. Malheureusement, je n'ai pas assez de réputation pour commenter sa réponse - peut-être que quelqu'un d'autre pouvez copier et coller.
@richq utilise à la fois une commande personnalisée et une cible personnalisée. La commande personnalisée est nécessaire pour convaincre les CMake que l'en-tête sera créé, sinon le CMake script peut être exécuté comme une commande pour la cible personnalisée. Alors qu'une cible personnalisée sera toujours exécutée, une commande personnalisée ne sera pas si son fichier de sortie existe déjà.
La solution de contournement consiste à ajouter un bidon de dépendance (un fichier imaginaire) à la cible personnalisée, et de dire à CMake que la commande personnalisée crée ce fichier. C'est assez pour s'assurer que la commande personnalisée est toujours exécuté. Heureusement, CMake n'est pas réellement vérifier si ce fichier est créé ou non.
richq a:
Cela fonctionne pour moi:
Aussi, si quelqu'un souhaite utiliser Git, de les utiliser pour la CMake script:
OriginalL'auteur Mark
J'ai trouvé que la réponse donnée par richq n'est pas exactement ce à quoi on pourrait s'attendre - à savoir qu'il ne met pas automatiquement à jour le fichier
svnversion.h
(dont la révision svn info est stockée) lorsque seul bâtiment (mais pas à la configuration) de la source, c'est à dire lorsque l'appelant simplementmake
.Ici est une version légèrement modifiée de la procédure qu'il convient donc de comportement. Crédit pour la solution d'origine va à richq de cours.
Son
getsvn.cmake
script reste inchangée, elle est ici par souci d'exhaustivité (voir sa réponse aux observations et explication)Maintenant, le truc est d'utiliser
ADD_CUSTOM_COMMAND
avec une signature différente (voir La Documentation De CMake), à savoir la spécification de la cible avec laquelle la commande doit être associé. Ensuite, il est exécuté à chaque fois que la cible est intégré avec une cible vide deADD_CUSTOM_TARGET
qui est toujours considéré comme out-of-date, ce qui donne le comportement souhaité. Voici ce que leCMakeLists.txt
pourrait ressembler (en se basant à nouveau sur le script par richq):Maintenant, le script
getsvn.cmake
est exécuté à chaque fois que la cible revisiontag est construit, ce qui signifie que chaque foismake
est émis. Test en commentant la ligne avecFILE(..)
dansgetsvn.cmake
et de modifier manuellementsvnversion.h.txt
.OriginalL'auteur janitor048
Je ne sais pas du tout CMake-des fonctionnalités spécifiques pour ce faire, mais il est assez facile à faire soi-même, comme l'une de vos étapes de génération. Exécuter
svnversion
à partir d'un script et d'analyser sa sortie, ou (plus facile) exécuter de TortoiseSVNsubwcrev
programme (qui a aussi été porté sur d'autres systèmes d'exploitation, il n'est donc pas spécifique à Windows).OriginalL'auteur Josh Kelley
Dans l'idéal, ce serait un commentaire sur richq réponse, mais je n'ai pas assez de réputation encore. Si un admin pourrait le convertir en un seul, ce serait génial.
Seul problème que j'ai trouvé (en dehors de la dépendance de celui qui a été résolu par la Marque), c'est que la version SVN de soutien dans CMake n'inclut que la "révision de base", pas de modificateurs (en particulier si c'est un "M" (modifié) construire).
Ainsi, au lieu de l'a suggéré
getsvn.cmake
, j'ai utilisé ceci:Et parce que je ne veux pas la révision du répertoire courant, je suis de passage SOURCE_ROOT (le répertoire pour le haut de la SVN de l'arbre) à la commande personnalisée, au lieu de SOURCE_DIR, et je travaille la valeur correcte pour que ailleurs dans mon CMakeLists.txt arbre
OriginalL'auteur Michael Firth
Je suis à la recherche de la même chose et j'ai trouvé ceci: howto-utilisation-cmake-avec-cc-projets
Il semble beaucoup plus simple, mais je me demande si c'est aussi efficace que rq réponse.
cmake
. Il n'est pas mis à jour lorsque vous faites delta construit par la suitemake
s.OriginalL'auteur FBaralli