Система сборки 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-файлов, их линковки, сериализации и построения модели сборки.