Яндекс.Метрика

    Песочница

    Nokia и ёжики. Часть 1


    На мой взгляд, hedgewars — одна из лучших open-source игр жанра «артиллерия», к тому же, с российскими корнями. Ёжики портируются под Android и iOS, а недавно я начал портировать их под свой N900, а заодно и под N9, так что пусть этот пост поучаствует в конкурсе «Умные телефоны за умные посты».
    Во время портирования приходилось решать различные вопросы, которые могут возникнуть при разработке приложений с использованием эмулятора N900/N9.

    Среда кросс-компиляции


    Что понадобится для портирования:

    • Компилятор free pascal, который идёт вместе с дистрибутивом
    • Исходные коды free pascal версии 2.5
    • Исходный код binutils
    • Nokia SDK, с которым идут многие необходимые средства кросс-компиляции

    Сборка паскалевского кросс-компилятора:

    Кросс-компилятор получится собрать с использованием make не новее 2.81, например, если вы пользуетесь Arch Linux, то вам придётся воспользоваться downgrade.
    Для сборки кросс-компилятора я использовал toolchain, идущий с Qt SDK:
    
    $ sudo make crossinstall CPU_TARGET=arm OS_TARGET=linux  \
    CROSSBINDIR=qt-sdk-n9/Maemo/4.6.2/toolchains/arm-2007q3-51sb6-gdb71-arm-none-linux-gnueabi_linux_x86_64/bin/  \
    BINUTILSPREFIX=arm-none-linux-gnueabi-  OPT=-dFPC_ARMEL \ 
    INSTALL_PREFIX=/usr
    
    $ sudo ln -s /usr/lib/fpc/2.5.1/ppcrossarm /usr/bin/ppcrossarm
    

    Также, нужно дописать параметры компилятора для arm в ~/.fpc.cfg, чтобы не вводить их при запуске компилятора:
    
    #IFDEF CPUARM
     -Xr/usr/lib/fpc/2.5.1/units/arm-linux/rtl/
     -XParm-none-linux-gnueabi-
     -darm
     -Tlinux
    #ENDIF
    

    Проверка кросс-компилятора

    Например, на helloworld
    
    $ export PATH=$PATH:<...>/qt-sdk-n9/Maemo/4.6.2/toolchains/arm-2007q3-51sb6-gdb71-arm-none-linux-gnueabi_linux_x86_64/bin/
    $ ppcrossarm hello.pas && file ./hello
    hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, stripped
    


    Подготавливаем эмулятор

    Доступ по ssh

    Обычный терминал гораздо удобнее, чем окошечко терминала в эмуляторе, так что имеет смысл настроить ssh-подключение. По умолчанию, на 22й порт устройства можно подключиться через 6666 порт localhost'a.
    На устройстве изменяем пароль юзера на более удобный и инициализируем настройки пользователя для ssh:
    
    $ devel-su
    # passwd user
    $ ssh-keygen
    

    Добавляем свой публичный ключ к ключам юзера на устройстве
    
    $ scp ~/.ssh/id_rsa.pub user@localhost:~/.ssh/authorized_keys -p6666
    

    Монтирование корневой раздел устройства в папку машины-хоста

    Образ с системой подключается, как сетевое блочное устройство, которое может быть смонтировано в локальную папку.
    
    modprobe nbd max_part=63
    qemu-nbd arm-qemu-rm680-image.qcow2
    nbd-client localhost 1024 /dev/nbd0
    mount /dev/nbd0p2 <path>/n9-root/
    

    Таким образом, можно будет использовать уже готовые библиотеки, собранные под arm, просто указав к ним путь.

    Увеличиваем размер /tmp

    Если вы будете что-то компилировать прямо в эмуляторе, места в /tmp может оказаться слишком мало. Параметры /tmp содержатся вовсе не в /etc/fstab, а в /etc/init.d/rcS:
    
    mount -n -t tmpfs -o size=<нужный размер tmp>,noatime tmpfs /tmp
    


    Дополнительные репозитории

    Список подключаемых репозиториев находится в файле /etc/apt/sources.d/nicks.list
    
     deb http://repo.pub.meego.com/home:/jokylanp/MeeGo_1.2_Harmattan/ ./
     deb http://repo.pub.meego.com/home:/sandst1:/harmattan/MeeGo_1.2_Harmattan/ ./
     deb http://repo.pub.meego.com/home:/tjyrinki/harmattan/ ./
     deb http://repo.pub.meego.com/home:/javispedro:/SDL/harmattan/ ./
    

    В этих репозиториях содержатся приложения и библиотеки, которые могут пригодиться при разработке.

    Похоже, что можно браться и за ежей.


    Берём последнюю версию из репозитория mercurial.
    
    $ hg clone https://hedgewars.googlecode.com/hg/ hedgewars
    


    И подготавливаем её
    
    $ cd hedgewars
    $ cmake .
    $ cd hedgewars 
    $ ppcrossarm hwengine.pas -Tlinux \
    -Fl<path_to_sdk>/qt-nokia-sdk/Madde/sysroots/harmattan_sysroot_10.2011.34-1_slim/lib \
    -Fl<path_to_mounted>/n9-root/lib \
    -Fl<path_to_mounted>/n9-root/usr/lib \
    -dLUA_DISABLED
    

    Может возникнуть ошибка «Error: string types doesn't match, because of $V+ mode» — ничего страшного не случится, если отключить эту проверку. Для этого нужно добавить {$V-} в файл options.inc

    Это была лишь подготовка, ведь начал портирование я совсем недавно и смогу заниматься ёжиками лишь по выходным, когда я свободен от всех дел, но если общественности моё начинание покажется полезным, я готов больше времени уделять этой задаче и даже написать продолжение image

    Источники информации: