J'ai fait quelques CMake modules que les pairs dans un repo git pour la gestion des versions et des fins similaires - ils sont tous dans mon référentiel https://github.com/rpavlik/cmake-modules
La bonne chose à propos de ces fonctions, ils auront la force de re-configurer (une reprise de cmake) avant de construire à chaque fois que la TÊTE de valider les modifications. Contrairement à faire quelque chose de juste une fois avec execute_process, vous n'avez pas besoin d'souvenez-vous de cmake pour mettre à jour la définition de hachage.
Pour ce but précis, vous avez besoin d'au moins l' GetGitRevisionDescription.cmake
et GetGitRevisionDescription.cmake.in
fichiers. Puis, dans votre principal CMakeLists.txt
le fichier, vous auriez quelque chose comme ceci
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/whereYouPutMyModules/")
include(GetGitRevisionDescription)
get_git_head_revision(GIT_REFSPEC GIT_SHA1)
Ensuite, vous pouvez soit ajouter un système à l'échelle de définition (qui, malheureusement, serait la cause de beaucoup de la reconstruction)
add_definitions("-DGIT_SHA1=${GIT_SHA1}")
ou, mon alternative suggérée: Faire un fichier source généré. La création de ces deux fichiers dans votre code source:
GitSHA1.rpc.dans:
#define GIT_SHA1 "@GIT_SHA1@"
const char g_GIT_SHA1[] = GIT_SHA1;
GitSHA1.h:
extern const char g_GIT_SHA1[];
Ajoutez ceci à votre CMakeLists.txt
(en supposant que vous avez une liste de fichiers source dans les SOURCES):
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/GitSHA1.cpp.in" "${CMAKE_CURRENT_BINARY_DIR}/GitSHA1.cpp" @ONLY)
list(APPEND SOURCES "${CMAKE_CURRENT_BINARY_DIR}/GitSHA1.cpp" GitSHA1.h)
Ensuite, vous avez une variable globale contenant votre SHA de la chaîne - la-tête avec l'externe ne change pas lorsque le SHA, de sorte que vous pouvez simplement inclure que n'importe quel endroit que vous voulez reportez-vous à la chaîne, et ensuite seulement le CPP produit doit être recompilé à chaque livraison afin de vous donner accès à la SHA partout.