Файлы CMakeLists.txt для сборки прикладных программ

12 января 2026

ID cmake_lists_applied

Файл CMakeLists.txt для сборки прикладной программы должен содержать следующие команды:

  • EDL-описание класса процессов для программы можно сгенерировать, используя команду generate_edl_file().
  • Если программа предоставляет службы, используя механизм IPC, необходимо сгенерировать транспортный код:
    1. idl.h-файлы генерируются командой nk_build_idl_files()
    2. cdl.h-файлы генерируются командой nk_build_cdl_files()
    3. edl.h-файлы генерируются командой nk_build_edl_files()
  • 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})

Вам помогла эта статья?
Что нам нужно улучшить?
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!