Как стать автором
Обновить

Альтернативная среда сборки для N900

Время на прочтение 5 мин
Количество просмотров 2.1K
На текущий момент существует единственный официальный способ компиляции под N900 — через Scratchbox. Чем он мне не угодил? Да вот чем. Во-первых, он есть только под i386, со всеми вытекающими из этого весёлостями в виде необходимости держать кучу 32-хбитных библиотек. Во-вторых, ставится оно вопреки всем канонам зачем-то в /scratchbox, попутно прописывая свои модули для binfmt и, вытворяя прочую похабщину, разрушает стройную структуру дистрибутива. В-третьих там достаточно древний qemu, что даёт отнюдь не рекордную скорость компиляции. Ну и в-четвёртых, ставится это чудо очень медленно (я не знаю, где они хостятся, но установщик качал полгига пакетов довольно-таки длительное время. Кстати говоря, весит оно в установленном виде тоже изрядно. А поверх него ещё идёт SDK.
Ну и самое важное. qemu-user не поддерживает весь набор системных вызовов ядра. А, значит, часть софта (в частности, mono), банально не сможет работать. Проблему можно было бы решить, chroot'ясь в окружение из arm-ной системы в режиме полной эмуляции, но см. пункт первый.
В общем, убогое поделие, вообще не представляю, у кого рука поднялась его использовать в серьёзном проекте.

По-идее ещё можно компилить непосредственно на устройстве. Но тут проблема в том, что там стоит busybox, c которым очень плохо дружит тот же dpkg-buildpackage. Соответственно, при переносе rootfs c устройства и попытках оную использовать, эти грабли никуда не исчезают. А заменить его на coreutils не так-то просто, ибо это сломает часть зависимостей и отвалится полсистемы.



И что делать? А мы пойдём другим путём. Изобразим из себя ярых последователей барона Мюнхгаузена и в лучших традициях процедуры bootstrap (поднятие самого себя за шнурки ботинок) установим систему с нуля из пакетов. Как именно, читайте под катом.

Собственно, необходимо заиметь и заставить работать сердце любого дистрибутива на базе Debian — систему управления пакетами APT. А уже потом при помощи apt-get можно доустановить всё остальное. Но для его работы необходим dpkg. А dpkg необходимо хоть какое-то базовое окружение для старта. Вообще говоря, в нормальных дистрах черновую работу по его созданию выполняет debootstrap, но у нас нет скриптов под него для Maemo. Так что проще всего это сделать руками.

Для начала потребуется этот самый dpkg, установленный в основную систему. Если у вас не что-то на базе дебиана, то переживать не стоит, dpkg есть в репозиториях практически всех дистрибутивов. Помимо этого нам необходимо как-то chroot-иться в «гостевую» систему. Для этих целей существует утилита qemu-user (которую, кстати, нещадно эксплуатирует упомянутый выше scratchbox), которая, будучи известной модулю ядра binfmt, позволяет запускать бинарники для других архитектур прямо на текущем ядре, эмулируя процессор и как надо транслируя системные вызовы (syscall). Везде пакеты называются по разному, но нам нужен файл qemu-arm-static и нечто, что его пропишет куда надо. В Ubuntu нужный пакет зовётся qemu-kvm-extras-static.

Помимо этого нам надо будет раздобыть 8 deb-пакетов. libc6, gcc-4.2-base, libgcc1, perl-base, sysv-rc, dpkg, libstdc++6 и apt. Да, всего 8 пакетов нужны для поднятия системы с нуля. Их можно спокойно выкачать, поискав в maemo.org/packages. Хотя нет, вру. Содержимое этих пакетов, что называется, «не взлетит» при отсутствии таких базовых вещей как sh, ln, rm, etc. А они лежат в coreutils. А coreutils тоже просто так не ставится и хочет кучу всяких разностей. Как быть?

На помощь приходит вышеозначенный busybox. Причём версия из Maemo нам не интересна, ей тоже библиотеки нужны. Посему топаем на ports.ubuntu.com (ну или с debian.org можно, кому как нравится) и вытаскиваем оттуда пакет со статически слинкованным бизибоксом. Ему вообще ничего кроме интерфейса системных вызовов ядра не нужно. Вещь в себе. Разбираем пакет посредством dpkg -x и вытаскиваем оттуда вожделенный исполняемый файл.

Ну вот, теперь у нас всё готово и можно приступать.

Для начала создадим директорию для будущей системы и забросим туда qemu (поскольку мы будем делать chroot, он должен быть внутри, иначе чуда не получится).

mkdir -p root/usr/bin
cp /usr/bin/qemu-arm-static root/usr/bin


Теперь закидываем в /bin копии бизибокса. Их потом затрут утилиты из coreutils и прочих пакетов, но сейчас они жизненно необходимы.

mkdir -p root/bin
cp busybox root/bin/sh
cp busybox root/bin/ln
cp busybox root/bin/touch
cp busybox root/bin/chmod
cp busybox root/bin/chown
cp busybox root/bin/cp
cp busybox root/bin/tar
cp busybox root/bin/rm
cp busybox root/bin/gzip
cp busybox root/bin/grep


Теперь надо создать минимальный набор директорий, без которых dpkg основной системы ничего не сможет сделать с «гостем»:

mkdir root/etc
mkdir -p root/var/lib/dpkg
mkdir root/var/lib/dpkg/tmp.ci
mkdir root/var/lib/dpkg/updates
mkdir root/var/lib/dpkg/info
mkdir -p root/var/log
mkdir -p root/dev/pts
touch root/var/lib/dpkg/status
touch root/var/lib/dpkg/available
touch root/etc/ld.so.conf
mkdir /var/backups
touch /var/backups/infodir.bak


Как теперь ставить пакеты? Да просто. У dpkg есть параметр --root, который заставляет его работать, считая указанную директорию корнем. Очень полезно. Вообще он должен ругаться на не соответствие архитектур (у вас же там не на ARM основная система поди?), так что скажем ему --force-architecture

export DPKG=«dpkg --force-architecture --root=root -i „

$DPKG packages/libc6_2.5.1-1eglibc27+0m5_armel.deb
$DPKG packages/gcc-4.2-base_4.2.1-4maemo13+0m5_armel.deb
$DPKG packages/libgcc1_4.2.1-4maemo13+0m5_armel.deb
$DPKG packages/perl-base.deb
$DPKG packages/dpkg_1.14.25maemo3+0m5_armel.deb
$DPKG packages/sysv-rc_2.85-22.osso15_all.deb


По идее, он должен отрапортовать о том, что всё успешно. Теперь примонтируем к гостю /dev/pts, ибо при установке некоторых пакетов оно нужно.

mount --bind /dev/pts root/dev/pts


Всё, можно делать chroot root /bin/sh. Теперь мы в новосозданной системе. Пока ещё здесь пустовато и практически ничего не работает. Теперь надо бы установить APT. Натравливаем уже присутствующий в системе dpkg на ранее скопированные в неё оставшиеся два пакета. Предварительно выставим локаль в C, ибо локалей у нас тут пока нет.

export LC_ALL=C
dpkg -i libstdc++6_4.2.1-4maemo13+0m5_armel.deb
dpkg -i apt_0.7.20.2maemo13.1+0m5_armel.deb


Теперь прописываем DNS в resolv.conf. Я обычно ставлю 8.8.8.8, но тут на любителя. Так же приводим sources.list к следующему виду:

deb http_://repository.maemo.org/extras/ fremantle-1.3 free non-free
deb http_://repository.maemo.org/extras-testing/ fremantle-1.3 free non-free
deb http_://repository.maemo.org/extras-devel/ fremantle-1.3 free non-free
deb http_://repository.maemo.org/ fremantle/sdk free non-free


apt-get update
apt-get --allow-unauthenticated -y install apt-transport-https coreutils tar build-essential gzip grep bash aptitude libgtk2.0-dev
apt-get clean


Сидим, ждём, пока apt-get оперативно качает и устанавливает пакеты. Когда спросит, затирать ли resolv.conf, шлите лесом. На выходе получаем компактное (около 200 мегабайт, из сети вообще около 60 выкачивается) окружение, в которое можно спокойно chroot'иться и компилить там всякие разности. И всё это без разных там кривых Scratchbox'ов. Единственное, воспользоваться Xephir'ом наврятли получится, но мне как-то ближе отладка на железе. При желании можете развернуть ту же систему в i386-варианте, процесс ничем не отличается, зато X-сервер должен подцепиться.

После вышеозначенных шагов может понадобиться сходить вот сюда дабы получить доступ к проприетарщине (в частности либам OpenGL, без них Qt не ставится). Кстати, nokia-binaries и nokia-apps ставить надо через aptitude. apt-get не в состоянии разрулить зависимости почему-то.

Напоминаю, что в режиме qemu-user не работает некоторый набор софта. Настоятельно рекомендую использовать qemu-arm-system, натравливая его на образ с собранным под ARM нормальным линуксом, а уже оттуда выполнять chroot. Образ убунты можно сделать вот по этому мануалу, там нет ничего сложного. Но для обычного GCC с лихвой хватает и qemu-user.

Спасибо за внимание, до новых встреч.

Архив с пакетами и скриптом-установщиком
Теги:
Хабы:
+22
Комментарии 14
Комментарии Комментарии 14

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн