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

Упаковка .NET приложений для N900 на примере Bless

Время на прочтение3 мин
Количество просмотров1.2K
Рантайм и библиотеки Mono у нас уже есть. Но они наврятли попадут в репозитории Nokia по причине достаточно «весёлой» процедуры их сборки. Я попробую, конечно, пропихнуть в раздел non-free, но никаких гарантий нет. Ссылаться на внешний репозиторий некошерно, а держать несколько клонов этих пакетов проблематично. Как быть? Да достаточно просто. Упаковать рантайм и библиотеки в автономный исполняемый файл при помощи утилиты mkbundle. Кстати, вопреки опасениям я не заметил разницы во времени запуска и потреблении памяти до и после упаковки.




Для начала выкачиваем deb-пакет. В дальнейшем именно над его содержимым мы и будем издеваться.

Распаковываем:

dpkg -x bless_0.6.0-2_all.deb bless_armel
dpkg -e bless_0.6.0-2_all.deb bless_armel/DEBIAN


Окидываем взглядом содержимое. Куча лишнего хлама, от документации избавляемся сразу, всё-равно её удалят триггерами при установке.

Теперь мы остались наедине с ехешником и dll-ками. Натравливаем на них mkbundle:

ls *.dll |xargs mkbundle --deps --keeptemp -z bless.exe


Получаем на выходе a.out. Пробуем запустить, вроде как работает.

Теперь надо как-то соорудить бинарник для Maemo. Учтя флаг --keeptemp mkbundle любезно оставил для нас 2 файлика: temp.c и temp.s. По идее, их надо просто откомпилить хотя бы под тем же scratchbox'ом, но не тут-то было. Армный ассемблер по какой-то неведомой причине отказывается понимать директиву .type. Как ни странно, её можно совершенно безболезненно вырезать. Видимо, добавили из соображений совместимости. Ну, насколько оно совместимо мы уже увидели, так что натравливаем grep:
cat temp.s |grep -v «type.*object» >armasm.s


Теперь компилим в нашем окружении сборки:
as armasm.s -o armasm.o
cc -Wl,--rpath=/opt/bless/lib -ggdb -o bless -Wall temp.c `pkg-config --cflags --libs mono` -lz armasm.o


--rpath задаём потому что некоторые dll-ки пытаются пинать системные библиотеки, обращаясь к ним по весьма странным именам, так что мы просто насоздаём симлинков.

Откомпиленый бинарник кладём в /opt/bless/bin.

Теперь в эту самую директорию lib положим libMonoPosixHelper.so.0 libmono.so.0 (можно взять откомпилированные под n900 из пакетов у меня в репозитории). Скопируем либы для биндингов gtk, создадим несколько симлинков (intl, libc, msvcrt) на /lib/libc.so.6, перекинем desktop-файл в /usr/share/applications/hildon. Пфф, по идее всё. Получаем вот такое дерево:

/opt
/opt/bless
/opt/bless/bin
/opt/bless/bin/bless
/opt/bless/lib
/opt/bless/lib/msvcrt
/opt/bless/lib/libmono.so.0
/opt/bless/lib/usr
/opt/bless/lib/usr/lib
/opt/bless/lib/usr/lib/cli
/opt/bless/lib/usr/lib/cli/gdk-sharp-2.0
/opt/bless/lib/usr/lib/cli/gdk-sharp-2.0/libgdksharpglue-2.so
/opt/bless/lib/usr/lib/cli/glib-sharp-2.0
/opt/bless/lib/usr/lib/cli/glib-sharp-2.0/libglibsharpglue-2.so
/opt/bless/lib/usr/lib/cli/gtk-sharp-2.0
/opt/bless/lib/usr/lib/cli/gtk-sharp-2.0/libgtksharpglue-2.so
/opt/bless/lib/intl
/opt/bless/lib/libMonoPosixHelper.so
/opt/bless/lib/libc
/DEBIAN
/DEBIAN/control
/usr
/usr/bin
/usr/bin/bless
/usr/share
/usr/share/applications
/usr/share/applications/hildon
/usr/share/applications/hildon/bless.desktop
/usr/share/bless
/usr/share/bless/bless-default.layout
/usr/share/bless/bless.glade
/usr/share/bless/help_script.sh
/usr/share/bless/bless-about.png
/usr/share/bless/bless-48x48.png
/usr/share/bless/bless-16-bytes-per-row.layout
/usr/share/bless/bless-all-number-bases.layout
/usr/share/bless/default-preferences.xml
/usr/share/pixmaps
/usr/share/pixmaps/bless-48x48.png


Из DEBIAN/control вычищаем все зависимости — сейчас мы зависим только от того, что есть в firmware.

Собираем пакет:
fakeroot
chown -R root:root bless_armel
dpkg -b bless_armel


И… И всё. Пакет ставится, в главном меню появляется, файлики редактируются. Вот так всё просто. Взяли пакет из дебиана, малость поковыряли, получили на выходе работоспособный бинарник. Так можно сделать и с твоим софтом, %username%.
Сам пакет можно скачать тут.
Теги:
Хабы:
+22
Комментарии12

Публикации