Содержание
Использование CMake из состава KasperskyOS Community Edition
Для автоматизации процесса подготовки образа решения нужно настроить систему сборки CMake
. За основу можно взять параметры системы сборки, используемые в примерах из состава KasperskyOS Community Edition.
В файлах CMakeLists.txt
используется стандартный синтаксис CMake
, а также команды и макросы из библиотек, поставляемых в KasperskyOS Community Edition.
Рекомендованная структура директорий проекта
При создании решения на базе KasperskyOS рекомендуется использовать следующую структуру директорий в проекте:
- В корне проекта создать корневой файл CMakeLists.txt, содержащий общие инструкции сборки для всего решения.
- Исходный код каждой из разрабатываемых программ следует разместить в отдельной директории, в поддиректории
src
. - Создать файлы CMakeLists.txt для сборки каждой прикладной программы в соответствующих директориях.
- Для генерации исходного кода программы
Einit
следует создать отдельную директориюeinit
, содержащую поддиректориюsrc
, в которую следует поместить шаблоны init.yaml.in и security.psl.in.Также в эту директорию можно поместить любые другие файлы, которые необходимо включить в образ решения.
- Создать файл CMakeLists.txt для сборки программы
Einit
в директорииeinit
. - Файлы EDL-, CDL- и IDL-описаний следует разместить в директории
resources
в корне проекта.
Пример структуры директорий проекта
Сборка образа решения
Чтобы выполнить сборку образа решения, нужно использовать утилиту cmake
(исполняемый файл toolchain/bin/cmake
из состава KasperskyOS Community Edition).
Пример скрипта сборки:
build.sh
Корневой файл CMakeLists.txt
Корневой файл CMakeLists.txt
содержит общие инструкции сборки для всего решения.
Корневой файл CMakeLists.txt
должен содержать следующие команды:
cmake_minimum_required (VERSION 3.25)
– указание минимальной поддерживаемой версииCMake
.Для сборки решения на базе KasperskyOS требуется
CMake
версии не ниже 3.25.Требуемая версия
CMake
поставляется в составе KasperskyOS Community Edition и используется по умолчанию.include (platform)
– подключениеCMake
-библиотекиplatform
.initialize_platform()
– инициализация библиотекиplatform
.project_header_default("STANDARD_GNU_11:YES" "STRICT_WARNINGS:NO"
) – установка флагов компилятора и компоновщика.- [Опционально] Подключение и настройка пакетов для поставляемых системных программ и драйверов, которые необходимо включить в решение:
- Подключение пакета выполняется с помощью команды
find_package()
. - После подключения пакета необходимо добавить директории, связанные с этим пакетом, в список директорий поиска с помощью команды
include_directories()
. - Для некоторых пакетов также требуется установить значения свойств с помощью команды
set_target_properties()
.
CMake
-описания системных программ и драйверов, поставляемых в составе KasperskyOS Community Edition, а также их экспортируемых переменных и свойств находятся в соответствующих файлах/opt/KasperskyOS-Community-Edition-<version>/sysroot-aarch64-kos/lib/cmake/<имя программы>/<имя программы>-config.cmake
- Подключение пакета выполняется с помощью команды
- Сборка инициализирующей программы
Einit
должна быть выполнена с помощью командыadd_subdirectory(einit)
. - Все прикладные программы, сборку которых необходимо выполнить, должны быть добавлены с помощью команды
add_subdirectory(<имя директории программы>)
.
Пример корневого файла CMakeLists.txt
CMakeLists.txt
Файлы CMakeLists.txt для сборки прикладных программ
Файл CMakeLists.txt
для сборки прикладной программы должен содержать следующие команды:
include (platform/nk)
– подключение библиотекиCMake
для работы с компилятором NK.project_header_default ("STANDARD_GNU_11:YES" "STRICT_WARNINGS:NO"
) – установка флагов компилятора и компоновщика.- 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_LIB}
.CMake
-описания системных программ и драйверов, поставляемых в составе KasperskyOS Community Edition, а также их экспортированных переменных и свойств находятся в соответствующих файлах/opt/KasperskyOS-Community-Edition-<version>/sysroot-aarch64-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")В результате, при сборке решения, описание аргумента функции
main()
и значение переменной окружения будут автоматически добавлены в файлinit.yaml
на этапе обработки макросов шаблона init.yaml.in.
Пример файла CMakeLists.txt для сборки простой прикладной программы
CMakeLists.txt
Файл CMakeLists.txt для сборки программы Einit
Файл CMakeLists.txt
для сборки инициализирующей программы Einit
должен содержать следующие команды:
include (platform/image)
– подключение библиотекиCMake
, содержащей скрипты сборки образа решения.project_header_default ("STANDARD_GNU_11:YES" "STRICT_WARNINGS:NO"
) – установка флагов компилятора и компоновщика.- Настройка пакетов системных программ и драйверов, которые необходимо включить в решение.
- Подключение пакета выполняется с помощью команды
find_package ()
. - Для некоторых пакетов также требуется установить значения свойств с помощью команды
set_target_properties ()
.
CMake
-описания системных программ и драйверов, поставляемых в составе KasperskyOS Community Edition, а также их экспортированных переменных и свойств находятся в соответствующих файлах/opt/KasperskyOS-Community-Edition-<version>/sysroot-aarch64-kos/lib/cmake/<имя программы>/<имя программы>-config.cmake
- Подключение пакета выполняется с помощью команды
- Для автоматического добавления описаний IPC-каналов между процессами системных программ в файл
init.yaml
при сборке решения необходимо добавить эти каналы в свойствоEXTRA_CONNECTIONS
для соответствующих программ.Обратите внимание на отступы в начале строк в свойстве
EXTRA_CONNECTIONS
. Эти отступы необходимы для корректной подстановки значений в файлinit.yaml
и должны соответствовать требованиям к его синтаксису.Например, программа
VFS
по умолчанию не имеет канала для соединения с программойEnv
. Чтобы описание такого канала автоматически добавилось в файл init.yaml при сборке решения, необходимо добавить следующий вызов в файлCMakeLists.txt
для сборки программыEinit
:set_target_properties (${vfs_ENTITY} PROPERTIES EXTRA_CONNECTIONS " - target: env.Env id: {var: ENV_SERVICE_NAME, include: env/env.h}"В результате, при сборке решения, описание этого IPC-канала будет автоматически добавлено в файл
init.yaml
на этапе обработки макросов шаблона init.yaml.in. - Для автоматического добавления списка аргументов функции
main()
и словаря переменных окружения в файлinit.yaml
при сборке решения, необходимо определить свойстваEXTRA_ARGS
иEXTRA_ENV
и присвоить им соответствующие значения.Обратите внимание на отступы в начале строк в свойствах
EXTRA_ARGS
иEXTRA_ENV
. Эти отступы необходимы для корректной подстановки значений в файлinit.yaml
и должны соответствовать требованиям к его синтаксису.
Пример передачи программе VfsEntity
аргумента "-f fstab"
функции main()
и переменной окружения ROOTFS
со значением ramdisk0,0 / ext2 0
:
В результате, при сборке решения, описание аргумента функции main()
и значение переменной окружения будут автоматически добавлены в файл init.yaml
на этапе обработки макросов шаблона init.yaml.in.
set(ENTITIES <полный список программ, входящих в решение>)
– определение переменнойENTITIES
со списком исполняемых файлов всех программ, входящих в решение.- Одна или обе команды для сборки образа решения:
- build_kos_hw_image() – создает цель сборки образа решения для аппаратной платформы.
- build_kos_qemu_image() – создает цель сборки образа решения для QEMU.
Пример файла CMakeLists.txt для сборки программы Einit
CMakeLitsts.txt
Шаблон init.yaml.in
Шаблон init.yaml.in
используется для автоматической генерации части файла init.yaml
перед сборкой программы Einit
средствами CMake
.
Использование шаблона init.yaml.in
позволяет не добавлять описания системных программ и IPC-каналов для соединения с ними в файл init.yaml
вручную.
Шаблон init.yaml.in
должен содержать следующие данные:
- Корневой ключ
entities
. - Список всех прикладных программ, входящих в решение.
- Для прикладных программ, использующих механизм IPC, необходимо указать список IPC-каналов, соединяющих эту программу с другими программами.
IPC-каналы, соединяющие эту программу с другими прикладными программами указываются вручную или в файле CMakeLists.txt этой программы с помощью свойства
EXTRA_CONNECTIONS
.Для указания списка IPC-каналов, соединяющих эту программу с системными программами, входящими в состав KasperskyOS Community Edition, используются следующие макросы:
@INIT_<имя программы>_ENTITY_CONNECTIONS@
– при сборке заменяется на список IPC-каналов со всеми системными программами, с которыми скомпонована прикладная программа. Поляtarget
иid
заполняются в соответствии с файламиconnect.yaml
из состава KasperskyOS Community Edition, расположенными в/opt/KasperskyOS-Community-Edition-<version>/sysroot-aarch64-kos/include/<имя системной программы>
).Этот макрос нужно использовать, если прикладная программа не имеет соединений с другими прикладными программами и соединяется только с системными программами. Этот макрос добавляет корневой ключ
connections
.@INIT_<имя программы>_ENTITY_CONNECTIONS+@
– при сборке добавляет список IPC-каналов со всеми системными программами, с которыми скомпонована прикладная программа, к списку IPC-каналов, заданному вручную. Этот макрос не добавляет корневой ключconnections
.Этот макрос нужно использовать, если прикладная программа имеет соединения с другими прикладными программами, которые были указаны в шаблоне
init.yaml.in
вручную.
- Макросы
@INIT_<имя программы>_ENTITY_CONNECTIONS@
и@INIT_<имя программы>_ENTITY_CONNECTIONS+@
также добавляют список соединений для каждой программы, заданный в свойствеEXTRA_CONNECTIONS
при сборке этой программы. - Если необходимо передать программе аргументы функции
main()
, заданные в свойствеEXTRA_ARGS
при сборке этой программы, то необходимо использовать следующие макросы:@INIT_<имя программы>_ENTITY_ARGS@
– при сборке заменяется на список аргументов функцииmain()
, заданный в свойствеEXTRA_ARGS
. Этот макрос добавляет корневой ключargs
.@INIT_<имя программы>_ENTITY_ARGS+@
– при сборке добавляет список аргументов функцииmain()
, заданный в свойствеEXTRA_ARGS
, к списку аргументов заданному вручную. Этот макрос не добавляет корневой ключargs
.
- Если необходимо передать программе значения переменных окружения, заданные в свойстве
EXTRA_ENV
при сборке этой программы, то необходимо использовать следующие макросы:@INIT_<имя программы>_ENTITY_ENV@
– при сборке заменяется на словарь переменных окружения и их значений, заданный в свойствеEXTRA_ENV
. Этот макрос добавляет корневой ключenv
.@INIT_<имя программы>_ENTITY_ENV+@
– при сборке добавляет словарь переменных окружения и их значений, заданный в свойствеEXTRA_ENV
, к переменным заданным вручную. Этот макрос не добавляет корневой ключenv
.
- Макрос
@INIT_EXTERNAL_ENTITIES@
, который при сборке заменяется на список системных программ, с которыми скомпонована прикладная программа, и их IPC-каналов, аргументов функцииmain()
и значений переменных окружения.
Пример шаблона init.yaml.in
init.yaml.in
При сборке программы Einit
из этого шаблона будет сгенерирован следующий файл init.yaml:
init.yaml
Шаблон security.psl.in
Шаблон security.psl.in
используется для автоматической генерации части файла security.psl
перед сборкой программы Einit
средствами CMake
.
Файл security.psl
содержит часть описания политики безопасности решения.
Использование шаблона security.psl.in
позволяет не добавлять EDL-описания системных программ в файл security.psl
вручную.
Шаблон security.psl.in
должен содержать описание политики безопасности решения, созданное вручную, включая следующие декларации:
- установка глобальных параметров политики безопасности решения;
- включение PSL-файлов в описание политики безопасности решения;
- включение EDL-файлов прикладных программ в описание политики безопасности решения;
- создание объектов моделей безопасности;
- привязка методов моделей безопасности к событиям безопасности;
- создание профилей аудита безопасности.
Для автоматического включения системных программ, необходимо использовать макрос @INIT_EXTERNAL_ENTITIES@
.
Пример шаблона security.psl.in
security.psl.in