Hunting for a C++
Packet Manager
Пакетные менеджеры уровня ОС
● FreeBSD Ports Collection;
● Advanced Packaging Tool;
● Debian package;
● Portage;
● Steam;
● Chocolatey;
● Homebrew;
● Apple Store;
● Google Play.
2
Пакетные менеджеры уровня ЯП
Java: Maven, Gradle, Maven Ant Tasks (retired).
Python: Pip.
Ruby: RubyGems.
JavaScript: Npm.
PHP: Composer.
3
RubyGems - для командной строки
~ gem list --local
*** LOCAL GEMS ***
bigdecimal (1.2.0)
json (1.7.7)
rake (0.9.6)
sqlite3 (1.3.7)
4
~ gem search xml
*** REMOTE GEMS ***
aastra_xml_api (1.1.4)
active_xml (0.0.4)
….
~ sudo gem install yaxml
Fetching: yaxml-0.1.gem (100%)
Successfully installed yaxml-0.1
...
1 gem installed
Bundler, GemFile - файл для проекта
source 'https://rubygems.org'
gem 'nokogiri'
gem 'rails', '3.0.0.beta3'
gem 'rack', '>=1.0'
gem 'thin', '~>1.1'
5
Maven как файл проекта
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Maven Example</name>
<dependencies>
<dependency>
<artifactId>junit</artifactId>
<version>4.8.2</version>
</dependency>
</dependencies>
</project>
6
Как это работает для Maven
/folder/with/maven/xml/file ~ mvn package -Dmaven.test.skip=true
Или по другому:
/folder/with/maven/xml/file ~ mvn eclipse:eclipse
Между делом для windows, maven чаще всего выглядит как инородная
программа на которую надо показать в PATH.
7
Мир C++ хорошо описывается
следующим постом на Reddit
Is there a C++ package manager? If not, how do you handle dependencies?
8
Мир C++ хорошо описывается
следующим постом на Reddit
Is there a C++ package manager? If not, how do you handle dependencies?
- Welcome to the big leagues, where there are approximately 74 different build systems and a patchwork framework of 28
various package managers, most of which only support a certain platform/environment and are useless outside of it.
9
Мир C++ хорошо описывается
следующим постом на Reddit
Is there a C++ package manager? If not, how do you handle dependencies?
- Welcome to the big leagues, where there are approximately 74 different build systems and a patchwork framework of 28
various package managers, most of which only support a certain platform/environment and are useless outside of it.
- HA HA HA HA
- HA Ha ha
ha
ha
Pleasehelp
10
Пакетных менеджеров в C++
достаточно много
Nuget
11
Biicode
Cget
Hunter
CPM
Qpm
Cppget
Pacm
Gradle For C++
Vcpkg
Conan
Чего хотелось бы от пакетного
менеджера?
● Кросс-платформенность;
● Много пакетов, много хороших нужных пакетов (boost / json / xml / curl /
opencv, openssl, zlib … );
● Минимально возможный набор зависимостей;
● Простое использование, документация;
● Находящийся в разработке, а не в стадии архива или в стадии “ничего
пока нет”;
● Быстродействие.
12
Проблемы с кроссплатформенностью и
недостаточным набором пакетов
Nuget is the package manager for the Microsoft development platform including
.NET.
Vcpkg helps you get C and C++ libraries on Windows.
Qml is a package manager for Qt.
Pacm has tiny amount of ready to use packets.
Cget seems to be only boost installer for a long time.
Cppget has 13 packages. 13
Кладбище
Biicode: “Sad to announce that we will be closing doors by 16th Feb, administrators
have dictated servers shutdown.” (c)
14
Кто же остался?
CPM - A C++ Package Manager based on CMake and Git.
Conan - can be installed in many Operating Systems. It is extensively used and
tested in Windows, Linux (different distros), OSX, and also actively used in FreeBSD
and Solaris SunOS, but it has been reported to work in other systems too.
Hunter - Cross-platform package manager for C++ (based on CMake
ExternalProject). Supported platforms: Linux, Mac, Windows, iOS, Android, Raspberry
Pi.
15
CPM - C++ Package Manager
+ Выглядит как менеджер с наибольшим количеством пакетов;
+ Есть веб-сайт где можно найти пакеты, оставить отзывы о пакетах;
+ У самого популярного пакета Caffe 12880 stars, 1598 subscribers;
+ Последний раз пакет был добавлен 23 марта 2017 года;
+ Методика установки выглядит как скрипт в 20 строк который надо
добавить в CMake - это очень удобно для CMake проектов;
- Количество поддерживаемых “операционных систем”;
- Требование предустановленного GIT;
- Некоторые пакеты могут быть староваты. 16
CPM + Boost, что на входе
include(${CPM_DIR}/CPM.cmake)
CPM_AddModule("Boost"
GIT_REPOSITORY "https://github.com/cogumbreiro/cpm-boost"
GIT_TAG "1.59.0")
CPM_Finish()
...
target_link_libraries(${EXE_NAME} ${CPM_LIBRARIES})
17
CPM + Boost, что на выходе
Запуск #1 cmake ./ 91.58s user 54.61s system 11% cpu 20:46.22 total
Запуск #2+ cmake ./ 3.25s user 5.14s system 35% cpu 23.625 total
Размер 1.3 GB.
Header-Only Boost
18
CPM Конструкция
<projdir> /cpm-bin
/cpm_packages/.git
/modules/github_cogumbreiro_cpmboost_1590
/src/.git
/boost/.git
/libs/asio/.git
/system/.git
/tuple/.git
/graph/.git
19
Conan is a portable package manager
+ Код добавляется часто, проект скорее жив чем мертв;
+ Кроссплатформенность / 2 ;
+ Возможность настройки проекта через conanfile.txt;
+ Возможность установки из консоли с помощью conan приложения;
+ Можно создать свой Conan сервер с необходимыми для установки
файлами;
- Требуется Python (хотя в “тестовом” режиме достаточно brew / CMake);
20
Conan + Boost, что на входе
>> cat conanfile.txt
[requires]
Boost/1.63.0@eliaskousk/stable
[generators]
Cmake
>> cat CMakeLists.txt
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
add_executable(mymain main.cpp)
target_link_libraries(mymain ${CONAN_LIBS})
21
Conan + Boost, что на выходе
Запуск #1 conan install . 5.17s user 3.99s system 24% cpu 37.810 total
Запуск #2+ conan install . 0.42s user 0.23s system 80% cpu 0.801 total
Размер 152 MB.
Запускать пришлось так:
DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:~/.conan/data/Boost/1.63.0/eliaskousk/stabl
e/package/799fada071d3f31a4af934c4bb02dc71da78a99b/lib/ ./bin/mymain
22
Conan + OpenSSL, что на входе
>> cat conanfile.txt
[requires]
OpenSSL/1.0.2g@lasote/stable
[generators]
Cmake
>> cat CMakeLists.txt
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
add_executable(mymain main.cpp)
target_link_libraries(mymain ${CONAN_LIBS})
23
Conan + OpenSSL, что на выходе
Запуск #1 conan install 70.27s user 17.62s system 85% cpu 1:42.98 total
Запуск #2+ conan install . 0.42s user 0.23s system 80% cpu 0.801 total
Размер 264 MB. Скомпилированные на лету библиотеки.
(Boost лежит там же и занимает 152 MB).
На самом деле пришлось вызвать conan install . --build OpenSSL
24
Conan Конструкция
<projdir>/conanbuild.info - conan CMake пути к библиотекам и CMake макросы;
/conaninfo.txt - настр. проекта (опции библ., архитектура, компилятор).
~/.conan/conan.conf
/settings.yml
/data/OpenSSL/1.0.2g/lasote/stable
/data/Boost/1.63.0/eliaskousk/stable
/export/FindBoost.cmake
/package/799.someid.99b/FindBoost.cmake
/conaninfo.txt
/include/boost/*/*.hpp
/lib/libboost_*.dylib
25
Hunter - CMake-driven
cross-platform package manager for
C++
+ Платформы: Linux, Mac, Windows, iOS, Android, Raspberry Pi;
+ Мультиверсионность на одной машине для разных проектов;
+ По идеологии компилирует библиотеки на месте при возможности;
+ Есть список поддерживаемых пакетов;
- Чтобы использовать надо подсунуть CMake файл (можно добавить
submodule в git);
26
Hunter + Boost, что на входе
27
>> cat CMakeLists.txt
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
include("HunterGate.cmake")
HunterGate(
URL "https://github.com/ruslo/hunter/archive/v0.16.15.tar.gz"
SHA1 "6974c2150fc0d3b09de3ad1efcbf15d360647ffa"
)
hunter_add_package(Boost COMPONENTS system filesystem)
find_package(Boost CONFIG REQUIRED system filesystem)
add_executable(mymain main.cpp)
target_link_libraries(mymain PUBLIC Boost::system Boost::filesystem)
Hunter + Boost, что на выходе
Запуск #1 cmake ./ 167.38s user 60.10s system 38% cpu 9:54.94 total
Запуск #2+ cmake ./ 1.11s user 0.62s system 79% cpu 2.186 total
Размер 202 MB (скомпилированные библиотеки Boost “на лету”) / вместе с исходным кодом
Boost.
+ thread, chrono, date_time, regex, atomic, program_options, test, log.
Запуск #1 cmake ./ 1501.32s user 240.93s system 158% cpu 18:18.56 total
Запуск #2+ cmake ./ 1.76s user 1.43s system 81% cpu 3.921 total
Размер 417 MB (скомпилированные библиотеки Boost “на лету”) / вместе с исходным кодом
Boost. 28
Hunter + OpenSSL, что на входе
29
>> cat CMakeLists.txt
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
include("HunterGate.cmake")
HunterGate(
URL "https://github.com/ruslo/hunter/archive/v0.16.15.tar.gz"
SHA1 "6974c2150fc0d3b09de3ad1efcbf15d360647ffa"
)
hunter_add_package(OpenSSL)
find_package(OpenSSL REQUIRED)
add_executable(mymain main.cpp)
target_link_libraries(mymain OpenSSL::SSL OpenSSL::Crypto)
Hunter + OpenSSL, что на выходе
Запуск #1 cmake ./ 74.84s user 21.52s system 83% cpu 1:55.82 total
Запуск #2+ cmake ./ 1.07s user 0.66s system 88% cpu 1.951 total
Размер 433 MB (скомпилированные библиотеки OpenSSL “на лету”) / вместе с исходным кодом
OpenSSL.
(Boost лежит там же и занимает 417 MB).
30
Hunter Конструкция
<projdir>/_3rdParty/Hunter/install-root-dir - путь к каталогу библиотекам;
/config-id/config.cmake - версии библ. по умолчанию;
/toolchain/
~/.hunter/_Base/Download/Boost/1.62.0/5fd9743/boost_1_62_0.tar.bz2
/Hunter/0.16.15/69754c21/v.0.16.15.tar.gz
/Unpacked/ …
~/.hunter/_Base/Cache/meta/93b575e/Boost/ ...
~/.hunter/_Base/Cache/meta/93b575e/OpenSSL/ ...
~/.hunter/_Base/6974c21/78315bd/93b575e/
/Build/Boost/ ...
/Install/ - симуляция корневого <ROOT> каталога.
31
Спасибо!
Иван Сидоров
ivan.sidarau@gmail.com
32
Хорошие решения - результат опыта.
Опыт результат плохих решений.(с)

More Related Content

PPTX
Asynchrony and coroutines
PPTX
Применение фреймворка GStreamer в системе видеонаблюдения
PDF
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
PDF
Семь тысяч Rps, один go
PPTX
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
PDF
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
PDF
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
PDF
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Asynchrony and coroutines
Применение фреймворка GStreamer в системе видеонаблюдения
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Семь тысяч Rps, один go
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...

What's hot (20)

PDF
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
PDF
Streaming replication in practice
PDF
Практика Lock-free. RealTime-сервер
PDF
Профилирование кода на C/C++ в *nix системах
PDF
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
PPTX
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
PPTX
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
PDF
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
PDF
Зачем программистам Ansible
PDF
Использование юнит-тестов для повышения качества разработки
PDF
Highload 2014. PostgreSQL: ups, DevOps.
PDF
Григорий Демченко — Асинхронное программирование и сопрограммы
PDF
Павел Довгалюк, Обратная отладка
PDF
Для чего мы делали свой акторный фреймворк и что из этого вышло?
PPTX
Григорий Демченко, Асинхронность и неблокирующая синхронизация
ODP
Как за час сделать недельную работу
PDF
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
PDF
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
PDF
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
PDF
2014.10.15 Сергей Бурладян, Avito.ru
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Streaming replication in practice
Практика Lock-free. RealTime-сервер
Профилирование кода на C/C++ в *nix системах
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Зачем программистам Ansible
Использование юнит-тестов для повышения качества разработки
Highload 2014. PostgreSQL: ups, DevOps.
Григорий Демченко — Асинхронное программирование и сопрограммы
Павел Довгалюк, Обратная отладка
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Как за час сделать недельную работу
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
2014.10.15 Сергей Бурладян, Avito.ru
Ad

Similar to Hunting for a C++ package manager (20)

PDF
GitLab, Prometheus и Grafana с Kubernetes
PPTX
Use Grunt Luke
PDF
"Опыт внедрения автоматизации на PHP проектах (Docker, Gitlab CI)"
PPTX
Git for you
PPTX
Процесс разработки и тестирования с Docker + gitlab ci
PDF
NPM и модульная архитектура приложения
PDF
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
PPTX
Ускоряем сборку С++ проектов. Практика использования unity-сборок
PDF
мои модули и патчи для Nginx. максим дунин. зал 1
PDF
Разработка декстопных приложений для linux (Владимир Яковлев)
PPTX
Управление облачной инфраструктурой
PDF
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
PDF
От Make к Ansible
PPTX
Net core and linux in production
PDF
Rust - GDG DevFest Siberia 2016
PDF
Continuous integration сайтов на Drupal: Jenkins, Bitbucket, Features, Drush ...
PDF
Enterprise-инфраструктура менеджмента php-пакетов в рамках компании
PDF
Enterprise-инфраструктура менеджмента php-пакетов в рамках компании (Aлексей ...
GitLab, Prometheus и Grafana с Kubernetes
Use Grunt Luke
"Опыт внедрения автоматизации на PHP проектах (Docker, Gitlab CI)"
Git for you
Процесс разработки и тестирования с Docker + gitlab ci
NPM и модульная архитектура приложения
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Ускоряем сборку С++ проектов. Практика использования unity-сборок
мои модули и патчи для Nginx. максим дунин. зал 1
Разработка декстопных приложений для linux (Владимир Яковлев)
Управление облачной инфраструктурой
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
От Make к Ansible
Net core and linux in production
Rust - GDG DevFest Siberia 2016
Continuous integration сайтов на Drupal: Jenkins, Bitbucket, Features, Drush ...
Enterprise-инфраструктура менеджмента php-пакетов в рамках компании
Enterprise-инфраструктура менеджмента php-пакетов в рамках компании (Aлексей ...
Ad

More from corehard_by (20)

PPTX
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
PPTX
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
PDF
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
PPTX
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
PPTX
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
PPTX
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
PPTX
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
PPTX
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
PPTX
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
PPTX
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
PDF
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
PPTX
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
PPTX
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
PDF
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
PDF
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
PDF
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
PDF
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
PPTX
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
PDF
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
PDF
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019

Hunting for a C++ package manager

  • 1. Hunting for a C++ Packet Manager
  • 2. Пакетные менеджеры уровня ОС ● FreeBSD Ports Collection; ● Advanced Packaging Tool; ● Debian package; ● Portage; ● Steam; ● Chocolatey; ● Homebrew; ● Apple Store; ● Google Play. 2
  • 3. Пакетные менеджеры уровня ЯП Java: Maven, Gradle, Maven Ant Tasks (retired). Python: Pip. Ruby: RubyGems. JavaScript: Npm. PHP: Composer. 3
  • 4. RubyGems - для командной строки ~ gem list --local *** LOCAL GEMS *** bigdecimal (1.2.0) json (1.7.7) rake (0.9.6) sqlite3 (1.3.7) 4 ~ gem search xml *** REMOTE GEMS *** aastra_xml_api (1.1.4) active_xml (0.0.4) …. ~ sudo gem install yaxml Fetching: yaxml-0.1.gem (100%) Successfully installed yaxml-0.1 ... 1 gem installed
  • 5. Bundler, GemFile - файл для проекта source 'https://rubygems.org' gem 'nokogiri' gem 'rails', '3.0.0.beta3' gem 'rack', '>=1.0' gem 'thin', '~>1.1' 5
  • 6. Maven как файл проекта <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>Maven Example</name> <dependencies> <dependency> <artifactId>junit</artifactId> <version>4.8.2</version> </dependency> </dependencies> </project> 6
  • 7. Как это работает для Maven /folder/with/maven/xml/file ~ mvn package -Dmaven.test.skip=true Или по другому: /folder/with/maven/xml/file ~ mvn eclipse:eclipse Между делом для windows, maven чаще всего выглядит как инородная программа на которую надо показать в PATH. 7
  • 8. Мир C++ хорошо описывается следующим постом на Reddit Is there a C++ package manager? If not, how do you handle dependencies? 8
  • 9. Мир C++ хорошо описывается следующим постом на Reddit Is there a C++ package manager? If not, how do you handle dependencies? - Welcome to the big leagues, where there are approximately 74 different build systems and a patchwork framework of 28 various package managers, most of which only support a certain platform/environment and are useless outside of it. 9
  • 10. Мир C++ хорошо описывается следующим постом на Reddit Is there a C++ package manager? If not, how do you handle dependencies? - Welcome to the big leagues, where there are approximately 74 different build systems and a patchwork framework of 28 various package managers, most of which only support a certain platform/environment and are useless outside of it. - HA HA HA HA - HA Ha ha ha ha Pleasehelp 10
  • 11. Пакетных менеджеров в C++ достаточно много Nuget 11 Biicode Cget Hunter CPM Qpm Cppget Pacm Gradle For C++ Vcpkg Conan
  • 12. Чего хотелось бы от пакетного менеджера? ● Кросс-платформенность; ● Много пакетов, много хороших нужных пакетов (boost / json / xml / curl / opencv, openssl, zlib … ); ● Минимально возможный набор зависимостей; ● Простое использование, документация; ● Находящийся в разработке, а не в стадии архива или в стадии “ничего пока нет”; ● Быстродействие. 12
  • 13. Проблемы с кроссплатформенностью и недостаточным набором пакетов Nuget is the package manager for the Microsoft development platform including .NET. Vcpkg helps you get C and C++ libraries on Windows. Qml is a package manager for Qt. Pacm has tiny amount of ready to use packets. Cget seems to be only boost installer for a long time. Cppget has 13 packages. 13
  • 14. Кладбище Biicode: “Sad to announce that we will be closing doors by 16th Feb, administrators have dictated servers shutdown.” (c) 14
  • 15. Кто же остался? CPM - A C++ Package Manager based on CMake and Git. Conan - can be installed in many Operating Systems. It is extensively used and tested in Windows, Linux (different distros), OSX, and also actively used in FreeBSD and Solaris SunOS, but it has been reported to work in other systems too. Hunter - Cross-platform package manager for C++ (based on CMake ExternalProject). Supported platforms: Linux, Mac, Windows, iOS, Android, Raspberry Pi. 15
  • 16. CPM - C++ Package Manager + Выглядит как менеджер с наибольшим количеством пакетов; + Есть веб-сайт где можно найти пакеты, оставить отзывы о пакетах; + У самого популярного пакета Caffe 12880 stars, 1598 subscribers; + Последний раз пакет был добавлен 23 марта 2017 года; + Методика установки выглядит как скрипт в 20 строк который надо добавить в CMake - это очень удобно для CMake проектов; - Количество поддерживаемых “операционных систем”; - Требование предустановленного GIT; - Некоторые пакеты могут быть староваты. 16
  • 17. CPM + Boost, что на входе include(${CPM_DIR}/CPM.cmake) CPM_AddModule("Boost" GIT_REPOSITORY "https://github.com/cogumbreiro/cpm-boost" GIT_TAG "1.59.0") CPM_Finish() ... target_link_libraries(${EXE_NAME} ${CPM_LIBRARIES}) 17
  • 18. CPM + Boost, что на выходе Запуск #1 cmake ./ 91.58s user 54.61s system 11% cpu 20:46.22 total Запуск #2+ cmake ./ 3.25s user 5.14s system 35% cpu 23.625 total Размер 1.3 GB. Header-Only Boost 18
  • 20. Conan is a portable package manager + Код добавляется часто, проект скорее жив чем мертв; + Кроссплатформенность / 2 ; + Возможность настройки проекта через conanfile.txt; + Возможность установки из консоли с помощью conan приложения; + Можно создать свой Conan сервер с необходимыми для установки файлами; - Требуется Python (хотя в “тестовом” режиме достаточно brew / CMake); 20
  • 21. Conan + Boost, что на входе >> cat conanfile.txt [requires] Boost/1.63.0@eliaskousk/stable [generators] Cmake >> cat CMakeLists.txt include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) conan_basic_setup() add_executable(mymain main.cpp) target_link_libraries(mymain ${CONAN_LIBS}) 21
  • 22. Conan + Boost, что на выходе Запуск #1 conan install . 5.17s user 3.99s system 24% cpu 37.810 total Запуск #2+ conan install . 0.42s user 0.23s system 80% cpu 0.801 total Размер 152 MB. Запускать пришлось так: DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:~/.conan/data/Boost/1.63.0/eliaskousk/stabl e/package/799fada071d3f31a4af934c4bb02dc71da78a99b/lib/ ./bin/mymain 22
  • 23. Conan + OpenSSL, что на входе >> cat conanfile.txt [requires] OpenSSL/1.0.2g@lasote/stable [generators] Cmake >> cat CMakeLists.txt include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) conan_basic_setup() add_executable(mymain main.cpp) target_link_libraries(mymain ${CONAN_LIBS}) 23
  • 24. Conan + OpenSSL, что на выходе Запуск #1 conan install 70.27s user 17.62s system 85% cpu 1:42.98 total Запуск #2+ conan install . 0.42s user 0.23s system 80% cpu 0.801 total Размер 264 MB. Скомпилированные на лету библиотеки. (Boost лежит там же и занимает 152 MB). На самом деле пришлось вызвать conan install . --build OpenSSL 24
  • 25. Conan Конструкция <projdir>/conanbuild.info - conan CMake пути к библиотекам и CMake макросы; /conaninfo.txt - настр. проекта (опции библ., архитектура, компилятор). ~/.conan/conan.conf /settings.yml /data/OpenSSL/1.0.2g/lasote/stable /data/Boost/1.63.0/eliaskousk/stable /export/FindBoost.cmake /package/799.someid.99b/FindBoost.cmake /conaninfo.txt /include/boost/*/*.hpp /lib/libboost_*.dylib 25
  • 26. Hunter - CMake-driven cross-platform package manager for C++ + Платформы: Linux, Mac, Windows, iOS, Android, Raspberry Pi; + Мультиверсионность на одной машине для разных проектов; + По идеологии компилирует библиотеки на месте при возможности; + Есть список поддерживаемых пакетов; - Чтобы использовать надо подсунуть CMake файл (можно добавить submodule в git); 26
  • 27. Hunter + Boost, что на входе 27 >> cat CMakeLists.txt cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR) include("HunterGate.cmake") HunterGate( URL "https://github.com/ruslo/hunter/archive/v0.16.15.tar.gz" SHA1 "6974c2150fc0d3b09de3ad1efcbf15d360647ffa" ) hunter_add_package(Boost COMPONENTS system filesystem) find_package(Boost CONFIG REQUIRED system filesystem) add_executable(mymain main.cpp) target_link_libraries(mymain PUBLIC Boost::system Boost::filesystem)
  • 28. Hunter + Boost, что на выходе Запуск #1 cmake ./ 167.38s user 60.10s system 38% cpu 9:54.94 total Запуск #2+ cmake ./ 1.11s user 0.62s system 79% cpu 2.186 total Размер 202 MB (скомпилированные библиотеки Boost “на лету”) / вместе с исходным кодом Boost. + thread, chrono, date_time, regex, atomic, program_options, test, log. Запуск #1 cmake ./ 1501.32s user 240.93s system 158% cpu 18:18.56 total Запуск #2+ cmake ./ 1.76s user 1.43s system 81% cpu 3.921 total Размер 417 MB (скомпилированные библиотеки Boost “на лету”) / вместе с исходным кодом Boost. 28
  • 29. Hunter + OpenSSL, что на входе 29 >> cat CMakeLists.txt cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR) include("HunterGate.cmake") HunterGate( URL "https://github.com/ruslo/hunter/archive/v0.16.15.tar.gz" SHA1 "6974c2150fc0d3b09de3ad1efcbf15d360647ffa" ) hunter_add_package(OpenSSL) find_package(OpenSSL REQUIRED) add_executable(mymain main.cpp) target_link_libraries(mymain OpenSSL::SSL OpenSSL::Crypto)
  • 30. Hunter + OpenSSL, что на выходе Запуск #1 cmake ./ 74.84s user 21.52s system 83% cpu 1:55.82 total Запуск #2+ cmake ./ 1.07s user 0.66s system 88% cpu 1.951 total Размер 433 MB (скомпилированные библиотеки OpenSSL “на лету”) / вместе с исходным кодом OpenSSL. (Boost лежит там же и занимает 417 MB). 30
  • 31. Hunter Конструкция <projdir>/_3rdParty/Hunter/install-root-dir - путь к каталогу библиотекам; /config-id/config.cmake - версии библ. по умолчанию; /toolchain/ ~/.hunter/_Base/Download/Boost/1.62.0/5fd9743/boost_1_62_0.tar.bz2 /Hunter/0.16.15/69754c21/v.0.16.15.tar.gz /Unpacked/ … ~/.hunter/_Base/Cache/meta/93b575e/Boost/ ... ~/.hunter/_Base/Cache/meta/93b575e/OpenSSL/ ... ~/.hunter/_Base/6974c21/78315bd/93b575e/ /Build/Boost/ ... /Install/ - симуляция корневого <ROOT> каталога. 31
  • 32. Спасибо! Иван Сидоров [email protected] 32 Хорошие решения - результат опыта. Опыт результат плохих решений.(с)