Руслан Муллахметов, Открытый и неинтрузивный менеджер...

18
М енеджер зависимостей для С ++ Руслан Муллахметов

Upload: sergey-platonov

Post on 16-Apr-2017

412 views

Category:

Software


2 download

TRANSCRIPT

Page 1: Руслан Муллахметов, Открытый и неинтрузивный менеджер зависимостей для С++

Менеджер зависимостей для С++

Руслан Муллахметов

Page 2: Руслан Муллахметов, Открытый и неинтрузивный менеджер зависимостей для С++

Проблемы С++

Как превратить кучу кода в исполняемый файл?

Page 3: Руслан Муллахметов, Открытый и неинтрузивный менеджер зависимостей для С++

Системы Сборки

Организуют процесс сборки

Связывают воедино промежуточные артефакты

Осуществляют локальный поиск зависимостей

Page 4: Руслан Муллахметов, Открытый и неинтрузивный менеджер зависимостей для С++

Системы сборки

shell files

make

autotools

scons

cmake

biicode (?)

Page 5: Руслан Муллахметов, Открытый и неинтрузивный менеджер зависимостей для С++

Процесс сборки в высшей степени

зависит от окружения

разработчика в момент сборки

Page 6: Руслан Муллахметов, Открытый и неинтрузивный менеджер зависимостей для С++

Проблемы систем сборки

Лишь проверяют, что сборка возможна

check for XYZ …. ok

Нет гарантий на предсказуемость сборки

/usr/local/include

etc

Page 7: Руслан Муллахметов, Открытый и неинтрузивный менеджер зависимостей для С++

Транзитивные зависимости

A B C

???

Page 8: Руслан Муллахметов, Открытый и неинтрузивный менеджер зависимостей для С++

Менеджер зависимостей

Page 9: Руслан Муллахметов, Открытый и неинтрузивный менеджер зависимостей для С++

Реазлизации

biicode (закрылся)

clibs (включает код в source tree)

что-то еще?

Page 10: Руслан Муллахметов, Открытый и неинтрузивный менеджер зависимостей для С++

Неудача biicode

собственное хранилище исходного кода (дублирование VCS)

Отсутствие предсобранных пакетов

Единый репозиторий - отсутствие децентрализации

Page 11: Руслан Муллахметов, Открытый и неинтрузивный менеджер зависимостей для С++

Два подхода

Универсальное решение для полного цикла сборки (интрузивный)

Только разрешение и доставка зависимостей (неинтрузивный)

Page 12: Руслан Муллахметов, Открытый и неинтрузивный менеджер зависимостей для С++

ТребованияПодготовка окружения к сборке

Независимость от системы сборки

Активное использование VCS

Децентрализованная архитектура по модели git

Возможность использования предсобранных пакетов для ускорения времени сборки

контроль конфигурациями зависимостей

Page 13: Руслан Муллахметов, Открытый и неинтрузивный менеджер зависимостей для С++

cdist

прототип

использует git для хранения репозитория пакетов

разрешает транзитивные зависимости

не поддерживает опции и сборку между репозиториями

хранит описание пакета в yaml формате

Page 14: Руслан Муллахметов, Открытый и неинтрузивный менеджер зависимостей для С++

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

Page 15: Руслан Муллахметов, Открытый и неинтрузивный менеджер зависимостей для С++

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

Page 16: Руслан Муллахметов, Открытый и неинтрузивный менеджер зависимостей для С++

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

Page 17: Руслан Муллахметов, Открытый и неинтрузивный менеджер зависимостей для С++

Устройство

Пакет A

СборкаАртефакты

mv $dir/

Артефакты +

переменные

Сборка -I$INCLUDE_DIR

Пакет B

Page 18: Руслан Муллахметов, Открытый и неинтрузивный менеджер зависимостей для С++

Открытые вопросы

Наследование флагов и дефайнов от зависимостей с правильным порядком

Использование нескольких версий одной и той же библиотеки

Использование статических и динамических библиотек

Опции для сборок и проблемы возникающие при этом

Релейные и дебажные версии: как определять, как зависеть

C++11 etc

Тесты