Метаданные

Метаданные - это записанная в специальном формате декларативная информация, содержащаяся в исходных текстах, которая используется для описания самих исходных текстов. FX-Manager использует эту информацию для реализации внедрения зависимостей, автоматизации сборки и работы с опциями, однако в метаданных может содержаться любая (в том числе пользовательская) информация, для работы с ней можно использовать подключаемые к FX-Manager модули.

 

Использование метаданных в С/C++

Исторически сложилось так, что поддержки метаданных в указанных языках предусмотрено не было, хотя существуют некроссплатформенные реализации концепции метаданных в различных компиляторах, например записи __attribute__ в компиляторах семейства GCC или __declspec в компиляторах Microsoft. Этот подход, хотя и решает некоторые проблемы, не позволяет программисту пользоваться собственными метаданными, подобные возможности появились только в управляемых языках Java, C# и т.д. Предусмотренный стандартом C/C++ метод расширения синтаксиса с помощью директив #pragma не подходит для записи метаданных по той причине, что неизвестные компилятору директивы вызывают предупреждения компилятора. FX-Manager использует специальный макрос, который содержит метаданные, их извлечение и анализ производятся до компиляции. Во время работы компилятора этот макрос определяется как пустой, поэтому метаданные исключаются препроцессором и не попадают к компилятору, поэтому данный подход является совместимым со всеми инструментами, в то же время, при необходимости, макрос может быть развернут в #pragma, в том случае, если нужно сохранить метаданные в исходных текстах во время компиляции.

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

 

Формат

Для записи метаданных используется широко распространенный формат JSON, текст на котором записывается внутри макроса с именем FX_METADATA. Некоторые записи интерпретируются FX-Manager особым образом, они описаны в разделе документации.

Пример метаданных:

FX_METADATA(({ my_metadata_entry: ["hello", "world"] }))

 

Исходные тексты FX-Manager

Исходные тексты FX-Manager опубликованы под open-source лицензией и доступны для использования как с FX-RTOS так и с любыми другими приложениями.

Скачать исходные тексты можно на странице Eremex на GitHub.

 

Архитектура фреймворка

FX-Manager реализован как модульное приложение, которое помимо основного консольного приложения, содержит также набор классов в сопутствующих DLL, которые реализуют фреймворк для работы с метаданными C. Ядром фреймворка реализуются только функции хранилища метаданных и построения модели (графа зависимостей модулей в системе). Все остальные функции реализуются с помощью отдельных модулей. В состав текущей версии FX-Manager входят модули для вывода списка компилируемых файлов, списка опций данной конфигурации, внедрения аспектов, вывода графа зависимостей в формате GraphViz, а также генерации инициализаторов для данной конфигурации.

 

Внедрение зависимостей

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

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

 

Опции

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