2012-03-08 12 views
5

के आउटपुट का नाम बदलें मैं इंस्टॉलर फ़ाइल का नाम बदलना चाहता हूं जो सीपीएक्स (v2.8.7) संस्करण नियंत्रण प्रणाली से निर्माण समय पर प्राप्त संस्करण संख्या को शामिल करने के लिए उत्पन्न करता है। ऐसा लगता है कि यह CPACK_ * चर सेट करके किया जा सकता है क्योंकि यह "cmake" समय पर होता है।सीपीएक्स

जो मैं करना चाहता हूं वह है "(n) पैकेज बनाना" और इंस्टॉलर फ़ाइल को और कमांड के साथ बनाया जाना चाहिए। दो संभावित दृष्टिकोण जिन्हें मैं जानता हूं, वे निर्माण समय पर सीपीएक्स फ़ाइल नाम चर का उपयोग कर रहे हैं और सीपीएक्स के अंतिम आउटपुट का नाम बदल रहे हैं।

यदि कोई CMakeLists.txt फ़ाइल में "शामिल (सीपीएक्स)" का उपयोग करना है तो ऐसा लगता है कि सीपीएक्स हमेशा अंतिम चलता है और आपके पास पोस्ट-बिल्ड कमांड नहीं हो सकता है। This mailing list message सुझाव देता है कि सीपीएसी चलाने के लिए एक कस्टम लक्ष्य लिखा जा सकता है, लेकिन मैं यह जानने में असमर्थ था कि अनंत रिकर्सन के बिना इसे कैसे किया जाए।

यह कैसे किया जा सकता है?

उत्तर

5

सीएमके मेलिंग सूची से थोड़ी सी सहायता के साथ मैंने यह पता लगाया कि सबवर्सन का उपयोग करके इसे कैसे किया जाए।

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

आप एक कदम आगे जा सकते हैं और 'CPackOptions.cmake.in' और' create-cpackoptions.cmake' को CMakeFile.txt से उत्पन्न कर सकते हैं। इसका मतलब है कि आपको अपने स्रोत पेड़ में दो फाइलों की आवश्यकता नहीं है। उदाहरण के लिए: 'फ़ाइल (WRITE $ {CMAKE_BINARY_DIR} /CPackOptions.cmake.in "सेट (CPACK_PACKAGE_FILE_NAME \" @ proj_name @ - \ $ {CPACK_PACKAGE_VERSION} आर @ संशोधन @ - \ $ {CPACK_SYSTEM_NAME} \ ")") –

4

क्यों सेंसेक्स-समय पर वीसीएस से बिल्ड-जानकारी निकालें नहीं? फिर आप अपना संस्करण-संख्या शामिल करने के लिए आसानी से CPACK_PACKAGE_FILE_NAME को संशोधित कर सकते हैं।

जोड़ा गया बोनस: सीएमके-टाइम पर ऐसा करने पर, आप उदा। सीएमके के configure_file का उपयोग करके गिट-जानकारी के साथ "Readme.txt" फ़ाइल भरें और इसे अपने पैकेज में जोड़ें। या शायद इसे "config.h" भरने के लिए उपयोग करें, जिसका उपयोग आपके निर्माण में किया जाता है।

उदाहरण: अपने ही परियोजनाओं में से एक में , मैं जो Git पाता है और स्रोत कोड रिपोजिटरी से वर्तमान changeset हैश अर्क 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}) 

परिणाम 7-चार हैश मान, जो जब CPack की स्थापना प्रयोग किया जाता है के साथ एक Git_Commit_Hash चर हो जाएगा :

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

+0

मुझे डर था कि आप यह कहेंगे ... अल्टेनेटिव तब निर्माण समय पर एक कस्टम कमांड चलाने के लिए है जो आपके लिए यह करता है। –

+0

यह इतना आसान नहीं है। आप निर्माण समय पर CPACK_PACKAGE_FILE_NAME को ओवरराइड नहीं कर सकते क्योंकि CPACK इसे कॉन्फ़िगरेशन फ़ाइल से पढ़ता है। आपको CPACK_PROJECT_CONFIG_FILE को उस फ़ाइल में सेट करना होगा जो बिल्ड समय पर उत्पन्न होता है। मेरे जवाब में कोड यही है। – glennr