Upload
sergey-platonov
View
408
Download
2
Embed Size (px)
Citation preview
Менеджер зависимостей для С++
Руслан Муллахметов
Проблемы С++
Как превратить кучу кода в исполняемый файл?
Системы Сборки
Организуют процесс сборки
Связывают воедино промежуточные артефакты
Осуществляют локальный поиск зависимостей
Системы сборки
shell files
make
autotools
scons
cmake
biicode (?)
Процесс сборки в высшей степени
зависит от окружения
разработчика в момент сборки
Проблемы систем сборки
Лишь проверяют, что сборка возможна
check for XYZ …. ok
Нет гарантий на предсказуемость сборки
/usr/local/include
etc
Транзитивные зависимости
A B C
???
Менеджер зависимостей
Реазлизации
biicode (закрылся)
clibs (включает код в source tree)
что-то еще?
Неудача biicode
собственное хранилище исходного кода (дублирование VCS)
Отсутствие предсобранных пакетов
Единый репозиторий - отсутствие децентрализации
Два подхода
Универсальное решение для полного цикла сборки (интрузивный)
Только разрешение и доставка зависимостей (неинтрузивный)
ТребованияПодготовка окружения к сборке
Независимость от системы сборки
Активное использование VCS
Децентрализованная архитектура по модели git
Возможность использования предсобранных пакетов для ускорения времени сборки
контроль конфигурациями зависимостей
cdist
прототип
использует git для хранения репозитория пакетов
разрешает транзитивные зависимости
не поддерживает опции и сборку между репозиториями
хранит описание пакета в yaml формате
libfooexample.com/foo/foo.git <local-dir>/foo/cdist.yaml
. ├── Makefile ├── include │ └── foo.h └── src └── foo.cpp
id: foo version: 0.0.1 source: git://example.com/foo/foo.git build: - make - "make install DESTDIR={{DESTDIR}} PREFIX=" export: include_dir: "{{DESTDIR}}/include" library_dir: "{{DESTDIR}}/lib" library: foo
<local-dir>/foo/ myregistry.com/registry.git
$ cdist add .
. ├── foo │ └── 0.0.1.yaml └── readme.md
1 2
3 4
bar<project-dir> <project-dir>/cdist.yaml
. ├── Makefile ├── include │ └── foo.h └── src └── foo.cpp
id: bar version: 0.0.1 source: . deps: - [email protected] build: - mkdir -p build - "cd build && cmake .. '-DCMAKE_SYSTEM_INCLUDE_PATH={{#INCLUDE_DIRS}}{{x}};{{/INCLUDE_DIRS}}' '-DCMAKE_SYSTEM_LIBRARY_PATH={{#LIB_DIRS}}{{x}};{{/LIB_DIRS}}'"
- "cd build && make"
<project-dir> ~/.cdist/index - clone/pull
$ cdist build .
. ├── foo │ └── 0.0.1.yaml └── readme.md
1 2
3 4
bar (2)
5
6
~/.cdist/cache
$ git clone git://example.com/foo/foo.git foo/0.0.1/src $ cd foo/0.0.1/src $ make $ make install DESTDIR=~./cdist/cache/foo/0.0.1/dest PREFIX=
~/cdist/cache/foo/0.0.1/dest
. ├── include │ └── foo.h └── lib └── libfoo.a
<project-dir>
$ mkdir -p build $ cd build && cmake .. -DCMAKE_SYSTEM_INCLUDE_PATH=~/.cdist/foo/0.0.1/dest/include/’ -DCMAKE_SYSTEM_LIBRARY_PATH=~/.cdist/foo/0.0.1/dest/lib/ 7
Устройство
Пакет A
СборкаАртефакты
mv $dir/
Артефакты +
переменные
Сборка -I$INCLUDE_DIR
Пакет B
Открытые вопросы
Наследование флагов и дефайнов от зависимостей с правильным порядком
Использование нескольких версий одной и той же библиотеки
Использование статических и динамических библиотек
Опции для сборок и проблемы возникающие при этом
Релейные и дебажные версии: как определять, как зависеть
C++11 etc
Тесты