我想重命名cpack(v2.8.7)的安装程序文件,包括从版本控制系统构建时间获得的版本号。似乎无法通过设置cpack_ *变量来完成这一点,因为它发生在“cmake”时间。

我希望能做的是运行“(n)制作包”,并创建安装程序文件,没有必需的进一步命令。我所知道的这两种可能的方法是在构建时操纵CPack文件名变量并重命名CPack的最终输出。

如果在cmakelists.txt文件中使用“包含(cpack)”,那么它似乎始终运行cpack始终运行,并且您不能具有后构建命令。此邮件列表消息建议可以写入自定义目标以运行cpack,但我无法弄清楚如何在不产生无限递归的情况下做到这一点。

如何完成?

有帮助吗?

解决方案

从CMake邮件列表中有一点帮助,我认为如何使用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.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 "@proj_name@-${CPACK_PACKAGE_VERSION}r@revision@-${CPACK_SYSTEM_NAME}")
.

其他提示

为什么不在cmake-time中从VCS中提取构建信息?然后,您可以轻松修改cpack_package_file_name以包含您的版本号。

添加了奖金:在CMake时间在做这个时,你可以是。使用cmake的 configure_file 并将其添加到您的包裹中。或者可能使用它来填充“config.h”,该“config.h”在构建中使用。

示例: 在我自己的一个项目中,我有一点CMAKE代码,它发现Git并从源代码存储库中提取当前的Changeset哈希。它可能不是提取信息的最佳推动方式,但它适用于我...

# 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} )
.

结果将是具有7-char散列值的生成播码变量,该变量在设置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}" )
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top