Scratchbox2
Scratchbox2 (sbox2
или sb2
) — это набор инструментов
для кросс-компиляции, предназначенный для облегчения
разработки приложений для систем, встроенных в Linux.
В Linux при сборке программного обеспечения многие параметры определяются автоматически на основе хост-системы. Когда нужно собрать проект для встроенной цели (кросс-компиляция), большинство обнаруженных параметров оказываются неверны, так как конфигурация хоста не совпадает с конфигурацией встроенной цели. Scratchbox2 позволяет настроить «виртуальную» среду, которая заставит автоинструменты и исполняемые файлы «думать», что они напрямую работают на встроенной цели с её конфигурацией.
По своей сути это набор сценариев bash
, которые устанавливаются и обрабатываются
в среде QEMU, но при этом sb2
поддерживает множество различных архитектур, устанавливает все
необходимые пути и переменные компоновщика и предоставляет многие другие функции.
sb2
является частью пакета Аврора SDK и находится в /usr/bin/sb2 в chroot SDK.
Команда sb2
Синтаксис:
sb2 [OPTION]... [COMMAND] [PARAMETERS]
Если COMMAND
не указана, запускается оболочка bash
в среде scratchbox2
.
Опции:
-v
— вывести версию;-L level
— включить ведение журнала (levels= один из error,warning,notice,net,info,debug,noise,noise2,noise3);-d
— режим отладки: протоколировать все перенаправления;-t TARGET
— цель для использования, нужно использоватьsb2-config -d TARGET
, чтобы установить значение по умолчанию;-e
— режим эмуляции;-m MODE
— использовать режим сопоставленияMODE
;-M file
— читать правила отображения из файла;-n NET_MODE
— использовать сетевые правилаNET_MODE
;-s DIRECTORY
— загрузить сценарии сопоставления из альтернативного местоположения;-Q BUGLIST
— эмулировать ошибки старой версии scratchbox 1 (BUGLIST
состоит из букв:x
включает эмуляцию ошибок проверки прав доступа);-O options
— установить параметры для выбранного режима отображения (options
— это строка, зависящая от режима);-R
— использовать смоделированные root-права (активирует подсистему Vperm);-U UID.GID
— использовать UID и GID в качестве владельца и группы «неизвестных» файлов (для всех файлов, которые неизвестны подсистеме Vperm);-p
— не симулировать специальные привилегии FS пользователяroot
, когда активна опция-R
;-S file
— записать информацию о сеансе в файл;-J file
— не создавать новую сессию; присоединиться к существующей (см.- S
);-D file
— удалить старый сеанс (см.- S
). Предупреждение: действие не проверяет, используется ли сеанс в данный момент!-P file
— распечатать все журналы, относящиеся к постоянному сеансу (см.- S
);-W dir
— использоватьdir
в качестве каталога сеанса при создании сеанса (dir
должен быть абсолютным путём и не должен существовать. Длинные пути здесь могут вызвать проблемы с операциями с сокетами);-c
— при создании сеанса также создать личную копиюtarget_root
(roottrap
). Следует обратить внимание, что это может работать очень медленно, в зависимости от размераorig.target_root
;-C dir
— при создании сеанса создать копиюdir
и использовать её в качествеtarget_root
(roottrap
);-T dir
— использоватьdir
в качествеtools_root
(переопределяя значение из конфигурационного файла);-u
— отключить автоматическое обновление конфигурации;-g
— создать новый сеанс сsetsid()
; полезно при выполнении команд в фоновом режиме;-G file
— добавить номер группы процессов в файл;-b dir
— создание графиков и сводок журналов в каталогеdir
(подразумевается-L info
, графики создаются с помощьюsb2-logz
иdot
, если доступен пакетgraphviz
);-B dir
— как-b
, но также включает данные учета процессов. (Может потребовать специальных разрешений, потому что используется системный вызовacct(2)
);-q
— тишина; не выводить подробности отладки на стандартный вывод и т. д.;-N
— не удалять каталог сеанса, даже если сценарийsb2
не может войти в сеанс;-x OPTIONS
— указать дополнительные опции дляsb2d
.
Опции sb2-init
Параметры sb2-init
означают:
-d
— сделать указанную цель целью по умолчанию;-L
— опции компоновщика;-C
— параметры компилятора;-c
— какой эмулятор QEMU использовать;-m
— какое отображение использовать по умолчанию;-n
— не собиратьlibtool
;-N
— не делать локализацию для цели;-t
— расположение инструментов сборки.
Использование Scratchbox2
Создание простой программы на C
Код программы-примера расположен в ~/src/hello.c. Данный файл создаётся следующим образом:
mkdir ~/src
cat <<EOF >~/src/hello.c
#include <stdio.h>
int main(int argc, char **argv)
{
printf("Hello World\n");
return 0;
}
EOF
Компиляция данной программы:
sb2 gcc ~/src/hello.c -o ~/src/hello
Результат:
sb2: Error: No target specified and none set as default, aborting.
Когда sb2
запускается, ему нужно знать, где взять заголовочные файлы и библиотеки и какую
архитектуру и кросс-компилятор использовать.
Это называется целью (target).
SB2 может быть настроен для работы с несколькими именованными целями.
Использование нескольких целей
Можно использовать несколько целей с SDK.
Чтобы выполнить какое-либо действие для конкретной цели, необходимо добавить опцию -t
:
sb2 -t <target> ...
Чтобы перечислить все установленные цели, можно использовать:
sb2-config -l
Установка цели по умолчанию:
sb2-config -d <target>
Когда цели создаются, информация о цели помещается в каталог ~/.scratchbox2/, поэтому для удаления цели можно просто удалить каталоги оттуда:
rm -r ~/.scratchbox2/<target_name>
Следует уточнить, что если каталог ~/.scratchbox2/ находится внутри виртуальной машины Build Engine, то полный путь будет /home/mersdk/.scratchbox2.
Если работа осуществляется с Platform SDK, который устанавливается в домашнюю директорию пользователя, то полный путь к ~/.scratchbox2/ будет содержать путь к домашней директории, где установлен Platform SDK.
Сборка пакетов для ОС Аврора средствами sb2
Сначала нужно запустить виртуальную машину Аврора SDK.
Теперь можно установить все зависимости сборки, необходимые для программного обеспечения. Рекомендуется объявить их в файле спецификации (.spec), чтобы они автоматически устанавливались при сборке пакета с помощью команды mb2. Для этого примера он состоит только из CMake.
sfdk engine exec
Прежде чем идти дальше, необходимо проверить, что всё правильно установлено и что вход выполнен на правильную машину. Можно запустить следующую команду:
sdk-assistant list
Она должна вывести список целей, аналогичный следующему:
AuroraOS-armv7hl
AuroraOS-i486
Это означает, что сборочная машина может собирать пакеты для платформ ARM и i486. Первый используется для устройства, а второй для эмулятора.
Комплекты armv7hl и aarch64 используются для мобильных устройств, i486 и x86_64 — для эмулятора.
В примере используются оба, поэтому нужно установить CMake для обоих целевых типов. Это достигается с помощью следующих двух команд:
sb2 -t AuroraOS-armv7hl -m sdk-install -R zypper in cmake
sb2 -t AuroraOS-i486 -m sdk-install -R zypper in cmake
Сборка пакетов
Пакет можно собрать под целевую платформу. Если настроен файл спецификации, команды просты:
mb2 -t AuroraOS-i486 build
mb2 -t AuroraOS-armv7hl build
После завершения сборки можно найти пакеты RPM в каталоге RPMS.
Если нужно собрать проект вручную, следует просто обернуть собственные команды сборки sb2
следующим образом:
sb2 -t AuroraOS-i486 -m sdk-build cmake [cmake options]
sb2 -t AuroraOS-i486 -m sdk-build make
Теперь можно выйти из машины сборки.
exit
Дополнительно о командах для сборки проектов можно прочитать в документации о командах для машины сборки.