2012-03-08 18 views
8

FAQ के अनुसार "मेक डिस्ट" समकक्ष, सीएमके make dist का निर्माण नहीं करता है और सीपीएक का उपयोग करके स्रोत पैकेज बनाया जा सकता है। लेकिन सीपीएसी सिर्फ उन सभी फ़ाइलों के साथ स्रोत निर्देशिका का टैरबॉल बनाता है जो CPACK_SOURCE_IGNORE_FILES में पैटर्न से मेल नहीं खाते हैं।सीएमके

दूसरी ओर, make dist ऑटोोटूल बंडलों द्वारा उत्पन्न केवल फाइलें जो इसे जानता है, ज्यादातर संकलन के लिए आवश्यक स्रोतों के बारे में जानते हैं।

किसी के पास CMakeLists.txt (और इसकी निर्भरताओं) में निर्दिष्ट फ़ाइलों के साथ स्रोत पैकेज बनाने का एक स्मार्ट तरीका है?

+0

नहीं एक जवाब, लेकिन आप अपने VCS इस्तेमाल कर सकते हैं करने के लिए है कि, उदाहरण के [ 'Git archive'] (के लिए http://schacon.github.com /git/git-archive.html) यदि आप गिट का उपयोग कर रहे हैं। – Simon

+0

संकेत के लिए धन्यवाद – marcin

+0

200 9 से एक ब्लॉग पोस्ट है, लेकिन अभी भी बेकार है: http://agateau.com/2009/cmake-and-make-dist/ – usr1234567

उत्तर

0

मैं थोड़ी देर के लिए इस बारे में सोच रहा हूं और मैं नाटक नहीं करूंगा कि मैं सीधे make dist अनुकरण कर सकता हूं बिना इसे सीएमके द्वारा सीधे समर्थित किया जा सकता है।

समस्या

आप एक तरफ CMake के साथ फ़ाइल निर्भरता का एक बहुत जोड़ सकते हैं वह यह है कि (जैसे पुस्तकालयों पूर्व निर्माण करने के लिए) और दूसरी तरफ CMake निर्भरता सीधे उत्पन्न निर्माण पर्यावरण ही द्वारा जाँच के बारे में पता नहीं है (उदाहरण के लिए कोई हेडर निर्भरता)।

function(make_dist_creator _variable _access _value _current_list_file _stack) 
    if (_access STREQUAL "MODIFIED_ACCESS") 
     # Check if we are finished (end of main CMakeLists.txt) 
     if (NOT _current_list_file) 
      get_property(_subdirs GLOBAL PROPERTY MAKE_DIST_DIRECTORIES) 
      list(REMOVE_DUPLICATES _subdirs) 
      foreach(_subdir IN LISTS _subdirs) 
       list(APPEND _make_dist_sources "${_subdir}/CMakeLists.txt") 
       get_property(_targets DIRECTORY "${_subdir}" PROPERTY BUILDSYSTEM_TARGETS) 
       foreach(_target IN LISTS _targets) 
        get_property(_sources TARGET "${_target}" PROPERTY SOURCES) 
        foreach(_source IN LISTS _sources) 
         list(APPEND _make_dist_sources "${_subdir}/${_source}") 
        endforeach() 
       endforeach() 
      endforeach() 

      add_custom_target(
       dist 
       COMMAND "${CMAKE_COMMAND}" -E tar zcvf "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.tar.gz" -- ${_make_dist_sources} 
       COMMENT "Make distribution ${PROJECT_NAME}.tar.gz" 
       WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" 
      ) 
      message("_make_dist_sources = ${_make_dist_sources}") 
     else() 
      # else collect subdirectories in my source dir 
      file(RELATIVE_PATH _dir_rel "${CMAKE_SOURCE_DIR}" "${_value}") 
      if (NOT _dir_rel MATCHES "\.\.") 
       set_property(GLOBAL APPEND PROPERTY MAKE_DIST_DIRECTORIES "${_value}") 
      endif() 
     endif() 
    endif() 
endfunction() 

variable_watch("CMAKE_CURRENT_LIST_DIR" make_dist_creator) 

नोट: इस्तेमाल किया BUILDSYSTEM_TARGETS संपत्ति कम से कम CMake संस्करण 3.7

मैं देख रहा हूँ की जरूरत है

तो यहाँ

एक कोड है कि बस सभी CMakeList.txt और स्रोत फ़ाइलें किसी भी बिल्ड लक्ष्य के साथ दिया एकत्र करता है एक शुरुआती बिंदु के रूप में उपरोक्त कोड और अवधारणा का साबित करें। आप ज़रूरत के आधार पर पुस्तकालयों, शीर्षलेखों आदि को जोड़ सकते हैं, लेकिन आपको अपनी बोली लगाने के लिए शायद को ट्विक करना चाहिए।

प्रारंभिक बिंदु के रूप में उदा। the link @ usr1234567 टिप्पणियों में प्रदान की गई।

संदर्भ