根據FAQ,CMake不會創建make dist
目標,並且可以使用CPack創建源包。但是,CPack只是在源目錄中創建一個與CPACK_SOURCE_IGNORE_FILES
中的模式不匹配的所有文件的tarball。CMake中的「make dist」相當於
另一方面,由autotools生成的make dist
只打包它知道的文件,主要是編譯所需的源文件。
任何人都有一種聰明的方式來製作只包含CMakeLists.txt(及其依賴項)中指定的文件的源代碼包?
根據FAQ,CMake不會創建make dist
目標,並且可以使用CPack創建源包。但是,CPack只是在源目錄中創建一個與CPACK_SOURCE_IGNORE_FILES
中的模式不匹配的所有文件的tarball。CMake中的「make dist」相當於
另一方面,由autotools生成的make dist
只打包它知道的文件,主要是編譯所需的源文件。
任何人都有一種聰明的方式來製作只包含CMakeLists.txt(及其依賴項)中指定的文件的源代碼包?
我一直在考慮這一段時間,我不會假裝我可以模擬一個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版
我見上面的代碼作爲起點和概念驗證。您可以根據需要添加庫,標題等,但您應該只需調整cpack即可進行出價。
作爲一個起點, the link @ usr1234567在評論中提供。
參考
不是一個答案,但你可以用你的VCS這樣做,例如['git的archive'(http://schacon.github.com /git/git-archive.html)如果你使用的是git。 – Simon 2012-03-09 23:50:14
感謝提示 – marcin 2012-03-10 01:30:34
2009年有一篇博文,但仍然很笨拙:http://agateau.com/2009/cmake-and-make-dist/ – usr1234567 2015-03-12 07:09:30