${habrauser}, Привет!

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

На Хабре я уже писал о решении проблемы кросс-компиляции шейдеров в данном фреймворке — ShaderPack. Ну а сегодняшняя наша тема будет именно о сборке проектов с помощью Oriol Engine и о том, что в этот момент происходит на его стороне.

Почему же мы не оставили процесс сборки на пользователя? Мол, у тебя есть игровой проект на Oriol, настрой самостоятельно какой-нибудь там CMake и продолжай работу дальше. Да, интегрировать инородную систему сборки можно и сейчас, но согласитесь, что намного приятнее, когда этот процесс автоматизирован. И всё, что от тебя требуется, — это ввести всего лишь одну команду для сборки.

Создание проекта

Для того чтобы начать разбор устройства системы сборки Oriol, нам нужно понять, как выглядит то, что мы, собственно говоря, хотим собрать.

1. Сперва вводим команду для создания базовой структуры проекта:

ol -c Test

2. Выбираем один из предложенных шаблонов лицензии (MIT, Apache, GPL):

Выбор шаблона лицензии при создании проекта в Oriol
Выбор шаблона лицензии при создании проекта в Oriol

После выполнения сея махинаций мы успешно создаём базовую структуру Oriol проекта:

Структура Oriol проекта
Структура Oriol проекта

Всё вроде бы понятно, но что же за такой интересный файлик Oriol.ol?

Вот тут давайте поподробнее:

Файл Oriol.ol является конфигурационным файлом для фреймворка. Он содержит название, описание, версии, пути к главным папкам. Его содержимое выглядит примерно так:

@Info
{
    name: Test
    description: "Game on Oriol Engine"
    version: 1.0.0
    engine_v: 0.0.1
}

@Paths
{
    assets: "Assets"
    build: "Build"
    sources: "Sources"
}

Что за странный синтаксис? Нет, это не JSON, это специальный формат хранения данных FPL (Fast Parsing Language). Он лёгок для разбора и имеет всё необходимое для фреймворка Oriol. Можно было взять JSON, но желание организовать содержимое конфига как можно красивее преобладало )

Немного про FPL

Данный формат довольно прост как для чтения, так и для разбора. Он многое заимствует у JSON, но также имеет и уникальные моменты.

Секции:

Основа любого FPL-кода — это секции, некие блоки со своим именем, содержащие пары "ключ-значение" и вложенные подсекции. Секция объявляется с помощью символа "@".

@имя_секции 
{  
    ключ: значение  
    вложенная: @подсекция { ... }  
}  

Типы данных:

FPL поддерживает такие типы данных как:

  • Строки: "текст" или 'текст'

  • Числа: 123, 3.14, -5

  • Булевы значения: true, false

  • Массивы: [значение1, значение2]

  • Null: null

Комментарии:

Последнее, что можно отметить, - это комментарии. Здесь они обозначаются с помощью символа "#".

# Это комментарий  
@server 
{  
    port: 8080  # Порт сервера  
}  

Сборка проекта

Итак, а теперь про процесс сборки C++ проекта с помощью Oriol Engine. После команды:

ol -b

Фреймворк начинает искать конфигурационный файл Oriol.ol, составляет список всех исходников проекта из папки и её подпапок, которая находится в значении ключа Sources секции Paths (в ближайшем будущем в планах добавить что-то типа .gitignore для конфигурационного файла, чтобы он не использовал конкретные файлы), подключает Oriol API, генерирует Makefile проекта с помощью компонента MakeFusion и вызывает GCC для сборки. В принципе, ничего сложного. Вот схема:

Схема сборки проекта
Схема сборки проекта

Однако, большую сложность предоставлял именно обдумывание самой концепции сборки, а не её реализации.

Конец

Да, на этом, в принципе, всё. Если у вас есть какие-нибудь вопросы, то смело задавайте их, а если есть желание как-то поддержать проект, то можете поставить звёздочку на GitHub)

P.S.: Компонент BuildSys на сегодняшний день требует небольшой доработки, поэтому у вас может сразу и не заработать.

Оставлю ссылку на систему сборки Oriol здесь:

https://github.com/Anagar-Games/Oriol_Engine/tree/main/Oriol/Oriol_Dev/BuildSys

Спасибо за прочтение )