⌨ Labor omnia vincit ☮

ARM cross compilation using OBS

Posted in ARM, SuSE [ru] by anaumov on 05.10.2012

Кросс-компиляция — это процесс компиляции кода для другой платформы, т.е. отличной от той, на которой она выполняется. Причин для кросс-компиляции может быть несколько, например скорость сборки, или просто недоступность той архитектуры, для которой нужно собрать проект. Я в двух словах расскажу о кросс-компиляции для ARM процессоров. Эта архитектура становится все более популярной.

Для знакомства с ARM я раздобыл RaspberryPi. Она представляет из себя так называемую development-board систему, на борту которой два USB, один 10/100 Ethernet, слот для SD/MMC/SDIO карт (с нее и стартует ОС), GPIO-разьем, HDMI, Broadcom BCM2835 чипсет, 256 MB памяти SDRAM и 700 MHz ARM11 процессор. Питание через microUSB (5V/700 mA). Стоит это удовольствие не больше стакана хорошего виски, т.е. порядка 20-30 € (в зависимости от цены за доставку). Думаю, что те, кто понимает, что речь идет о самой перспективной в мире архитектуре для мобильных устройств, не будут долго раздумывать о цене🙂
Но вернемся к кросс-компиляции…

Первое, о чем хочется сказать – это о принципе кросс-компиляции и работы OBS вообще. Для того, чтобы скомпилировать и слинковать программу для другой архитектуры нам понадобиться окружение, в котором будет доступен инструментарий разработки для этой архитектуры. Недостаточно просто сказать компилятору, чтобы он транслировал, к примеру, С-код программы для ARM, потому что даже для hello world будет использоваться внешняя библиотека glibc. Линковка объектного ARM-кода с x86_64-библиотекой в лучшем случае приведет к segmentation fault. В этом плане принцип кросс-компиляции один в один повторяет принцип работы OBS: для каждого процесса сборки OBS создает специальное окружение. Это окружение представляет из себя изолированную псевдо-систему, внутри которой запускается свой компилятор или интерпретатор, который опрашивет “свои” библиотеки. Так, к примеру, OBS работает под управлением 64-битной openSUSE, а в build-окружении может быть 32-битная Debian-система.

> cat /proc/cpuinfo 
Processor       : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS        : 697.95
Features        : swp half thumb fastmult vfp edsp java tls 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xb76
CPU revision    : 7

Hardware        : BCM2708
Revision        : 0002
Serial          : 000000003f1fd8df

Ок, 32- и 64-битные архитектуры все же как-никак совместимы, а что делать в случае с ARM? Для этого добавляется еще один необольшой, но очень важный компонент сборки – эмулятор процессора qemu. Использование эмулятора позволит нам на x86_64 процессоре собрать бинарные пакеты для архитектур armv5el и/или armv7l.

Packaging

Давайте теперь соберем тестовый пакет для RaspberryPi. Создадим самый простой spec и какой-нибудь hello world на С. Я думаю, что примеры этих файлов давать не надо, выглядеть они дожны точно так же как и для x86_64 арихитектуры (никаких особых параметров компилятору передавать не надо, но не забудьте установить пакет qemu-linux-user). После этого в том же каталоге соберем rpm следующей командой:

> osc build --alternative-project=openSUSE:Factory:ARM armv5el armv5el *.spec --clean

Как вы видтие, для создания окружения мы используем “альтернативный проект” openSUSE:Factory:ARM, репозиторий armv5el для арихитектуры armv5el. Именно из этого репозитория будут установленны необходимые для ARM-сборки компоненты. Все окружение будет развернуто за пару минут. Если ошибок в коде и spec-файле нет, то мы получим rpm для armv5el. Если вы решили начать с чего-то посложнее, то не забывайте, что процесс портированая openSUSE на ARM еще не закончен. Не все библиотеки, доступные для i586 и x86_64, пересобранны для ARM. Полный список для armv5el тут.

То же самое касается сборки для других дистрибутивов: внимательный читатель уже наверное заметил, что мы собрали rpm, а на RaspberryPi по дефолту скорее всего будет Raspbian. В OBS пока не собранно достаточно deb-пакетов для создания ARM-окружения. По этой причине придется либо использовать alien, либо вручную распаковывать rpm и собирать deb. Для “поиграть” такой метод еще пойдет, но о непрерывной интеграции (в случае использования Raspbian на производстве) пока не может быть и речи.

В сети вы можете найти много мануалов о создании ARM-окружения при помощи различных toolchain. Описание создания такого окружения для кросс-компиляции занимает как правило около полстраницы. OBS создает это окружение одной командой, предоставляя разработчику готовые к инсталяции пакеты.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: