Использование CMake из состава KasperskyOS Community Edition

02 августа 2023

ID cmake_using_sdk_cmake

Для автоматизации процесса подготовки образа решения нужно настроить систему сборки CMake. За основу можно взять параметры системы сборки, используемые в примерах из состава KasperskyOS Community Edition.

В файлах CMakeLists.txt используется стандартный синтаксис CMake, а также команды и макросы из библиотек, поставляемых в KasperskyOS Community Edition.

Рекомендованная структура директорий проекта

При создании решения на базе KasperskyOS для упрощения использования скриптов CMake рекомендуется использовать следующую структуру директорий в проекте:

  • В корне проекта создать корневой файл CMakeLists.txt, содержащий общие инструкции сборки для всего решения.
  • Исходный код каждой из разрабатываемых программ следует разместить в отдельной директории, в поддиректории src.
  • Создать файлы CMakeLists.txt для сборки каждой прикладной программы в соответствующих директориях.
  • Для генерации исходного кода программы Einit следует создать отдельную директорию einit, содержащую поддиректорию src, в которую следует поместить шаблоны init.yaml.in и security.psl.in.

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

  • Создать файл CMakeLists.txt для сборки программы Einit в директории einit.
  • Файлы EDL-, CDL- и IDL-описаний следует разместить в директории resources в корне проекта.
  • [Опционально] Создать скрипт сборки cross-build.sh, содержащий команды для запуска генерации файлов сборки (команда cmake), сборки решения (команда make), а также запуска решения.

Пример структуры директорий проекта

example$ tree

.

├── CMakeLists.txt

├── cross-build.sh

├── hello

│ ├── CMakeLists.txt

│ ├── src

│ │ ├── hello.c

├── einit

│ ├── CMakeLists.txt

│ ├── src

│ │ ├── init.yaml.in

│ │ ├── security.psl.in

│ │ ├── fstab

├── resources

│ ├── Hello.idl

│ ├── Hello.cdl

│ ├── Hello.edl

Сборка проекта

Для подготовки к сборке с помощью системы сборки CMake необходимо:

  1. Подготовить корневой файл CMakeLists.txt, содержащий общие инструкции сборки для всего решения.
  2. Подготовить файлы CMakeLists.txt для каждой собираемой прикладной программы.
  3. Подготовить файл CMakeLists.txt для программы Einit.
  4. Подготовить шаблоны init.yaml.in и security.psl.in.

Для выполнения кросс-компиляции с помощью системы автоматизации сборки CMake необходимо:

  1. Создать поддиректорию для сборки.

    BUILD=$PWD/.build

    mkdir -p $BUILD && cd $BUILD

  2. Перед запуском генерации скриптов сборки (команда cmake) установить следующие значения переменных окружения:
    • export LANG=C
    • export PKG_CONFIG=""
    • export SDK_PREFIX="/opt/KasperskyOS-Community-Edition-<version>"
    • export PATH="$SDK_PREFIX/toolchain/bin:$PATH"
    • export INSTALL_PREFIX=$BUILD/../install
    • export TARGET="aarch64-kos"
  3. При запуске генерации скриптов сборки (команда cmake) указать:
    • параметр -G "Unix Makefiles"
    • путь к файлу расширения системы сборки (toolchain.cmake) в переменной CMAKE_TOOLCHAIN_FILE.

      Файл расширения системы сборки расположен в следующей директории: /opt/KasperskyOS-Community-Edition-<version>/toolchain/share/toolchain-aarch64-kos.cmake

    • значение переменной CMAKE_BUILD_TYPE:STRING=Debug
    • значение переменной CMAKE_INSTALL_PREFIX:STRING=$INSTALL_PREFIX
    • путь к корневому файлу CMakeLists.txt
  4. При запуске сборки (команда make) указать одну из целей сборки.

    Имя цели должно совпадать с именем цели сборки, переданным в команду сборки решения в файле CMakeLists.txt для программы Einit.

Пример скрипта сборки cross-build.sh

cross-build.sh

#!/bin/bash

# Создаем поддиректорию для сборки

BUILD=$PWD/.build

mkdir -p $BUILD && cd $BUILD

# Устанавливаем значения переменных окружения

export LANG=C

export PKG_CONFIG=""

export SDK_PREFIX="/opt/KasperskyOS-Community-Edition-<version>"

export PATH="$SDK_PREFIX/toolchain/bin:$PATH"

export INSTALL_PREFIX=$BUILD/../install

export TARGET="aarch64-kos"

# Запускаем генерацию файлов для сборки. Так как текущая директория это $BUILD,

# корневой файл CMakeLists.txt находится в родительской директории

cmake -G "Unix Makefiles" \

-D CMAKE_BUILD_TYPE:STRING=Debug \

-D CMAKE_INSTALL_PREFIX:STRING=$BUILD/../.install \

-D CMAKE_TOOLCHAIN_FILE=$SDK_PREFIX/toolchain/share/toolchain-$TARGET.cmake \

../

# Запускаем сборку. Включаем флаг VERBOSE для make и перенаправляем вывод в файл build.log

VERBOSE=1 make kos-qemu-image 2>&1 | tee build.log

# Запускаем собранный образ решения в QEMU.

# -kernel $BUILD/einit/kos-qemu-image путь к собранному образу ядра

$SDK_PREFIX/toolchain/bin/qemu-system-aarch64 \

-m 1024 \

-cpu core2duo \

-serial stdio \

-kernel $BUILD/einit/kos-qemu-image

В этом разделе

Корневой файл CMakeLists.txt

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

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

Шаблон init.yaml.in

Шаблон security.psl.in

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