На текущий момент существует единственный официальный способ компиляции под 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, он должен быть внутри, иначе чуда не получится).
Теперь закидываем в /bin копии бизибокса. Их потом затрут утилиты из coreutils и прочих пакетов, но сейчас они жизненно необходимы.
Теперь надо создать минимальный набор директорий, без которых dpkg основной системы ничего не сможет сделать с «гостем»:
Как теперь ставить пакеты? Да просто. У dpkg есть параметр --root, который заставляет его работать, считая указанную директорию корнем. Очень полезно. Вообще он должен ругаться на не соответствие архитектур (у вас же там не на ARM основная с��стема поди?), так что скажем ему --force-architecture
По идее, он должен отрапортовать о том, что всё успешно. Теперь примонтируем к гостю /dev/pts, ибо при установке некоторых пакетов оно нужно.
Всё, можно делать chroot root /bin/sh. Теперь мы в новосозданной системе. Пока ещё здесь пустовато и практически ничего не работает. Теперь надо бы установить APT. Натравливаем уже присутствующий в системе dpkg на ранее скопированные в неё оставшиеся два пакета. Предварительно выставим локаль в C, ибо локалей у нас тут пока нет.
Теперь прописываем DNS в resolv.conf. Я обычно ставлю 8.8.8.8, но тут на любителя. Так же приводим sources.list к следующему виду:
Сидим, ждём, пока 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.
Спасибо за внимание, до новых встреч.
Архив с пакетами и скриптом-установщиком
Ну и самое важное. 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.
Спасибо за внимание, до новых встреч.
Архив с пакетами и скриптом-установщиком
