- В опциях cmake добавить переменную
CMAKE_MODULE_PATH
указывающую на каталог репозитория. - В файле
CMakeLists.txt
проекта использовать какinclude(_имя_cmake_модуля_)
.
Подключаемые модули могут ссылаться на все заголовочные файлы и определения всех подключенных модулей и основного проекта.
Зависимость модулей разрешается путем последовательности добавления модулей в CMakeLists.txt
основного проекта
include(modules)
module(moduleName params)
,где
moduleName - наименование модуля (имя собранной библиотеки модуля)
params - параметры аналогичные параметрам функции FetchContent_Declare
(см. документацию на cmake)
modules_ready()
После разрешения модулей определены следующие переменные:
moduleName_SOURCE_DIR
- абсолютный путь к исходным файлам модуля
moduleName_BINARY_DIR
- абсолютный путь к артефактам сборки модуля
MODULES
- перечень всех артефактов подключенных модулей. Эту переменную следует использовать на этапе линковки программы:
target_link_libraries(${PROJECT_NAME} ${MODULES})
Система компонентов это часть системы модулей. Компонент представляет собой часть кода с определенным интерфейсом, функции которого автоматически вызываются основной программой. Каждый модуль может содержать несколько компонентов.
Система компонентов включается путем добавления в проект файлов components.c/h
файл components.h
служит общим заголовочным файлом и должен быть включен в модуле содержащем компонент.
файл components.c
включается в коде основной программы #include "components.c"
и НЕ включается в сборку!
В коде основной программы следует вызвать следуюшие функции для активации компонентов:
- на этапе пре-инициализации
COMPONENTS_FOREACH_CALL(define)
- на этапе инициализации
COMPONENTS_FOREACH_CALL(init)
- на этапе работы (периодически)
COMPONENTS_FOREACH_CALL(run)
Для реализации компонента необходимо:
- создать файл
component.h
в котором необходимо включить заголовойный файл#include "components.h"
и объявить экземпляр компонентаextern component_t _cmp_one;
с уникальным именем в рамках всего проекта - Реализовать указанный экземпляр
- В файле
CMakeLists.txt
модуля определить на вышестоящем уровне переменнуюCOMPONENTS
с перечнем указателей на экземпляры компонентов (через запятую если их больше одного)set(COMPONENTS "&_cmp_one" PARENT_SCOPE)