私はこれについてしばらく考えていましたが、私は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)を使います。 – Simon
ヒントありがとう – marcin
2009年のブログ記事がありますが、まだまだ不器用です。http://agateau.com/2009/cmake-and-make-dist/ – usr1234567