je crois que je trouve le problème @ janitor048 a eu avec la réponse de @ richq. Malheureusement, je n'ai pas assez de réputation pour commenter sa réponse - peut-être que quelqu'un d'autre peut 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 cmake que l'en-tête sera créé, sinon le script cmake pourrait être exécuté en tant que commande pour la cible personnalisée. Alors qu'une cible personnalisée sera toujours exécutée, une commande personnalisée ne le sera pas si son fichier de sortie existe déjà.
La solution consiste à ajouter une dépendance bogus (un fichier imaginaire) à la cible personnalisée et dire CMake que la commande personnalisée crée ce fichier. Cela suffit pour garantir que la commande personnalisée est toujours exécutée. Heureusement, cmake ne vérifie pas si ce fichier est créé ou non.
richq a:
# a custom target that is always built
add_custom_target(svnheader ALL
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/svnheader.h)
# creates svnheader.h using cmake script
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/svnheader.h
COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}
-P ${CMAKE_CURRENT_SOURCE_DIR}/getsvn.cmake)
cela fonctionne pour moi:
# a custom target that is always built
add_custom_target(svnheader ALL
DEPENDS svn_header) # svn_header is nothing more than a unique string
# creates svnheader.h using cmake script
add_custom_command(OUTPUT svn_header ${CMAKE_CURRENT_BINARY_DIR}/svnheader.h
COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}
-P ${CMAKE_CURRENT_SOURCE_DIR}/getsvn.cmake)
Aussi, si quelqu'un souhaite utiliser git, utiliser pour le script CMake:
#create a pretty commit id using git
#uses 'git describe --tags', so tags are required in the repo
#create a tag with 'git tag <name>' and 'git push --tags'
find_package(Git)
if(GIT_FOUND)
execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags RESULT_VARIABLE res_var OUTPUT_VARIABLE GIT_COM_ID)
if(NOT ${res_var} EQUAL 0)
set(GIT_COMMIT_ID "git commit id unknown")
message(WARNING "Git failed (not a repo, or no tags). Build will not contain git revision info.")
endif()
string(REPLACE "\n" "" GIT_COMMIT_ID ${GIT_COM_ID})
else()
set(GIT_COMMIT_ID "unknown (git not found!)")
message(WARNING "Git not found. Build will not contain git revision info.")
endif()
set(vstring "//version_string.hpp - written by cmake. changes will be lost!\n"
"const char * VERSION_STRING = \"${GIT_COMMIT_ID}\"\;\n")
file(WRITE version_string.hpp.txt ${vstring})
# copy the file to the final header only if the version changes
# reduces needless rebuilds
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different
version_string.hpp.txt ${CMAKE_CURRENT_BINARY_DIR}/version_string.hpp)
réponse Impressionnant . Je ne savais pas que les scripts cmake pouvaient être exécutés au moment de la construction. – paleozogt
Cela ne fait pas exactement ce que l'on attendrait. Il ne met pas automatiquement à jour 'revision.h' quand' make' est appelé. Votre solution doit être légèrement modifiée - Je vais le mettre dans une réponse, donc je peux utiliser des balises de code ... – janitor048
@janitor Tout testé à nouveau, comme je l'ai fait à l'origine, et il fonctionne vraiment comme prévu. Vous obtenez même un message "Generating svnheader.h" sur chaque appel à faire, ce que vous ne faites pas dans votre version modifiée. De plus, 'revision.h' n'est pas dans le code, alors peut-être que vous avez une erreur de copier-coller? – richq