2012-03-08 46 views
8

根據FAQ,CMake不會創建make dist目標,並且可以使用CPack創建源包。但是,CPack只是在源目錄中創建一個與CPACK_SOURCE_IGNORE_FILES中的模式不匹配的所有文件的tarball。CMake中的「make dist」相當於

另一方面,由autotools生成的make dist只打包它知道的文件,主要是編譯所需的源文件。

任何人都有一種聰明的方式來製作只包含CMakeLists.txt(及其依賴項)中指定的文件的源代碼包?

+0

不是一個答案,但你可以用你的VCS這樣做,例如['git的archive'(http://schacon.github.com /git/git-archive.html)如果你使用的是git。 – Simon 2012-03-09 23:50:14

+0

感謝提示 – marcin 2012-03-10 01:30:34

+0

2009年有一篇博文,但仍然很笨拙:http://agateau.com/2009/cmake-and-make-dist/ – usr1234567 2015-03-12 07:09:30

回答

0

我一直在考慮這一段時間,我不會假裝我可以模擬一個make dist沒有CMake本身直接支持。

問題是你可以在CMake的一邊添加很多文件依賴項(例如預構建庫),另一方面CMake不知道由生成的構建環境本身直接檢查的依賴關係(例如任何頭文件依賴性)。

因此,這裏是剛剛收集與任何構建目標中給出的所有CMakeList.txt和源文件代碼:

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版

我見上面的代碼作爲起點和概念驗證。您可以根據需要添加庫,標題等,但您應該只需調整即可進行出價。

作爲一個起點, the link @ usr1234567在評論中提供。

參考