Итак, Вы получили свою новую железку(например, Raspberry PI) на которой работает какой-то Linux, и Вам понадобилось собрать одну из многих открытых библиотек, или программ. И тут у Вас есть 3 пути:
- Собирать напрямую на устройстве,
- Собирать на компьютере без использования тулкитов,
- Собирать на компьютере используя тулкиты(scratchbox).
![]() |
Время сборки на PC, ARM, и scratchbox. |
Вариант 1 подходит, только для случая, когда производится сборка helloworld проекта, так как сборка чего-то более серьезного займет много времени(см. график, который показывает время сборки некоторых популярных библиотек, на PC и ARM устройстве. Точные характеристики тут.)
Вариант 2 хоть и имеет право на жизнь, но несет с собой кучу проблем, т.к. большинство открытого ПО собирается с помощью утилиты autotools, которая генерирует конечный Makefile, то для того чтобы configure скрипт отработал как нужно, Вам придется долго разбираться в каждом отдельном случае, для того чтобы правильно указать пути к SDK(toolchain, sysroot), компилятору и т.п. конечного устройства, и не факт, что в итоге получится.
Так появляется Вариант 3, где используется специальный кросскомпилирующий тулкит, который выполняет действия похожие pyenv(virtualenv) в Python, или RVM в Ruby т.е. создает изолированное окружение, в рамках которого, все вызовы к нужным системным утилитам будут перенаправлены на соответствующие им в SDK, при этом, если утилита не может быть запущена на PC, она будет запущена через эмулятор Qemu.
В данной статье я рассмотрю scratchbox2, который, как и scratchbox, мертв, но в моем случае, отработал как надо. Выбор пал на этот тулкит т.к. он доступен в репозиториях Ubuntu 12.04.
На самом деле работа с тулкитом тривиальна и сводится к следующему:
# Дать права на папку с SDK. sudo chown -R $USER:$USER SDK_FOLDER # Перейти в корень SDK(sysroot) cd SDK_ROOT # Создать новый target для scratchbox2 sb2-init TARGET_NAME PATH_TO_GCCпри этом произойдет сборка проверочной библиотеки, которая позволяет проверить правильность переданных настроек.
После этого запуск любой программы или скрипта, требующей правильных SDK путей, осуществляется с помощью следующей команды:
# Используя target по умолчанию sb2 PROGRAMM_NAME # Используя нужный target sb2 -t TARGET_NAME PROGRAMM_NAME # Target по умолчанию можно изменить с помощью sb2-config sb2-config -d TARGET_NAME
Или, можно запустить shell сессию, которая создаст рабочее окружение для соответствующего таргета. Для этого нужно вызвать sb2 без аргументов.
Для того чтобы удалить target необходимо удалить папку TARGET_NAME из ~/.sandbox2.
Для того чтобы удалить target необходимо удалить папку TARGET_NAME из ~/.sandbox2.