首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重命名CPack的输出

重命名CPack的输出
EN

Stack Overflow用户
提问于 2012-03-08 12:48:58
回答 2查看 4.1K关注 0票数 7

我想重命名CPack (v2.8.7)生成的安装程序文件,以包含构建时从版本控制系统获得的版本号。这似乎不能通过设置CPACK_*变量来完成,因为这发生在"cmake“时间。

我希望能够做的是运行"(n)make package“并创建安装程序文件,而不需要进一步的命令。据我所知,两种可能的方法是在构建时操作CPack文件名变量和重命名CPack的最终输出。

如果在CMakeLists.txt文件中使用"include( CPack )“,那么CPack似乎总是最后运行,您不能使用构建后命令。This mailing list message建议可以编写一个自定义目标来运行CPack,但是我不知道如何在不创建无限递归的情况下做到这一点。

如何做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-09 09:39:17

在CMake邮件列表的帮助下,我想出了如何使用subversion来做到这一点。

CMakeLists.txt

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
set(CPACK_PACKAGE_FILE_NAME "@proj_name@-${CPACK_PACKAGE_VERSION}r@revision@-${CPACK_SYSTEM_NAME}")
票数 5
EN

Stack Overflow用户

发布于 2012-03-08 20:45:07

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

额外的好处:当你在CMake时这样做的时候,你可以使用CMake的configure_file用git-info填充一个"Readme.txt“文件,并将它添加到你的包中。或者使用它来填充"config.h",这是在您的构建中使用的。

示例:在我自己的一个项目中,我有一小段CMake代码,它可以找到Git并从源代码存储库中提取当前的变更集哈希。这可能不是最好的Git提取信息的方法,但它对我来说很有效……

代码语言:javascript
复制
# 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个字符的哈希值的Git_Commit_Hash变量,该值在设置CPack时使用:

代码语言:javascript
复制
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}" )
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9613051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档