Pregunta

Me gustaría cambiar el nombre del archivo de instalación que produce CPack (v2.8.7) para incluir un número de versión que se obtiene en el momento de la compilación desde el sistema de control de versiones.Parece que esto no se puede hacer configurando las variables CPACK_* porque eso sucede en el momento "cmake".

Lo que quiero poder hacer es ejecutar "(n)make package" y crear el archivo de instalación sin necesidad de más comandos.Los dos enfoques posibles que conozco son manipular las variables de nombre de archivo de CPack en el momento de la compilación y cambiar el nombre de la salida final de CPack.

Si usa "include(CPack)" en un archivo CMakeLists.txt, parece que CPack siempre se ejecuta en último lugar y no puede tener un comando posterior a la compilación. Este mensaje de la lista de correo sugiere que se puede escribir un objetivo personalizado para ejecutar CPack, pero no pude descubrir cómo hacerlo sin crear una recursividad infinita.

¿Cómo se puede hacer esto?

¿Fue útil?

Solución

Con un poco de ayuda de la lista de correo CMAKE, descubrí cómo hacerlo, usando Subversion.

cmakelists.txt

cmake_minimum_required(VERSION 2.8)
project(myapp)

add_executable(main main.cpp)
install(TARGETS main DESTINATION .)

add_custom_target(first ALL
    # update the working copy
    COMMAND ${Subversion_SVN_EXECUTABLE} update ${CMAKE_SOURCE_DIR}

    # generate cpackoptions.cmake at build time so we get the
    # most recent revision number
    COMMAND ${CMAKE_COMMAND}
    -DSOURCE_DIR=${CMAKE_SOURCE_DIR}
    -DBINARY_DIR=${CMAKE_BINARY_DIR}
    -Dproj_name=${CMAKE_PROJECT_NAME}
    -P ${CMAKE_SOURCE_DIR}/create-cpackoptions.cmake
    )

add_dependencies(main first)

set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_BINARY_DIR}/CPackOptions.cmake)

include(CPack)

create-cpackOptions.ctake

include(FindSubversion)
Subversion_WC_INFO(${SOURCE_DIR} ${proj_name})

set(revision ${${proj_name}_WC_REVISION})

configure_file(${SOURCE_DIR}/CPackOptions.cmake.in
    ${BINARY_DIR}/CPackOptions.cmake
    @ONLY)

cpackOptions.cmake.in

set(CPACK_PACKAGE_FILE_NAME "@proj_name@-${CPACK_PACKAGE_VERSION}r@revision@-${CPACK_SYSTEM_NAME}")

Otros consejos

¿Por qué no extraer la información de compilación del VCS en el momento de cmake?Luego puede modificar fácilmente CPACK_PACKAGE_FILE_NAME para incluir su número de versión.

Bonificación adicional:Al hacer esto en CMake-time, puede, p.llene un archivo "Readme.txt" con git-info usando CMake configurar_archivo y agrégalo a tu paquete.O quizás utilícelo para completar un "config.h", que se usa en sus compilaciones.

Ejemplo:En uno de mis propios proyectos, tengo un pequeño fragmento de código CMake que encuentra Git y extrae el hash del conjunto de cambios actual del repositorio de código fuente.Puede que no sea la mejor forma Git de extraer la información, pero a mí me funciona...

# First try to find the git-executable
find_program( Git_EXECUTABLE NAMES git git.cmd PATHS
    ${Git_DIR}
    ENV PATHS
    $ENV{Git_DIR}
)
# Run "git log -n 1 --pretty="%h" for the current commit-hash
execute_process( COMMAND ${Git_EXECUTABLE} "log" "-n" "1" "--pretty=\"%h\"" 
                 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 
                 OUTPUT_VARIABLE Git_Commit_Hash 
                 OUTPUT_STRIP_TRAILING_WHITESPACE
                 )
# and use a regex to strip quotes.
string( REGEX REPLACE "^\"(.*)\"$" "\\1" Git_Commit_Hash ${Git_Commit_Hash} )

El resultado será un Git_Commit_Hash variable con el valor hash de 7 caracteres, que se utiliza al configurar CPack:

set( CPACK_PACKAGE_NAME "MyProject" )
message( STATUS "    CPack options: " ${CPACK_PACKAGE_NAME} )
message( STATUS "    Preparing CPACK: " )
message( STATUS "      and hash: ${Git_Commit_Hash}" )

set( CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}_${Git_Build_Version}_${CPACK_PACKAGE_VERSION}" )
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top