Для автоматизации процесса подготовки образа решения нужно настроить систему сборки CMake
. За основу можно взять параметры системы сборки, используемые в примерах из состава KasperskyOS Community Edition.
В файлах CMakeLists.txt
используется стандартный синтаксис CMake
, а также команды и макросы из библиотек, поставляемых в KasperskyOS Community Edition.
Рекомендованная структура директорий проекта
При создании решения на базе KasperskyOS для упрощения использования скриптов CMake
рекомендуется использовать следующую структуру директорий в проекте:
src
.Einit
следует создать отдельную директорию einit
, содержащую поддиректорию src
, в которую следует поместить шаблоны init.yaml.in и security.psl.in.Также в эту директорию можно поместить любые другие файлы, которые необходимо включить в образ решения.
Einit
в директории einit
.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
необходимо:
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
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