Файлы CMakeLists.txt для сборки прикладных программ
Файл CMakeLists.txt для сборки прикладной программы должен содержать следующие команды:
- EDL-описание класса процессов для программы можно сгенерировать, используя команду
generate_edl_file(). - Если программа предоставляет службы, используя механизм IPC, необходимо сгенерировать транспортный код:
- idl.h-файлы генерируются командой
nk_build_idl_files() - cdl.h-файлы генерируются командой
nk_build_cdl_files() - edl.h-файлы генерируются командой
nk_build_edl_files()
- idl.h-файлы генерируются командой
add_executable (<имя программы> "<путь к файлу исходного кода программы>")– добавление цели для сборки программы.add_dependencies (<имя программы> <имя цели сборки edl.h файла>) – добавление зависимости сборки программы от генерации edl.h-файла.target_link_libraries (<имя программы> <список библиотек>)– определяет библиотеки, с которыми необходимо скомпоновать программу при сборке.Например, если программа использует файловый или сетевой ввод/вывод, то она должна быть скомпонована с транспортной библиотекой
vfs::client.CMake-описания системных программ и драйверов, поставляемых в составе KasperskyOS Community Edition, а также их экспортированных переменных и свойств находятся в соответствующих файлах/opt/KasperskyOS-Community-Edition-<platform>-<version>/sysroot-*-kos/lib/cmake/<имя программы>/<имя программы>Config.cmake- Для автоматического добавления описаний IPC-каналов в файл
init.yamlпри сборке решения необходимо определить свойствоEXTRA_CONNECTIONSи присвоить ему значение с описаниями нужных IPC-каналов.Обратите внимание на отступы в начале строк в свойстве
EXTRA_CONNECTIONS. Эти отступы необходимы для корректной подстановки значений в файлinit.yamlи должны соответствовать требованиям к его синтаксису.Пример создания IPC-канала между процессами
ClientиServer:set_target_properties (Client PROPERTIES
EXTRA_CONNECTIONS
" - target: Server
id: server_connection")
В результате, при сборке решения, описание этого IPC-канала будет автоматически добавлено в файл
init.yamlна этапе обработки макросов шаблона init.yaml.in. - Для автоматического добавления списка аргументов функции
main()и словаря переменных окружения в файлinit.yamlпри сборке решения необходимо определить свойстваEXTRA_ARGSиEXTRA_ENVи присвоить им соответствующие значения.Обратите внимание на отступы в начале строк в свойствах
EXTRA_ARGSиEXTRA_ENV. Эти отступы необходимы для корректной подстановки значений в файлinit.yamlи должны соответствовать требованиям к его синтаксису.Пример передачи программе
Clientаргумента"-v"функцииmain()и переменной окруженияVAR1со значениемVALUE1:set_target_properties (Client PROPERTIES
EXTRA_ARGS
" - \"-v\""
EXTRA_ENV
" VAR1: VALUE1")
- Если предполагается, что программа не должна автоматически запускаться с помощью программы
Einit, а запуск требуется выполнять динамически, например, с помощью компонента ExecutionManager, то необходимо определить свойствоNOT_STATIC_ENTITYи присвоить ему соответствующее логическое значение.Пример отключения автоматического запуска программы
Client:set_target_properties(Client PROPERTIES NOT_STATIC_ENTITY YES)
В результате, при сборке решения, IPC-каналы не будут автоматически добавлены в файл
init.yamlи автоматический запуск программы не будет выполнен.
Пример файла CMakeLists.txt для сборки простой прикладной программы
CMakeLists.txt
# Задаем имя проекта, в который входит программа.
set (LOCAL_MODULE_NAME "example")
# Задаем имя программы.
set (TASK_NAME "Hello")
# Обратите внимание на содержание шаблонов init.yaml.in и security.psl.in
# В них имена программ задаются как ${LOCAL_MODULE_NAME}.${TASK_NAME}
# Задаем цели, которые будут использованы для создания генерируемых файлов программы.
set (TASK_IDL_TARGET ${TASK_NAME}_idl)
set (TASK_CDL_TARGET ${TASK_NAME}_cdl)
set (TASK_EDL_TARGET ${TASK_NAME}_edl)
# Добавляем цель сборки idl.h-файла.
nk_build_idl_files (${TASK_IDL_TARGET}
NK_MODULE ${LOCAL_MODULE_NAME}
IDL "../resources/Hello.idl"
)
# Добавляем цель сборки cdl.h-файла.
nk_build_cdl_files (${TASK_CDL_TARGET}
IDL_TARGET ${TASK_IDL_TARGET}
NK_MODULE ${LOCAL_MODULE_NAME}
CDL "../resources/Hello.cdl"
)
# Добавляем цель сборки EDL-файла. Переменная EDL_FILE экспортируется
# и содержит путь до сгенерированного EDL-файла.
generate_edl_file (${TASK_NAME}
PREFIX ${LOCAL_MODULE_NAME}
)
# Добавляем цель сборки edl.h-файла.
nk_build_edl_files (${TASK_EDL_TARGET}
NK_MODULE ${LOCAL_MODULE_NAME}
EDL ${EDL_FILE}
)
# Определяем цель для сборки программы.
add_executable (${TASK_NAME} "src/hello.c")
# Библиотеки, с которыми программа компонуется при сборке.
target_link_libraries (${TASK_NAME}
PUBLIC vfs::client # Программа использует файловый ввод/вывод
# и должна быть подключена как клиент к VFS
)
# Добавление к цели Hello зависимости от цели Hello_edl.
# Генерация edl.h-файла должна произойти ранее сборки цели Hello.
add_dependencies (${TASK_NAME} ${TASK_EDL_TARGET})