SlideShare a Scribd company logo
1 of 16
Download to read offline
C++ CoreHard Autumn 2017
MxxRu::externals
Repositoryless Dependency Manager
Евгений Охотников
Откуда ноги растут?
Начало 2016-го года.
Нужно было уйти с Svn на Git или Hg.
Но Svn использовался и для управления зависимостями (svn:externals).
Аналоги svn:externals в Git и в Hg не понравились.
biicode умер, conan и hunter только-только появились, vcpkg еще не было...
Наиболее подходящим был CMake-овский ExternalProject_Add. Но сам CMake...
2
Чего хотелось достичь?
Взять любой чужой проект в исходниках и подключить к себе то, что из этого
проекта нужно.
Чужой проект должен жить и распространяться так, как удобно авторам
чужого проекта. Нельзя рассчитывать на то, что они сделают нужный тебе
пакет и зальют в нужный репозиторий.
Должны поддерживаться Git, Hg, Svn и архивы (zip, .tar.gz, .tar.bz2, .tar.xz)...
Работа под Windows, Linux, FreeBSD + MacOS (если повезет).
3
Ну и мы этого достигли
require 'mxx_ru/externals'
MxxRu::git_externals :asio do |e|
e.url 'https://github.com/chriskohlhoff/asio.git'
e.commit 'f5c570826d2ebf50eb38c44039181946a473148b'
e.map_dir 'asio/include' => 'dev/asio'
end
MxxRu::arch_externals :nodejs_http_parser do |e|
e.url 'https://github.com/nodejs/http-parser/archive/v2.7.1.tar.gz'
e.map_file 'http_parser.h' => 'dev/nodejs/http_parser/*'
e.map_file 'http_parser.c' => 'dev/nodejs/http_parser/*'
end
MxxRu::hg_externals :eigen do |ext|
ext.url = 'https://bitbucket.org/eigen/eigen'
ext.tag = '3.2.5'
ext.map_dir 'Eigen' => 'dev'
ext.map_file 'INSTALL' => 'INSTALL.eigen'
end
4
Забрать зависимость из Git
require 'mxx_ru/externals'
MxxRu::git_externals :asio do |e|
e.url 'https://github.com/chriskohlhoff/asio.git'
e.commit 'f5c570826d2ebf50eb38c44039181946a473148b'
e.map_dir 'asio/include' => 'dev/asio'
end
MxxRu::arch_externals :nodejs_http_parser do |e|
e.url 'https://github.com/nodejs/http-parser/archive/v2.7.1.tar.gz'
e.map_file 'http_parser.h' => 'dev/nodejs/http_parser/*'
e.map_file 'http_parser.c' => 'dev/nodejs/http_parser/*'
end
MxxRu::hg_externals :eigen do |ext|
ext.url = 'https://bitbucket.org/eigen/eigen'
ext.tag = '3.2.5'
ext.map_dir 'Eigen' => 'dev'
ext.map_file 'INSTALL' => 'INSTALL.eigen'
end
5
MxxRu::git_externals :asio do |e|
e.url 'https://github.com/chriskohlhoff/asio.git'
e.commit 'f5c570826d2ebf50eb38c44039181946a473148b'
e.map_dir 'asio/include' => 'dev/asio'
end
Забрать зависимость из Hg
require 'mxx_ru/externals'
MxxRu::git_externals :asio do |e|
e.url 'https://github.com/chriskohlhoff/asio.git'
e.commit 'f5c570826d2ebf50eb38c44039181946a473148b'
e.map_dir 'asio/include' => 'dev/asio'
end
MxxRu::arch_externals :nodejs_http_parser do |e|
e.url 'https://github.com/nodejs/http-parser/archive/v2.7.1.tar.gz'
e.map_file 'http_parser.h' => 'dev/nodejs/http_parser/*'
e.map_file 'http_parser.c' => 'dev/nodejs/http_parser/*'
end
MxxRu::hg_externals :eigen do |ext|
ext.url = 'https://bitbucket.org/eigen/eigen'
ext.tag = '3.2.5'
ext.map_dir 'Eigen' => 'dev/Eigen'
ext.map_file 'INSTALL' => 'INSTALL.eigen'
end
6
MxxRu::hg_externals :eigen do |ext|
ext.url = 'https://bitbucket.org/eigen/eigen'
ext.tag = '3.2.5'
ext.map_dir 'Eigen' => 'dev'
ext.map_file 'INSTALL' => 'INSTALL.eigen'
end
Забрать зависимость из архива
require 'mxx_ru/externals'
MxxRu::git_externals :asio do |e|
e.url 'https://github.com/chriskohlhoff/asio.git'
e.commit 'f5c570826d2ebf50eb38c44039181946a473148b'
e.map_dir 'asio/include' => 'dev/asio'
end
MxxRu::arch_externals :nodejs_http_parser do |e|
e.url 'https://github.com/nodejs/http-parser/archive/v2.7.1.tar.gz'
e.map_file 'http_parser.h' => 'dev/nodejs/http_parser/*'
e.map_file 'http_parser.c' => 'dev/nodejs/http_parser/*'
end
MxxRu::hg_externals :eigen do |ext|
ext.url = 'https://bitbucket.org/eigen/eigen'
ext.tag = '3.2.5'
ext.map_dir 'Eigen' => 'dev'
ext.map_file 'INSTALL' => 'INSTALL.eigen'
end
7
MxxRu::arch_externals :nodejs_http_parser do |e|
e.url 'https://github.com/nodejs/http-parser/archive/v2.7.1.tar.gz'
e.map_file 'http_parser.h' => 'dev/nodejs/http_parser/*'
e.map_file 'http_parser.c' => 'dev/nodejs/http_parser/*'
end
Как это работает?
1. Подготавливается нужная структура каталогов.
8
~/my_project
├── dev/
├── LICENSE
└── README.md
Как это работает?
2. В корень помещается externals.rb
9
~/my_project
├── dev/
├── externals.rb
├── LICENSE
└── README.md
require 'mxx_ru/externals'
MxxRu::git_externals :asio do |e|
e.url 'https://github.com/chriskohlhoff/asio.git'
e.commit 'f5c570826d2ebf50eb38c44039181946a473148b'
e.map_dir 'asio/include' => 'dev/asio'
end
MxxRu::arch_externals :nodejs_http_parser do |e|
e.url 'https://github.com/nodejs/http-parser/archive/v2.7.1.tar.gz'
e.map_file 'http_parser.h' => 'dev/nodejs/http_parser/*'
e.map_file 'http_parser.c' => 'dev/nodejs/http_parser/*'
end
MxxRu::hg_externals :eigen do |ext|
ext.url = 'https://bitbucket.org/eigen/eigen'
...
Как это работает?
3. В корне запускается mxxruexternals
10
~/my_project
├── dev/
├── externals.rb
├── LICENSE
└── README.md
$ cd ~/my_project
$ mxxruexternals
[Info] Generation of auxilary rakefile: ./mxxruexternals-temp20171011-19367-10hgydw
[Info] Launching rake with: rake -f ./mxxruexternals-temp20171011-19367-10hgydw install
mkdir -p .externals
git clone https://github.com/chriskohlhoff/asio.git .externals/asio.19369.10694860
Cloning into '.externals/asio.19369.10694860'...
Как это работает?
11
~/my_project
├── dev
...
└── .externals
├── asio
│ ├── asio
│ └── .git
├── eigen
│ ├── bench
...
│ └── .hg
└── nodejs_http_parser
└── contrib
mxxruexternals загружает все
зависимости в отдельный подкаталог
└── .externals
├── asio
│ ├── asio
│ └── .git
├── eigen
│ ├── bench
...
│ └── .hg
└── nodejs_http_parser
└── contrib
Как это работает?
12
~/my_project
├── dev
│ ├── asio
│ │ └── include
│ ├── Eigen
│ │ └── src
│ └── nodejs
│ └── http_parser
└── .externals
├── asio
│ ├── asio
│ └── .git
├── eigen
│ ├── bench
...
│ └── .hg
└── nodejs_http_parser
└── contrib
Затем mxxruexternals копирует только
то, что нам нужно и туда, куда нужно:
└── dev
├── asio
│ └── include
├── Eigen
│ └── src
└── nodejs
└── http_parser
Как это работает?
4. Получаем результат
13
~/my_project
├── dev
│ ├── asio
│ │ └── include
│ ├── Eigen
│ │ └── src
│ └── nodejs
│ └── http_parser
└── .externals
├── asio
│ ├── asio
│ └── .git
├── eigen
│ ├── bench
...
│ └── .hg
└── nodejs_http_parser
└── contrib
Ну и как оно?
Очень удобно!
Полтора года в активном использовании.
Пока не довелось попробовать с большими зависимостями вроде Boost, ICU,
Qt и т.п.
Что доводилось подключать чужого: ACE, Asio (standalone), Beast, C++REST
SDK, Catch, Pistache, RapidJSON, RestBed, SOCI, fmt, libmosquitto, spdlog
14
Как взять и попробовать?
Установить Ruby (и RubyGems)
Установить Mxx_ru:
gem install Mxx_ru
Поискать примеры и описания здесь: eao197.blogspot.com
До нормальной документации пока руки не дошли.
15
Будущее?
Не факт, что оно есть у самого MxxRu::externals...
Но может быть это кого-то подтолкнет к созданию чего-то более удачного.
Поскольку conan, hunter, cppan, vcpkg и пр. менеджеры с репозиториями
пакетов ‒ это хорошо, но вряд ли подходит для очень сегментированного
мира C++.
16

More Related Content

Viewers also liked

Analysis and interpretation of monitoring data
Analysis and interpretation of monitoring dataAnalysis and interpretation of monitoring data
Analysis and interpretation of monitoring datacorehard_by
 
Battle: BDD vs notBDD
Battle: BDD vs notBDDBattle: BDD vs notBDD
Battle: BDD vs notBDDCOMAQA.BY
 
Restinio - header-only http and websocket server
Restinio - header-only http and websocket serverRestinio - header-only http and websocket server
Restinio - header-only http and websocket servercorehard_by
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаcorehard_by
 
Abseil - let the savior come?
Abseil - let the savior come?Abseil - let the savior come?
Abseil - let the savior come?corehard_by
 
Обработка потока данных на примере deep packet inspection: внутренняя архитек...
Обработка потока данных на примере deep packet inspection: внутренняя архитек...Обработка потока данных на примере deep packet inspection: внутренняя архитек...
Обработка потока данных на примере deep packet inspection: внутренняя архитек...corehard_by
 
C++ in kernel mode
C++ in kernel modeC++ in kernel mode
C++ in kernel modecorehard_by
 
Субъекторная модель
Субъекторная модельСубъекторная модель
Субъекторная модельcorehard_by
 
Mixing C++ & Python II: Pybind11
Mixing C++ & Python II: Pybind11Mixing C++ & Python II: Pybind11
Mixing C++ & Python II: Pybind11corehard_by
 
The beast is becoming functional
The beast is becoming functionalThe beast is becoming functional
The beast is becoming functionalcorehard_by
 
C++ and Assembly: Debugging and Reverse Engineering
C++ and Assembly: Debugging and Reverse EngineeringC++ and Assembly: Debugging and Reverse Engineering
C++ and Assembly: Debugging and Reverse Engineeringcorehard_by
 
C++Now Trip Report
C++Now Trip ReportC++Now Trip Report
C++Now Trip Reportcorehard_by
 
(Не)чёткий поиск
(Не)чёткий поиск(Не)чёткий поиск
(Не)чёткий поискcorehard_by
 
C++ в играх, больших и не очень
C++ в играх, больших и не оченьC++ в играх, больших и не очень
C++ в играх, больших и не оченьcorehard_by
 
Ускоряем сборку С++ проектов. Практика использования unity-сборок
Ускоряем сборку С++ проектов. Практика использования unity-сборокУскоряем сборку С++ проектов. Практика использования unity-сборок
Ускоряем сборку С++ проектов. Практика использования unity-сборокcorehard_by
 
Actors for fun and profit
Actors for fun and profitActors for fun and profit
Actors for fun and profitcorehard_by
 
Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?COMAQA.BY
 
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...Ontico
 
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)Ontico
 

Viewers also liked (20)

Analysis and interpretation of monitoring data
Analysis and interpretation of monitoring dataAnalysis and interpretation of monitoring data
Analysis and interpretation of monitoring data
 
Battle: BDD vs notBDD
Battle: BDD vs notBDDBattle: BDD vs notBDD
Battle: BDD vs notBDD
 
Restinio - header-only http and websocket server
Restinio - header-only http and websocket serverRestinio - header-only http and websocket server
Restinio - header-only http and websocket server
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Abseil - let the savior come?
Abseil - let the savior come?Abseil - let the savior come?
Abseil - let the savior come?
 
Обработка потока данных на примере deep packet inspection: внутренняя архитек...
Обработка потока данных на примере deep packet inspection: внутренняя архитек...Обработка потока данных на примере deep packet inspection: внутренняя архитек...
Обработка потока данных на примере deep packet inspection: внутренняя архитек...
 
C++ in kernel mode
C++ in kernel modeC++ in kernel mode
C++ in kernel mode
 
Субъекторная модель
Субъекторная модельСубъекторная модель
Субъекторная модель
 
Mixing C++ & Python II: Pybind11
Mixing C++ & Python II: Pybind11Mixing C++ & Python II: Pybind11
Mixing C++ & Python II: Pybind11
 
Benchmark it
Benchmark itBenchmark it
Benchmark it
 
The beast is becoming functional
The beast is becoming functionalThe beast is becoming functional
The beast is becoming functional
 
C++ and Assembly: Debugging and Reverse Engineering
C++ and Assembly: Debugging and Reverse EngineeringC++ and Assembly: Debugging and Reverse Engineering
C++ and Assembly: Debugging and Reverse Engineering
 
C++Now Trip Report
C++Now Trip ReportC++Now Trip Report
C++Now Trip Report
 
(Не)чёткий поиск
(Не)чёткий поиск(Не)чёткий поиск
(Не)чёткий поиск
 
C++ в играх, больших и не очень
C++ в играх, больших и не оченьC++ в играх, больших и не очень
C++ в играх, больших и не очень
 
Ускоряем сборку С++ проектов. Практика использования unity-сборок
Ускоряем сборку С++ проектов. Практика использования unity-сборокУскоряем сборку С++ проектов. Практика использования unity-сборок
Ускоряем сборку С++ проектов. Практика использования unity-сборок
 
Actors for fun and profit
Actors for fun and profitActors for fun and profit
Actors for fun and profit
 
Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?
 
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
 
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
 

Similar to MxxRu::externals: Repositoryless Dependency Manager

Владимир Варанкин — «БЭМ: практика»
Владимир Варанкин — «БЭМ: практика»Владимир Варанкин — «БЭМ: практика»
Владимир Варанкин — «БЭМ: практика»Yandex
 
Андрей Михайлов. Vagrant. Быстрое развертывание среды
Андрей Михайлов. Vagrant. Быстрое развертывание средыАндрей Михайлов. Vagrant. Быстрое развертывание среды
Андрей Михайлов. Vagrant. Быстрое развертывание средыDrupalSib
 
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Ontico
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Ontico
 
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...Ontico
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ciАлександр Сигачев
 
Git, как инструмент управления веб-контентом
Git, как инструмент управления веб-контентомGit, как инструмент управления веб-контентом
Git, как инструмент управления веб-контентомAlex Musayev
 
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...Ontico
 
Как удержать проект от анархии с помощью Git
Как удержать проект от анархии с помощью GitКак удержать проект от анархии с помощью Git
Как удержать проект от анархии с помощью Gitphpdevby
 
State of the Standardized Web. YaC 2014
State of theStandardized Web. YaC 2014State of theStandardized Web. YaC 2014
State of the Standardized Web. YaC 2014Yandex
 
Самоорганизующаяся сервисная инфраструктура на базе Docker / Данила Штань (То...
Самоорганизующаяся сервисная инфраструктура на базе Docker / Данила Штань (То...Самоорганизующаяся сервисная инфраструктура на базе Docker / Данила Штань (То...
Самоорганизующаяся сервисная инфраструктура на базе Docker / Данила Штань (То...Ontico
 
Development of a plugin for VS Code that supports ACSL language.
Development of a plugin for VS Code that supports ACSL language.Development of a plugin for VS Code that supports ACSL language.
Development of a plugin for VS Code that supports ACSL language.Denis Zakharov
 
Антон Каляев — Быстрое развертывание среды с Vagrant
Антон Каляев — Быстрое развертывание среды с VagrantАнтон Каляев — Быстрое развертывание среды с Vagrant
Антон Каляев — Быстрое развертывание среды с VagrantDaria Oreshkina
 
Применение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюденияПрименение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюденияcorehard_by
 
Introduction in Node.js (in russian)
Introduction in Node.js (in russian)Introduction in Node.js (in russian)
Introduction in Node.js (in russian)Mikhail Davydov
 

Similar to MxxRu::externals: Repositoryless Dependency Manager (20)

Git for you
Git for youGit for you
Git for you
 
Владимир Варанкин — «БЭМ: практика»
Владимир Варанкин — «БЭМ: практика»Владимир Варанкин — «БЭМ: практика»
Владимир Варанкин — «БЭМ: практика»
 
Андрей Михайлов. Vagrant. Быстрое развертывание среды
Андрей Михайлов. Vagrant. Быстрое развертывание средыАндрей Михайлов. Vagrant. Быстрое развертывание среды
Андрей Михайлов. Vagrant. Быстрое развертывание среды
 
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
 
Jenkins в docker in mesos in ...
Jenkins в docker in mesos in ...Jenkins в docker in mesos in ...
Jenkins в docker in mesos in ...
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
 
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ci
 
Приручаем Git
Приручаем GitПриручаем Git
Приручаем Git
 
Git, как инструмент управления веб-контентом
Git, как инструмент управления веб-контентомGit, как инструмент управления веб-контентом
Git, как инструмент управления веб-контентом
 
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
 
Как удержать проект от анархии с помощью Git
Как удержать проект от анархии с помощью GitКак удержать проект от анархии с помощью Git
Как удержать проект от анархии с помощью Git
 
Little Service in 2h
Little Service in 2hLittle Service in 2h
Little Service in 2h
 
State of the Standardized Web. YaC 2014
State of theStandardized Web. YaC 2014State of theStandardized Web. YaC 2014
State of the Standardized Web. YaC 2014
 
Самоорганизующаяся сервисная инфраструктура на базе Docker / Данила Штань (То...
Самоорганизующаяся сервисная инфраструктура на базе Docker / Данила Штань (То...Самоорганизующаяся сервисная инфраструктура на базе Docker / Данила Штань (То...
Самоорганизующаяся сервисная инфраструктура на базе Docker / Данила Штань (То...
 
Development of a plugin for VS Code that supports ACSL language.
Development of a plugin for VS Code that supports ACSL language.Development of a plugin for VS Code that supports ACSL language.
Development of a plugin for VS Code that supports ACSL language.
 
Антон Каляев — Быстрое развертывание среды с Vagrant
Антон Каляев — Быстрое развертывание среды с VagrantАнтон Каляев — Быстрое развертывание среды с Vagrant
Антон Каляев — Быстрое развертывание среды с Vagrant
 
Git intro
Git introGit intro
Git intro
 
Применение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюденияПрименение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюдения
 
Introduction in Node.js (in russian)
Introduction in Node.js (in russian)Introduction in Node.js (in russian)
Introduction in Node.js (in russian)
 

More from corehard_by

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

More from corehard_by (20)

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

MxxRu::externals: Repositoryless Dependency Manager

  • 1. C++ CoreHard Autumn 2017 MxxRu::externals Repositoryless Dependency Manager Евгений Охотников
  • 2. Откуда ноги растут? Начало 2016-го года. Нужно было уйти с Svn на Git или Hg. Но Svn использовался и для управления зависимостями (svn:externals). Аналоги svn:externals в Git и в Hg не понравились. biicode умер, conan и hunter только-только появились, vcpkg еще не было... Наиболее подходящим был CMake-овский ExternalProject_Add. Но сам CMake... 2
  • 3. Чего хотелось достичь? Взять любой чужой проект в исходниках и подключить к себе то, что из этого проекта нужно. Чужой проект должен жить и распространяться так, как удобно авторам чужого проекта. Нельзя рассчитывать на то, что они сделают нужный тебе пакет и зальют в нужный репозиторий. Должны поддерживаться Git, Hg, Svn и архивы (zip, .tar.gz, .tar.bz2, .tar.xz)... Работа под Windows, Linux, FreeBSD + MacOS (если повезет). 3
  • 4. Ну и мы этого достигли require 'mxx_ru/externals' MxxRu::git_externals :asio do |e| e.url 'https://github.com/chriskohlhoff/asio.git' e.commit 'f5c570826d2ebf50eb38c44039181946a473148b' e.map_dir 'asio/include' => 'dev/asio' end MxxRu::arch_externals :nodejs_http_parser do |e| e.url 'https://github.com/nodejs/http-parser/archive/v2.7.1.tar.gz' e.map_file 'http_parser.h' => 'dev/nodejs/http_parser/*' e.map_file 'http_parser.c' => 'dev/nodejs/http_parser/*' end MxxRu::hg_externals :eigen do |ext| ext.url = 'https://bitbucket.org/eigen/eigen' ext.tag = '3.2.5' ext.map_dir 'Eigen' => 'dev' ext.map_file 'INSTALL' => 'INSTALL.eigen' end 4
  • 5. Забрать зависимость из Git require 'mxx_ru/externals' MxxRu::git_externals :asio do |e| e.url 'https://github.com/chriskohlhoff/asio.git' e.commit 'f5c570826d2ebf50eb38c44039181946a473148b' e.map_dir 'asio/include' => 'dev/asio' end MxxRu::arch_externals :nodejs_http_parser do |e| e.url 'https://github.com/nodejs/http-parser/archive/v2.7.1.tar.gz' e.map_file 'http_parser.h' => 'dev/nodejs/http_parser/*' e.map_file 'http_parser.c' => 'dev/nodejs/http_parser/*' end MxxRu::hg_externals :eigen do |ext| ext.url = 'https://bitbucket.org/eigen/eigen' ext.tag = '3.2.5' ext.map_dir 'Eigen' => 'dev' ext.map_file 'INSTALL' => 'INSTALL.eigen' end 5 MxxRu::git_externals :asio do |e| e.url 'https://github.com/chriskohlhoff/asio.git' e.commit 'f5c570826d2ebf50eb38c44039181946a473148b' e.map_dir 'asio/include' => 'dev/asio' end
  • 6. Забрать зависимость из Hg require 'mxx_ru/externals' MxxRu::git_externals :asio do |e| e.url 'https://github.com/chriskohlhoff/asio.git' e.commit 'f5c570826d2ebf50eb38c44039181946a473148b' e.map_dir 'asio/include' => 'dev/asio' end MxxRu::arch_externals :nodejs_http_parser do |e| e.url 'https://github.com/nodejs/http-parser/archive/v2.7.1.tar.gz' e.map_file 'http_parser.h' => 'dev/nodejs/http_parser/*' e.map_file 'http_parser.c' => 'dev/nodejs/http_parser/*' end MxxRu::hg_externals :eigen do |ext| ext.url = 'https://bitbucket.org/eigen/eigen' ext.tag = '3.2.5' ext.map_dir 'Eigen' => 'dev/Eigen' ext.map_file 'INSTALL' => 'INSTALL.eigen' end 6 MxxRu::hg_externals :eigen do |ext| ext.url = 'https://bitbucket.org/eigen/eigen' ext.tag = '3.2.5' ext.map_dir 'Eigen' => 'dev' ext.map_file 'INSTALL' => 'INSTALL.eigen' end
  • 7. Забрать зависимость из архива require 'mxx_ru/externals' MxxRu::git_externals :asio do |e| e.url 'https://github.com/chriskohlhoff/asio.git' e.commit 'f5c570826d2ebf50eb38c44039181946a473148b' e.map_dir 'asio/include' => 'dev/asio' end MxxRu::arch_externals :nodejs_http_parser do |e| e.url 'https://github.com/nodejs/http-parser/archive/v2.7.1.tar.gz' e.map_file 'http_parser.h' => 'dev/nodejs/http_parser/*' e.map_file 'http_parser.c' => 'dev/nodejs/http_parser/*' end MxxRu::hg_externals :eigen do |ext| ext.url = 'https://bitbucket.org/eigen/eigen' ext.tag = '3.2.5' ext.map_dir 'Eigen' => 'dev' ext.map_file 'INSTALL' => 'INSTALL.eigen' end 7 MxxRu::arch_externals :nodejs_http_parser do |e| e.url 'https://github.com/nodejs/http-parser/archive/v2.7.1.tar.gz' e.map_file 'http_parser.h' => 'dev/nodejs/http_parser/*' e.map_file 'http_parser.c' => 'dev/nodejs/http_parser/*' end
  • 8. Как это работает? 1. Подготавливается нужная структура каталогов. 8 ~/my_project ├── dev/ ├── LICENSE └── README.md
  • 9. Как это работает? 2. В корень помещается externals.rb 9 ~/my_project ├── dev/ ├── externals.rb ├── LICENSE └── README.md require 'mxx_ru/externals' MxxRu::git_externals :asio do |e| e.url 'https://github.com/chriskohlhoff/asio.git' e.commit 'f5c570826d2ebf50eb38c44039181946a473148b' e.map_dir 'asio/include' => 'dev/asio' end MxxRu::arch_externals :nodejs_http_parser do |e| e.url 'https://github.com/nodejs/http-parser/archive/v2.7.1.tar.gz' e.map_file 'http_parser.h' => 'dev/nodejs/http_parser/*' e.map_file 'http_parser.c' => 'dev/nodejs/http_parser/*' end MxxRu::hg_externals :eigen do |ext| ext.url = 'https://bitbucket.org/eigen/eigen' ...
  • 10. Как это работает? 3. В корне запускается mxxruexternals 10 ~/my_project ├── dev/ ├── externals.rb ├── LICENSE └── README.md $ cd ~/my_project $ mxxruexternals [Info] Generation of auxilary rakefile: ./mxxruexternals-temp20171011-19367-10hgydw [Info] Launching rake with: rake -f ./mxxruexternals-temp20171011-19367-10hgydw install mkdir -p .externals git clone https://github.com/chriskohlhoff/asio.git .externals/asio.19369.10694860 Cloning into '.externals/asio.19369.10694860'...
  • 11. Как это работает? 11 ~/my_project ├── dev ... └── .externals ├── asio │ ├── asio │ └── .git ├── eigen │ ├── bench ... │ └── .hg └── nodejs_http_parser └── contrib mxxruexternals загружает все зависимости в отдельный подкаталог └── .externals ├── asio │ ├── asio │ └── .git ├── eigen │ ├── bench ... │ └── .hg └── nodejs_http_parser └── contrib
  • 12. Как это работает? 12 ~/my_project ├── dev │ ├── asio │ │ └── include │ ├── Eigen │ │ └── src │ └── nodejs │ └── http_parser └── .externals ├── asio │ ├── asio │ └── .git ├── eigen │ ├── bench ... │ └── .hg └── nodejs_http_parser └── contrib Затем mxxruexternals копирует только то, что нам нужно и туда, куда нужно: └── dev ├── asio │ └── include ├── Eigen │ └── src └── nodejs └── http_parser
  • 13. Как это работает? 4. Получаем результат 13 ~/my_project ├── dev │ ├── asio │ │ └── include │ ├── Eigen │ │ └── src │ └── nodejs │ └── http_parser └── .externals ├── asio │ ├── asio │ └── .git ├── eigen │ ├── bench ... │ └── .hg └── nodejs_http_parser └── contrib
  • 14. Ну и как оно? Очень удобно! Полтора года в активном использовании. Пока не довелось попробовать с большими зависимостями вроде Boost, ICU, Qt и т.п. Что доводилось подключать чужого: ACE, Asio (standalone), Beast, C++REST SDK, Catch, Pistache, RapidJSON, RestBed, SOCI, fmt, libmosquitto, spdlog 14
  • 15. Как взять и попробовать? Установить Ruby (и RubyGems) Установить Mxx_ru: gem install Mxx_ru Поискать примеры и описания здесь: eao197.blogspot.com До нормальной документации пока руки не дошли. 15
  • 16. Будущее? Не факт, что оно есть у самого MxxRu::externals... Но может быть это кого-то подтолкнет к созданию чего-то более удачного. Поскольку conan, hunter, cppan, vcpkg и пр. менеджеры с репозиториями пакетов ‒ это хорошо, но вряд ли подходит для очень сегментированного мира C++. 16