Как автоматически загружать зависимости С++ на кросс-платформенном пути + CMake?

В основном я хочу достичь этого рабочего процесса:

  • Оформить заказ из репозитория в системе Windows (или любой другой платформы).

  • Запустите некоторый инструмент, который получает зависимости, включая и libs, и помещает их в нужное место (например, в "\ Program Files\Microsoft Visual Studio 10.0\VC\Lib и \Includes" на окнах)

  • Запуск CMake (создает проекты MSVS при победе)

  • Откройте проект MSVS и скомпилируйте его.

И я хотел бы иметь этот рабочий процесс на большинстве платформ.

Я не хочу загружать зависимости вручную

Как это сделать без сохранения зависимостей в репозитории? Каков наилучший способ достичь этого?

Ответы

Ответ 1

В CMake вы можете использовать file(DOWNLOAD URL PATH) для скачать файл, объединить это с пользовательскими командами для загрузки и распаковки:

set(MY_URL "http://...")
set(MY_DOWNLOAD_PATH "path/to/download/to")
set(MY_EXTRACTED_FILE "path/to/extracted/file")

if (NOT EXISTS "${MY_DOWNLOAD_PATH}")
    file(DOWNLOAD "${MY_URL}" "${MY_DOWNLOAD_PATH}")
endif()

add_custom_command(
    OUTPUT "${MY_EXTRACTED_FILE}"
    COMMAND command to unpack
    DEPENDS "${MY_DOWNLOAD_PATH}")

Ваша цель должна зависеть от вывода из пользовательской команды, затем при запуске CMake файл будет загружен, а когда вы будете строить, извлекать и использовать.

Все это можно было бы обернуть в макрос, чтобы упростить его использование.

Вы также можете посмотреть на использование модуля CMake ExternalProject, который может делать то, что вы хотите.

Ответ 2

Hunter - это система, основанная на CMake 3 для управления зависимостями. Он работает достаточно хорошо, но пока не так много пакетов. Если нужные вам пакеты еще не являются частью системы, они могут быть добавлены достаточно просто, если они также основаны на CMake.

Ответ 3

Conan - менеджер пакетов c++, который может быть интегрирован в поток cmake - может быть вспомогательным инструментом, который вам нужен. Смотрите https://conan.io/

Ответ 4

Лучший способ добиться этого - устранить ваши зависимости.

Зависимости являются злыми.

Устраните их, а не в зависимости от них.

Серьезно

Ответ 5

Лучший способ добиться этого - устранить ваши зависимости.

Зависимости являются злыми.

Устраните их, а не в зависимости от них.

Серьезно.

Вы не хотите загружать их вручную, вы не хотите хранить их в своем репозитории, ваши клиенты не хотят их загружать. Фактически, ваш компилятор даже не хочет компилировать их.

Предпочитаете переключение на java на добавление зависимости библиотеки С++...

Тем временем, предложение проверить модуль ExternalProject CMake - это самое близкое к тому, хранимую в хранилище автоматическую зависимость-download-configure-build-and-install в ближайшее время с помощью сборки на основе CMake.