вторник, 27 января 2015 г.

Кросскомпиляция с помощь scratchbox

Небольшая заметка о том, как удобно собирать autotools (configure based) ПО из исходников. Думаю для матерых Linux разработчиков для встраиваемых устройств, статья ничего нового не принесет, но для таких как я, "зеленых", может оказаться полезной :-).
Итак, Вы получили свою новую железку(например, Raspberry PI) на которой работает какой-то Linux, и Вам понадобилось собрать одну из многих открытых библиотек, или программ. И тут у Вас есть 3 пути:
  1. Собирать напрямую на устройстве,
  2. Собирать на компьютере без использования тулкитов,
  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.

Комментариев нет:

Отправить комментарий