эквивалент "make dist" в CMake - PullRequest
       45

эквивалент "make dist" в CMake

9 голосов
/ 09 марта 2012

Согласно FAQ , CMake не создает цель make dist, а исходный пакет можно создать с помощью CPack. Но CPack просто создает архив исходной директории со всеми файлами, которые не соответствуют шаблонам в CPACK_SOURCE_IGNORE_FILES.

С другой стороны, make dist, сгенерированный autotools, связывает только те файлы, о которых он знает, в основном источники, необходимые для компиляции.

У кого-нибудь есть умный способ создания исходного пакета только с файлами, указанными в CMakeLists.txt (и его зависимостях)?

1 Ответ

1 голос
/ 09 апреля 2017

Я уже некоторое время думаю об этом, и я не буду притворяться, что могу смоделировать 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

Я вижу приведенный выше код в качестве отправной точки и подтверждения концепции.Вы можете добавлять библиотеки, заголовки и т. Д. По мере необходимости, но вам, вероятно, следует просто настроить , чтобы сделать ставку.

В качестве отправной точки см., Например, ссылку @ usr1234567, указанную в комментариях.

Ссылки

...