Использование CMake из состава KasperskyOS Community Edition
Для автоматизации процесса подготовки образа решения нужно настроить систему сборки 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
необходимо:
- Подготовить корневой файл CMakeLists.txt, содержащий общие инструкции сборки для всего решения.
- Подготовить файлы CMakeLists.txt для каждой собираемой прикладной программы.
- Подготовить файл CMakeLists.txt для программы Einit.
- Подготовить шаблоны
init.yaml.in
иsecurity.psl.in
.
Для выполнения кросс-компиляции с помощью системы автоматизации сборки CMake
необходимо:
- Создать поддиректорию для сборки.
BUILD=$PWD/.build
mkdir -p $BUILD && cd $BUILD
- Перед запуском генерации скриптов сборки (команда
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"
- При запуске генерации скриптов сборки (команда
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
- параметр
- При запуске сборки (команда
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