Система сборки Mybuild

Mybuild - это система автоматизации сборки и конфигурирования для модульных приложений.

Mybuild реализован поверх GNU Make, тем самым поддерживая все возможности инкрементальной и параллельной сборки последнего. Кроме того, это позволяет встроить Mybuild в уже существующую инфраструктуру сборки, использующую Make. В то же время, несмотря на использование Make, Mybuild использует собственный синтаксис, лишенный недостатков языка Makefile'ов.

Процесс разработки

Типичный сценарий разработки проекта, использующего Mybuild, включает две группы людей:

Разработчики Пользователи
которые поддерживают файлы для сборки разрабатываемых ими компонентов. которым требуется просто собрать проект (возможно, в различных конфигурациях).

В действительности, есть еще разработчики самого Mybuild, но их мы пока что не рассматриваем. Таким образом, существует два типа файлов для сборки: My-файлы и Config-файлы

My-файлы

My-файлы используются для описания всех модулей приложения, доступных для сборки, их отношения между собой, а также параметры конфигурации. Эти файлы пишутся разработчиками самого приложения и обычно располагаются в дереве файлов с исходным кодом.

module HelloWorld {
   source "hello.c"
}

My-файлы именуются Mybuild либо *.my.

Config-файлы

Config-файлы содержат указания для сборки определенных модулей и конкретные значения параметров конфигурации. Предполагается, что данные файлы составляются пользователями, тем не менее, разработчики могут предоставить шаблоны для типичных конфигураций.

configuration Main {
    include HelloWorld
}

Конфигурационные файлы имеют расширение .config.

Оба типа файлов являются обычными текстовыми файлами (не XML!), которые можно редактировать в любом текстовом редакторе.

После того как необходимые my- и config-файлы готовы, проект можно собрать командой make. На основе предоставленных сборочных файлов Mybuild решит, что именно и в каком порядке необходимо собрать.

В заключение, процесс сборки можно представить следующим образом:

Mybuild процесс сборки

Процесс сборки с помощью системы Mybuild можно представить следующим образом:

Подготовка скриптов

Mybuild написана на расширении языка Make, поэтому, сначала требуется преобразовать код написанный на расширении языка Make в классические Make-файлы. Для ускорения этой процедуры используется кэширование: преобразуются только измененные с предыдущего запуска файлы.

На этом этапе происходит проверка актуальности кэша исходных файлов Mybuild и библиотеки расширения. Если файл с исходным кодом не изменялся, используется его закэшированная версия. Иначе файл загружается, преобразуется и кэшируется с помощью скрипта.

Создание графа описания модулей

Обработка Mybuild файлов (файлов описание модулей) разбивается на фазы:

  • Нахождение Myfile в дереве с исходным кодом.
  • Для каждого файла:
    • Чтение файла.
    • Синтаксический разбор, создание объекта (mk/mybuild/myfile-model.mk) на каждую разобранную синтаксическую конструкцию.
    • Сохранение полученной после разбора модели файла для использования последующими стадиями (путь по умолчанию: mk/.cache/mybuild/files/).
  • Создание набора моделей, представляющего полное описание графа модулей, разрешение ссылок между моделями в наборе.
  • Проведение различных проверок, относящихся к графу модулей (соответствие типов опций и инициализирующих их значений, циклическое наследование, и т.д)
  • Кэширование полученного набора моделей.

Создание модели системы

Для описания модели системы так же используется специализированный язык описания. Поэтому, для обработки файлов конфигурации проводятся фазы, аналогичные фазам 1-5 обработки файлов описания модулей. Затем, происходит создание Build-модели (mk/mybuild/build-model.mk), в нее входит модули, их файлы, опции модулей, опции компиляции. Для этого используются модели конфигурации и Mybuild.

Генерация необходимых ресурсов

На этом этапе проводится сборка полученной на предыдущем этапе Build-модели.

  • Генерируется исходник на языке Си, содержащий run-time представление Build-модели.
  • Для модулей генерируются заголовочные файлы с опциями и экспортированными из модуля заголовочными файлами.
  • Для файлов с исходным кодом генерируются командные файлы, содержащие параметры командной строки компилятора.
  • Генерируется Make-правила для сборки целевого образа и промежуточных объектных файлов.

Запуск скриптов на исполнение

На этой стадии сборки происходит передача управления от Mybuild к сгенерированному им скриптам сборки Make. Результатом выполнения данного этапа является полностью собранный образ целевой системы.

Mybuild - внутренняя структура

Система сборки целиком написана на языке GNU Make и состоит из набора скриптов. Следует различать три основных типа Makefile’ов, используемых для реализации:

  • Классические Makefile’ы, в которых задаются правила для выполнения тех или иных целей, их зависимости и т.д. В основном к ним относятся скрипты верхнего уровня, определяющие последовательность запуска остальных скриптов.
  • Библиотеки функций, в которых определяются функции и классы. Большая часть логики Mybuild реализована именно в таких скриптах. Основная часть кода (за исключением сравнительно небольшого блока раскрутки), написана с использованием расширенного синтаксиса языка Make.
  • Скрипты, результатом выполнения которых является текстовый файл.

Классические Makefile’ы

Для выполнения любой внешней цели (которую вызывает пользователь) сперва читается корневой Makefile. Его можно рассматривать как обертку для запуска самой системы сборки. В этом скрипте происходит проверка версии Make и необходимых флагов, задаются значения по умолчанию для директорий сборки и т.д. Далее управление передается в mk/main.mk. mk/main.mk

Этот скрипт - фасад системы. В нем определяются все доступные для выполнения цели, а также документация для этих целей, которую можно увидеть, выполнив “make help” или “make help-'<'goal'>'”. Можно различать два вида целей: Цели, которые можно выполнить “на месте” (загрузка конфигурации, clean, вывод справки по целям и т.п.). Цели, для выполнения которых требуется чтение всех my-файлов и построения модели сборки (собственно, сборка проекта). В этом случае управление передается специальному загрузочному скрипту mk/load.mk mk/load.mk

Скрипт используется для раскрутки остальных скриптов системы сборки, загрузки my-файлов и создания модели сборки. Разделен на два файла:

  • load-mk.inc.mk, который занимается раскруткой скриптов (библиотеки функций),
  • load-mybuild.inc.mk, который вызывает скрипты для разбора my-файлов, их линковки, сериализации и построения модели сборки.