2012-03-08 53 views
5

我想重命名CPack(v2.8.7)生成的安裝程序文件,以包含在版本控制系統中生成的版本號。看來這不能通過設置CPACK_ *變量來完成,因爲這發生在「cmake」時間。重命名CPack的輸出

我想要做的就是運行「(n)make package」並且創建安裝程序文件,而不需要進一步的命令。我知道的兩種可能的方法是在構建時操作CPack文件名變量並重命名CPack的最終輸出。

如果在CMakeLists.txt文件中使用「include(CPack)」,那麼看起來CPack總是最後一次運行,並且不能有後期編譯命令。 This mailing list message表示可以編寫自定義目標來運行CPack,但我無法弄清楚如何在不創建無限遞歸的情況下如何實現這一點。

這怎麼辦?

回答

5

在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) 

創建-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

您可以更進一步,從CMakeFile.txt生成'CPackOptions.cmake.in'和'create-cpackoptions.cmake'。這意味着你不需要源代碼樹中的兩個文件。例如:'file(WRITE $ {CMAKE_BINARY_DIR} /CPackOptions.cmake.in「set(CPACK_PACKAGE_FILE_NAME \」@proj_name @ - \ $ {CPACK_PACKAGE_VERSION} r @ revision @ - \ $ {CPACK_SYSTEM_NAME} \「)」)' – 2015-09-23 16:26:05

4

爲什麼不在cmake-time從VCS提取構建信息?然後,您可以輕鬆修改CPACK_PACKAGE_FILE_NAME以包含您的版本號。

新增獎金:在CMake時間進行此操作時,您可以使用CMake的configure_file用git-info填充「Readme.txt」文件並將其添加到您的包中。或者可以用它來填充一個「config.h」,它在你的版本中使用。

實施例:在自己的項目之一 ,我有一個小片的指找到GIT中並提取從源代碼庫中的當前變更散列CMake的代碼。它可能不是提取信息的最佳方式的Git,但它爲我的作品...

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

其結果將是一個Git_Commit_Hash變量與7字符的哈希值,這是建立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

我真的需要它是在編譯的時候,而不是cmake的時間,但無論如何感謝您的回答。 – glennr 2012-03-09 01:41:00

+0

我很害怕你會這樣說......那麼候選人就是在編譯時運行一個自定義命令,它會爲你做到這一點。 – 2012-03-09 09:04:23

+0

並不那麼簡單。您不能在構建時重載CPACK_PACKAGE_FILE_NAME,因爲CPack會從配置文件中讀取它。您必須將CPACK_PROJECT_CONFIG_FILE設置爲在構建時生成的文件。這是我答案中的代碼。 – glennr 2012-03-10 01:11:45