Анализируйте, визуализируйте и переходите между сборочными системами

Ваша сборка C ++ работает медленно или неразборчиво? В настоящее время мы ищем дополнительные тематические исследования. Если вы заинтересованы в улучшении вашей сборки на базе Linux (коммерческой или с открытым исходным кодом), пожалуйста, свяжитесь с нами!

Https://buildinfer.loopperfect.com/

Сообщество 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 (коммерческой или с открытым исходным кодом), пожалуйста, свяжитесь с нами!

Вас также может заинтересовать…