2012-03-08 11 views
5

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

Lo que quiero hacer es ejecutar "(n) make package" y hacer que el archivo instalador se cree sin necesidad de más comandos. Los dos enfoques posibles que conozco son la manipulación de las variables de nombre de archivo CPack en tiempo de compilación y el cambio de nombre de la salida final de CPack.

Si utiliza "include (CPack)" en un archivo CMakeLists.txt, entonces parece que CPack siempre se ejecuta en último lugar y no puede tener un comando posterior a la compilación. This mailing list message sugiere que se puede escribir un destino personalizado para ejecutar CPack, pero no pude averiguar cómo hacerlo sin crear una recursión infinita.

¿Cómo se puede hacer esto?

Respuesta

5

con un poco de ayuda de la lista de correo CMake me di cuenta de cómo hacerlo, utilizando la subversión.

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) 

crear-cpackoptions.cmake

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 "@[email protected]${CPACK_PACKAGE_VERSION}[email protected]@-${CPACK_SYSTEM_NAME}") 
+0

Puede ir un paso más allá y generar el 'CPackOptions.cmake.in' y el' create-cpackoptions.cmake' del CMakeFile.txt. Esto significa que no necesita dos archivos en su árbol fuente. Por ejemplo: 'file (WRITE $ {CMAKE_BINARY_DIR} /CPackOptions.cmake.in" set (CPACK_PACKAGE_FILE_NAME \ "@ proj_name @ - \ $ {CPACK_PACKAGE_VERSION} r @ revision @ - \ $ {CPACK_SYSTEM_NAME} \") ")' –

4

¿Por qué no extraer la información de construcción del VCS en el momento de la fabricación? 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. Ej. llene un archivo "Readme.txt" con la información de git usando CMake's configure_file y agréguelo a su paquete. O quizás lo use para completar un "config.h", que se usa en sus compilaciones.

Ejemplo: en una de mis propios proyectos, tengo una pequeña pieza de código que encuentra CMake Git y extrae el hash conjunto de cambios actual del repositorio de código fuente. Puede que no sea la mejor manera de extraer el Git información, pero funciona para mí ...

# 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á una variable Git_Commit_Hash con el valor hash 7-char, 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}") 
+2

realmente lo necesitaba para estar en tiempo de compilación en lugar de tiempo cmake , pero gracias por tu respuesta de todos modos. – glennr

+0

Tenía miedo de que dijera que ... la alternativa es ejecutar un comando personalizado en tiempo de compilación que lo haga por usted. –

+0

No es tan simple. No puede anular CPACK_PACKAGE_FILE_NAME en el momento de la compilación porque CPack lo lee desde un archivo de configuración. Debe establecer CPACK_PROJECT_CONFIG_FILE en un archivo que se genera en el momento de la compilación. Esto es lo que hace el código en mi respuesta. – glennr

Cuestiones relacionadas