Использование maven для сборки больших модульных c++ проектов на примере Odin Service Automation

В докладе рассматривается технология сборки C++ проектов на основе maven, применяемая в Odin Service Automation (OSA). OSA – это мультиплатформенный (Windows, Linux), мультиязыковый (C++, C#, Java), большой (~1MLOC C++ кода, ~2MLOC Java кода), распределённо разрабатываемый (команды в Мск и Нск) проект.

До недавнего времени сборка OSA осуществлялась через pmake / msbuild с применением распределённой компиляции (distcc), процесс сборки управлялся многочисленными обвязочными скриптами. С ростом продукта проявились негативные стороны применяемой технологии:
– практически не работающая инкрементальная сборка, что заставляло делать частые и длительные clean сборки;
– отсутствие независимо собираемых модулей (монолитность) увеличивало время сборки и делало цену ошибки в логически независимых модулях очень великой, т.к. блокировала разработку всех команд;
– обвязочные in-house скрипты делали высокой стоимость владения системой сборки, осложняли включение новых разработчиков в работу.

Было принято решение о переходе на maven для сборки OSA. Maven – это система сборки традиционно применяемая в Java проектах. Сильные стороны maven:
– продвинутая система управления зависимостями (dependency management) с поддержкой удаленных репозиториев;
– встроенная поддержка параллелизации сборки;
– большое community разработчиков и пользователей.

С другой стороны на сборку C++ проектов maven изначально не рассчитан. Поэтому были выработаны технические решения по следующим аспектам:
– система абстрактных проектов для различных вариантов сборки C++ артефактов (исполнимый файл, статическая и динамическая библиотека);
– автоматическая кодогенерация;
– сборка и пакование (build and packaging) C++ артефактов;
– размещения и хранение (deployment and storage) C++ артефактов;
– подключение и использование (consuming) C++ артефактов;
– работа с внешними (contrib) C++ проектами;
– параллелизация сборки;
– модуляризация проекта: ячейки (cells) и модули (modules).

Использование maven для сборки OSA позволило:
– провести разбиение проекта на отдельно собираемые модули;
– сократить время сборки на 60%;
– существенно снизить стоимость владения build системой.

В заключении доклада приводятся цена перехода:
– трудозатраты ~4ч/л;
– утрата распределённой сборки.

Также приводятся некоторые соображения относительно того, когда переход на maven для С++ является целесообразным.


Comments are closed.