Анализируйте, визуализируйте и переходите между сборочными системами
Ваша сборка C ++ работает медленно или неразборчиво? В настоящее время мы ищем дополнительные тематические исследования. Если вы заинтересованы в улучшении вашей сборки на базе Linux (коммерческой или с открытым исходным кодом), пожалуйста, свяжитесь с нами!
Сообщество C ++ фрагментировано из-за разнообразия используемых систем сборки. Эта фрагментация затрудняет:
- Понять, как работает сторонняя библиотека
- Объедините две библиотеки вместе
- Оптимизация между библиотеками (например, LTO)
- Инструменты сборки для исходного кода C ++ (где заголовки?)
- Реализовать кеширование артефактов
- Определите, какие шаги в процессе сборки замедляют вас
Для сообщества C ++ это означает:
- Время, потраченное на склейку проектов
- Время потрачено на ожидание медленных сборок
- Потраченное время на переписывание кода, который уже существует, но трудно интегрировать
Разве не было бы замечательно, если бы мы могли извлечь удобочитаемое описание сборки любого проекта C ++, независимо от используемой системы сборки?
Анонс BuildInfer
Записывая процесс сборки на системном уровне, мы можем вывести высокоуровневую информацию о структуре проекта. Поскольку BuildInfer выполняет запись на этом низком уровне, наш метод работает для любой системы сборки C ++.
Получив высокоуровневое описание сборки, мы можем визуализировать, преобразовывать и даже переносить сложные системы сборки на более мощные, такие как Buck и Bazel.
Первоначальные результаты
Мы уже успешно портировали на Бак следующие проекты:
Более того, мы обнаружили, что ни один из этих проектов не поставляется с воспроизводимой системой сборки! Перенося их на Buck, мы можем это гарантировать.
Воспроизводимые сборки имеют решающее значение для безопасности, производительности кеширования и отладки. Для получения дополнительной информации см .:
Мапник
Mapnik - это набор картографических инструментов с открытым исходным кодом для рендеринга карт на настольных и серверных платформах, написанный на C ++.
- Перенос Mapnik с SCons на Buck сокращает время сборки с 30 минут до 6 минут.
- По нашим оценкам, включение предварительно скомпилированных заголовков сократит время сборки еще на 10%.
- Mapnik не использует скрипты версий и требует
-fvisibility=inline
и общих сборок для предотвращения конфликтов символов. Мы определили, что основная проблема заключается в нестатических определениях в этом заголовочном файле, используя вывод BuildInfer. - Мы сгенерировали график, показывающий взаимодействие отдельных файловых групп и исполняемых файлов:
График сообщает нам следующее:
- Mapnik не использует скрипты версий
- Некоторые объектные файлы имеют расширение
*.os
scons/scons.py
генерирует несколько единиц перевода.
LLVM и Clang
Проект инфраструктуры компилятора LLVM представляет собой «набор модульных и многократно используемых технологий компилятора и инструментальных цепочек», используемых для разработки клиентских и внутренних интерфейсов компилятора.
- По умолчанию LLVM применяет «суперпроектную» структуру, которая заставляет вас оформлять свой проект определенным образом. Используя BuildInfer, LLVM можно преобразовать во множество небольших модулей.
- Аналогичное время прямой сборки, но значительно улучшенные инкрементальные сборки.
- Мы можем кэшировать артефакты LLVM Tablegen - это невозможно с CCache.
- По нашим оценкам, время прямой сборки можно улучшить на 20% с помощью предварительно скомпилированных заголовков. Это намного проще реализовать, используя информацию, извлеченную BuildInfer.
Мы также выполнили простой анализ времени сборки в контексте графа зависимостей. Эти таблицы показывают примерную стоимость изменения различных файлов в LLVM путем суммирования времени, затраченного на создание каждого файла плюс все его зависимости.
Эти файлы являются «горячими точками» для инкрементных сборок и могут быть хорошими кандидатами для рефакторинга.
Обратите внимание, что эти числа предполагают однопоточную сборку; настоящая сборка потребует некоторого масштабного коэффициента этого времени.
Заголовок llvm-config.h
особенно интересен. Он определяет некоторые константы, на которые есть ссылки в проекте:
Таким образом, каждый раз, когда изменяется строка версии или цель по умолчанию, LLVM выполняет сборку (коэффициент масштабирования) 15,264 second
! Эти значения потенциально могут быть преобразованы в единицу перевода:
Мы также создали график, показывающий взаимодействие отдельных файловых групп и исполняемых файлов:
График показывает нам, что:
- скрипты версий генерируются через Bash и называются
*.export
*.td
файлы используютсяtblgen
для создания файлов заголовков*.inc
.- У Clang и LLVM есть свои
tblgen
(чем они отличаются?) - Многие файлы создаются непосредственно CMake.
OpenCV
OpenCV - это библиотека функций программирования, в основном предназначенная для компьютерного зрения в реальном времени.
- OpenCV можно разделить на несколько автономных модулей.
- BuildInfer определил, что один из этих модулей зависит от детали реализации другого модуля, поэтому мы отправили патч.
- Используя Buck, время инкрементной сборки OpenCV можно улучшить, отключив предварительно скомпилированные заголовки после завершения полной сборки.
Мы также создали график, показывающий взаимодействие отдельных файловых групп и исполняемых файлов:
*.cl
файлы используютсяcl2cpp.cmake
для создания*.cpp
файловpkg-config
создаетсяOpenCVGenPkgconfig.cmake
- Используются предварительно скомпилированные заголовки
*.gch
, а точка входа заголовка не создается. - Система сборки OpenCV использует Prolog!
Заинтригованы?
Ваша сборка C ++ работает медленно или неразборчиво? В настоящее время мы ищем дополнительные тематические исследования. Если вы заинтересованы в улучшении вашей сборки на базе Linux (коммерческой или с открытым исходным кодом), пожалуйста, свяжитесь с нами!