Задать вопрос
Eugene-Usachev
@Eugene-Usachev

Как настроить CMake на установку пакетов?

C++ почти не знаю, но в ВУЗе дали практику, которую надо бы решить по-взрослому, то есть со сторонними библиотеками, пакетным менеджером, кросс-платформенностью и так далее. Конечно, я могу в README попросить установить все зависимости, но это выглядит костыльно. Хотелось бы, чтобы CMake сам установил все недостающие зависимости, а, может, даже пакетный менеджер.

Какой пакетный менеджер лучше взять? Как подключить его к CMake? Можно ли устанавливать его через CMake или лучше попросить об этом в README? Или "взрослое" решение пишется без пакетного менеджера?
  • Вопрос задан
  • 140 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 2
@res2001
Developer, ex-admin
Самому заниматься установкой зависимостей есть смысл только для статически линкуемых библиотек. В этом случае самый простой вариант такие библиотеки оформить например как субмодуль git. Тогда при клонировании вашего репозитория скачаются исходники библиотеки. В cmake просто собираете ее как отдельный таргет и используете по назначению. Хорошо если библиотека уже поддерживает сборку через cmake - будет меньше возни. Если нет, то придется написать самому для нее CMakeLists.txt.

Для динамических библиотек стоит оставить удовлетворение зависимостей пользователю, потому что вариантов пакетных менеджеров много (вы хотите их все поддерживать?). В вашем CMakeLists.txt нужно только сделать тем или иным способом поиск установленного пакета и если его нет - выдачу ошибки и завершение сборки. Такие механизмы в cmake есть. Можно использовать выше приведенный find_package или например pkg_check_modules (который в свою очередь использует утилиту pkg-config).
Почти все более-менее серьезные приложения не пытаются установить самостоятельно свои зависимости при сборке. Можете проверить. Например: https://github.com/nginx/nginx?tab=readme-ov-file#...

Вы можете дополнительно к сборке приложения добавить и создание пакета для пакетного менеджера (или для нескольких пакетных менеджеров). Вот тут то вы и укажите необходимые приложению зависимости (в разных дистрибутивах линукс пакеты с зависимостями могут называться по разному). И тогда, когда пользователь будет устанавливать ваш пакет через пакетный менеджер все зависимости установятся автоматически.
В cmake есть механизм для создания пакетов для разных пакетных менеджеров: https://cmake.org/cmake/help/book/mastering-cmake/...
Ответ написан
Nipheris
@Nipheris Куратор тега C++
Какой пакетный менеджер лучше взять?

Conan или vcpkg, чё тут думать. Рекомендую Conan, но vcpkg тоже уже созревшее решение, сейчас они оба захватывают рынок.
Или "взрослое" решение пишется без пакетного менеджера?

А вы пилите библиотеку или законченное приложение? Опишите подробнее что у вас за программное средство. Требования сильно разные. Например:
  • если это C++ библиотека - то я бы выбрал один из пакетных менеджеров и подготовил бы библиотеку для работы с ним. Например в случае Conan это значит написать conan-рецепт (который conanfile.py), который и будет "точкой входа" в вашу библиотеку: с помощью рецепта Conan узнаёт, как собирать библиотеку, какие у неё зависимости, как упаковывать в бинарный пакет, какие архитектуры и ОС поддерживаются и ещё кучу полезной информации, которую без ПМ обычно описывают ручками в README
  • если это сетевой-сервис, например HTTP-бэкенд для чего-либо - ну тут стандартом индустрии является Docker/OCI-образ. Собираете образ под нужные комбинации архитектуры и ОС (см. multiplatform builds), заливаете в registry, и любой желающий запустит контейнер из вашего образа в своей инфраструктуре, или использует ваш образ как базовый для сборки своего
  • если это десктопное приложение, неважно GUI или CLI - ну тогда обычно ожидается инсталляционный пакет под поддерживаемую ОС. Для Линуха это deb/rpm/flatpak/snap, для Венды - msix или exe, для Мака - dmg. Далее либо выкладываете для скачивания где-то на сайте, либо публикуетесь в магазинах типа Microsoft Store или Snapcraft


Опишите точнее ваш случай, я лучше посоветую что вам взять.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Vapaamies
@Vapaamies
Психанул и снес свои ответы не отмечающим решения…
Решил дать дополняющий ответ и оформить его в виде ответа, а не комментария.

Или "взрослое" решение пишется без пакетного менеджера?

С точки зрения ведения проектов у пользователя вашего кода должно быть целостное лицо:
  • Или он совсем ничего не понимает и хочет собрать только ваш проект и забыть.
  • Или у него свое настроенное окружение, в котором собираются разные проекты, и ваш будет одним из многих.

В реальных проектах первый случай обычно бывает на внедрении, когда по каким-то причинам конечному пользователю поставляется исходный код, собираемый затем на месте. Пользователь кода — не программист, своего окружения у него нет и не будет, и ему вполне нормально иметь костыльные по сути зависимости через ваш проект. На внедрении под эти пляски наверняка выделен отдельный комп (или виртуальный сервер), и такой подход ничего не сломает, а жизнь пользователю-непрофессионалу упростит (в теории). На внедрении всякое бывает, короче.

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

Мораль в том, что с точки зрения ведения проектов тоже надо уметь смотреть, не только кодить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы