Сборка
Описание конфигурации проекта
Описание конфигурация представляет собой детальное задание требований к функциональности системы. Подробнее смотри раздел "Модульная структура Embox". Текущая конфигурация содержится в файлах расположенных папке 'conf/'.
Выбор конфигурации
Для задания желаемых свойств целевой системы необходимо создать описание в папке 'conf/'. Если существует описание конфигурации с близкими свойствами проще воспользоваться ими. И на основе уже существующей конфигурации создать свою.
Посмотреть существующие конфигурации можно с помощью команды:
$ make confload
затем можно сделать выбранную конфигурацию рабочей с помощью команды:
$ make confload-<template>
Пример:
$ make confload
List of available templates:
...
platform/quake3/qemu
...
Use 'make confload-<template>' to load one.
$ make confload-platform/quake3/qemu
в нем выбирается имеющаяся в списке конфигурация platform/quake3/qemu
Сборка из имеющейся конфигурации
Для сборки образа из имеющейся конфигурации необходимо сделать рабочей выбранную конфигурацию, как описано в предыдущем примере. А затем выполнить команду
$ make
для сборки образа. В случае успешного завершения появится надпись "Build complete", а также файл образа в формате ELF 'build/base/bin/embox'.
Например:
text data bss dec hex filename
1259425 248540 170593504 172101469 a420f5d build/base/bin/embox
Build complete
Изменение характеристик системы
После выбора конфигурации ее требуется изменить. Текущая (рабочая) конфигурация находиться в папке conf/. Изменения файлов в этой папке изменяют характеристики конечной системы до желаемых. Важно: если сделать make confload-, удалить папку или сделать очистку проекта, которая затронет текущую конфигурацию (например, make distclean), текущие изменения потеряются.
Изменение функциональности системы
Изменение списка модулей
Функциональность системы описывается в файле mods.conf. Для изменения нужно изменить данный файл. Например, для включения дополнительной команды в список нужно добавить строчку
include <PACKAGE_NAME>.<MODULE_NAME>
Например
include embox.cmds.help
то же самое для обычных модулей.
Изменение параметров модулей
Для изменения параметров модуля нужно указать в скобках имя опции и желаемое значение. Например, для установки размера стека потока нужно изменить (или установить) параметр thread_stack_size в модуле embox.kernel.thread.core:
include embox.kernel.thread.core(thread_stack_size=0x4000)
Порядок загрузки
В конфигурации можно также повлиять на порядок загрузки модулей системы, для этого используется аттрибут @Runlevel(level) например @Runlevel(2), но обычно этого не требуется, поскольку при загрузке модулей учитываются их зависимости, и если требуется подгрузить модуль для работы данного модуля, то он подгрузится по зависимостям.
Изменение реализации интерфейса
Для изменения реализации интерфейса или абстрактного модуля, что это такое см. раздел "Модульная структура Embox", нужно просто подключить другой модуль реализующий данный интерфейс.
Например, абстрактный модуль heap_api
@DefaultImpl(heap_bm)
abstract module heap_api {
...
}
Для подключения модуля heap_simple который также реализует данный интерфейс
module heap_simple extends heap_api {module heap_simple extends heap_api {
...
}
необходимо удалить (если есть) модуль heap_bm то есть следующую строчку
include embox.mem.heap_bm
и все остальные модули которые наследуют данный абстрактный модуль и добавить
include embox.mem.heap_simple
Изменение флагов компиляции (отладка, оптимизации)
Некоторыми флагами компиляции можно управлять. Флаги компиляции задаются в файле build.conf текущей конфигурации. Например, флаг, который часто требует изменения, флаг оптимизации:
CFLAGS += -O0
данную строчку нужно заменить на
CFLAGS += -O2
для сборки с оптимизацией O2.
Также важным флагом является флаг -g линкера, который добавляет секцию с отладочной информацией в образ системы:
LDFLAGS += -N -g
его также можно удалить для уменьшения размера, но тогда отладка будет не доступна.
Очистка проекта
Сборка Embox происходит в несколько этапов. Можно выделить следующие большие этапы:
- Задание текущей конфигурации
- Создание графа модулей и генерация на их основе артефактов для сборки
- Сборка
Поэтому очистка тоже может "очищать" (приводить в состояние) проект до разных стадий сборки. Для этого используются три цели make:
- make distclean
- make cacheclean
- make clean
Цель clean просто удаляет папку build c собранными объектными и бинарными файлами. Для большинства случаем этого достаточно.
Цель cacheclean полностью выполняет цель clean (то есть удаляет папку build), но кроме этого удаляет папку mk/.cache
, в которой содержатся артефакты от разбора mybuild файлов (файлов описания модулей).
Цель distclean полностью приводит проект в первоначальное состояние. То есть удаляет рабочую конфигурацию, чистит все сгенерированные и скомпилированные файлы.
Полезные команды
Справка по командам сборки
Больше информации о возможностях командной строки при сборке можно получить с помощью make цели help:
$ make help
есть различные подразделы цели, например с помощью:
$ make help-mod
выводится справка по управлению модулями в текущей конфигурации
Usage: make mod-<INFO>
Print <INFO> info about modules:
list: list all modules included in build
brief-<module_name>: show brief informataion about module: dependencies, options,
source files
include-reason-<module_name>: show dependence subtree desribing why <module_name>
was included in build
Получение дизассемблера текущего образа
Файл с дизассебмлером можно получить с помощью команды:
$ make disasm
Получение графа модулей
Граф модулей в формате png:
$ make dot
появиться файл build/doc/embox.png.
Вам потребуется установить пакет graphviz
$ sudo apt install graphviz
Получение документации из комментариев в doxygen формате
Для генерации документации по API из комментариев в doxygen формате можно воспользоваться командой
$ make docsgen
появиться папка build/docs/html в которой в формате html находится сгенеренная документация
Вам потребуется пакет doxygen
$ sudo apt install doxygen
Управление модулями
Для получения списка всех модулей которые включены в текущую конфигурацию нужно выполнить команду:
$ make mod-list
Можно получить более подробную информацию по каждому модулю, например, список модулей включает embox.net.route
...
embox.net.route
...
получить по нему информацию можно с помощью команды
$ make mod-brief-embox.net.route
в результате появится информация о модуле
--- embox.net.route ---
Inclusion reason: as dependence
Depends:
embox.net.core
embox.mem.pool_ndebug
embox.util.DListDebug
Dependents:
embox.cmd.net.ping
embox.cmd.net.route
embox.net.af_inet
embox.net.ipv4
embox.net.tcp_sock
OptInsts:
route_table_size : 8
Sources:
src/net/l3/route.c
в которой можно узнать файлы которые включены в модуль, опции уже с установленными значениями, причину по которой включен модуль (напрямую из конфига или подтянулся по зависимостям) и зависимости самого модуля.
Порой нужно понять почему подключается тот или иной модуль. Для этого можно воспользоваться командой:
make include-reason-<module_name>
Например, для того же модуля embox.net.route:
$ make mod-include-reason-embox.net.route
embox.net.route: as dependence:
embox.cmd.net.ping: explicit
embox.cmd.net.route: explicit
embox.net.af_inet: explicit
embox.net.ipv4: explicit
embox.net.tcp_sock: explicit
#