Creo que encontré el problema @ janitor048 con la respuesta de @ richq. Desafortunadamente, no tengo la reputación suficiente para comentar su respuesta, tal vez alguien más puede copiar y pegar.
@richq utiliza un comando personalizado y un destino personalizado. El comando personalizado es necesario para convencer a cmake de que se creará el encabezado, de lo contrario, el script cmake podría ejecutarse como un comando para el destino personalizado. Mientras que un objetivo personalizado siempre se ejecutará, un comando personalizado no lo hará si su archivo de salida ya existe.
La solución consiste en agregar una dependencia falsa (un archivo imaginario) al destino personalizado y decirle a cmake que el comando personalizado crea ese archivo. Esto es suficiente para garantizar que el comando personalizado siempre se ejecute. Afortunadamente, cmake en realidad no verifica si este archivo se crea o no.
richq tiene:
# 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)
esto funciona para mí:
# 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)
Además, si alguien desea utilizar git, utilizar esto para el guión 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)
respuesta impresionante . No sabía que los scripts de cmake podían ejecutarse en tiempo de compilación. – paleozogt
Esto realmente no hace exactamente lo que uno esperaría. No actualiza automáticamente 'revision.h' cuando se llama a' make'. Su solución tiene que ser modificada levemente - Lo pondré en una respuesta, entonces puedo usar etiquetas de código ... – janitor048
@janitor Acabo de probar esto de nuevo, como lo hice originalmente, y definitivamente funciona como se esperaba. Incluso obtiene un mensaje "Generando svnheader.h" en cada llamada a realizar, que no hace en su versión modificada. Además, 'revision.h' no está en el código, ¿entonces quizás tengas un error de copiar y pegar? – richq