根据FAQ,CMake不会创建make dist
目标,并且可以使用CPack创建源包。但是CPack只是在源目录中创建一个tarball,所有文件都与CPACK_SOURCE_IGNORE_FILES
中的模式不匹配。
另一方面,autotools生成的make dist
只捆绑了它知道的文件,主要是编译所需的资源。
任何人都有一种聪明的方法,只使用CMakeLists.txt(及其依赖项)中指定的文件制作源包吗?
答案 0 :(得分:1)
我已经考虑了一段时间了,我不会假装我可以模拟make dist
而没有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。
<强>参考强>
答案 1 :(得分:0)
上面的西蒙是正确的,但没有给出完整的答案。使用git,您可以使用git archive命令生成兼容的tar球存档。
此版本的示例与过去的git archive --format=tar.gz -o my-repo-0.01.tar.gz --prefix=my-repo-0.01/ master
兼容。
{{1}}
请参阅:https://gist.github.com/simonw/a44af92b4b255981161eacc304417368