 |
GP2X Community Новостной форум посвященный консолям GP2X
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
BiSe Trojanov
Постоялец
Пол:  Возраст: 35 Зарегистрирован: 21.04.2011 Сообщения: 18 Откуда: Казань Группы: Нет
|
|
В этом сообщении я постараюсь написать как собрать Pascal, компилирующий под Caanoo. На поиск всего этого решения у меня ушло ~22 часа. Всё это решение работает на Ubuntu 10.04.
Сначала нам нужен рабочий Free Pascal и его исходники. Free Pascal самораскручивающийся компилятор. Это значит, что он сам написан на Паскале и после компиляции мы получим компилятор, собранный им же самим. В качестве первого пинка (того, что компилирует самые базовые вещи, которые потом компилируют всё основное) используется какое-то решение, которое я, если честно, не осилил, поэтому я просто скачал Паскаль из репозиториев.
Код: | sudo apt-get install fp-utils #сначала качаем из репозиториев
sudo apt-get install -y alien libncurses5-dev libXp-dev libgtk2.0-dev #библиотеки, которые нам понадобятся
svn checkout http://svn.freepascal.org/svn/fpc/trunk ~/fpc #качаем исходники, это минут на 20
svn export ~/fpc ~/fpc.out
cd ~/fpc.out
make build OS_TARGET=linux CPU_TARGET=i386 #компилируем Паскаль под нашу машину
sudo make install OS_TARGET=linux CPU_TARGET=i386 |
Теперь нам надо почистить компьютер от старого Паскаля. Чтобы он на не путал и не занимал лишнего места
Код: | sudo rm -rf /usr/lib/fpc/2.4.0 #удаляем старую компиляцию
sudo ln -s /usr/local/lib/fpc/2.5.1 /usr/lib/fpc/2.5.1 #заметьте, собранный Паскаль устанавливает юниты в /usr/local/lib, а не /usr/lib как это делает Паскаль из apt-get
sudo rm -f /usr/bin/ppc386
sudo ln -s /usr/local/lib/fpc/2.5.1/ppc386 /usr/bin/ppc386 |
Теперь вводим в консоли fpc и видим что-то типа
Код: | Free Pascal Compiler version 2.5.1 [2011/04/20] for i386
Copyright (c) 1993-2011 by Florian Klaempfl and others |
Дальше нужно ставить binutils. Заходим на http://ftp.gnu.org/gnu/binutils/ и ищем самую свежую версию. На 20 апреля это была 2.21. Не ошибитесь как я, не скачайте 2.9 (ей уже 13 лет, и она немного устарела)
Код: | cd /tmp
wget http://ftp.gnu.org/gnu/binutils/binutils-2.21.tar.bz2
#распаковываем архив
cd binutils-2.21
#Есть два подходящих таргета компиляции arm-elf и arm-linux. Нужен из них второй, но я на будущее собрал оба
./configure --target=arm-linux --disable-werror --with-gnu-as --with-gnu-ld
make
sudo make install
make clean
./configure --target=arm-elf --disable-werror --with-gnu-as --with-gnu-ld #собираем второй
make
sudo make install |
Теперь у нас в /usr/local/bin лежит куча файлов с названиями arm-linux- и arm-elf- фактически нас интересуют только два: as (ассемблер) и ld (компоновщик)
Теперь самое интересное мы собираем FreePascal для компиляции под Caanoo. Везде написано, что для правильной компиляции программ для arm нужно собирать Паскаль с параметрами FPC_ARMEL и FPC_ABI_EABI, здесь у меня резко противоположное мнение. У меня как раз собрать программы таким компилятором не получилось (при компиляции не сходились версии EABI с версиями из so-файлов с консоли). В более старых версиях Паскаля (до 2.2.4) платформы типа Caanoo, Wiz и Nokia N900 вообще не были предусмотрены. Потом же их упоминание наконец появилось. Но что бы компилятор собирал правильные программы, необходим флаг FPC_ARMEL, который я как раз не использую. В виду этого нам придётся руками поправить исходники Free Pascal. Вы можете этого и не делать, тогда вам надо будет запускать скомпилированные программы несколько более непривычной командой.
Код: | nano ~/fpc.out/compiler/systems/t_linux.pas #Открываем исходники |
Находим строки
Код: | {$ifdef arm}
{$ifdef FPC_ARMEL}
defdynlinker:='/lib/ld-linux.so.3';
{$else FPC_ARMEL}
defdynlinker:='/lib/ld-linux.so.2';
{$endif FPC_ARMEL}
{$endif arm} |
заменяем на
Код: | {$ifdef arm}
defdynlinker:='/lib/ld-linux.so.3';
{$endif arm} |
Теперь в качестве загрузчика для получившихся EABI-приложений будет использоваться /lib/ld-linux.so.3. ВНИМАНИЕ, получившийся компилятор теперь будет плодить неправильных эльфов для других arm-устройств.
Код: | cd ~/fpc.out/
sudo make crossinstall OS_TARGET=linux CPU_TARGET=arm OPT="-O-" CROSSOPT="-O-" |
Всё, Паскаль собран. Теперь нам нужны so-шки. Сколько не возился я с разными версиями SDK, воспользоваться сошками оттуда не смог. Я забрал их с Caanoo из папок /lib и /usr/lib. Судя по /etc/ld.conf.so, нам ещё нужны из /usr/local/lib и из /usr/X11R6/lib, но для себя их я пока не трогал. Кидаем их в папку на компьютере /usr/lib/caanoo
Делаем две простейшие программы.
test.pas:
Код: | program test;
begin
writeln('DATE ',{$i %DATE%});
writeln('FPCTARGET ',{$i %FPCTARGET%});
writeln('FPCTARGETCPU ',{$i %FPCTARGETCPU%});
writeln('FPCTARGETOS ',{$i %FPCTARGETOS%});
writeln('FPCVERSION ',{$i %FPCVERSION%});
end. |
p3.pas:
Код: | function SDL_Init(): longint; cdecl; external 'SDL' name 'SDL_Init';
Begin
writeln('Hello world');
writeln(SDL_Init());
End. |
И компилируем их
Код: | fpc -Parm -Xd -Fd -Fl/usr/lib/caanoo ./p3.pas -op3.gpe
fpc -Parm -Xd -Fd -Fl/usr/lib/caanoo ./test.pas -otest.gpe |
С помощью readelf посмотрим что у нас получилось.
Код: | readelf -h p3.gpe
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0x8228
Start of program headers: 52 (bytes into file)
Start of section headers: 37616 (bytes into file)
Flags: 0x4000002, has entry point, Version4 EABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 6
Size of section headers: 40 (bytes)
Number of section headers: 18
Section header string table index: 15 |
Код: | readelf -h test.gpe
Magic: 7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: ARM
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0x8094
Start of program headers: 52 (bytes into file)
Start of section headers: 37212 (bytes into file)
Flags: 0x2, has entry point, GNU EABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 3
Size of section headers: 40 (bytes)
Number of section headers: 8
Section header string table index: 7 |
Когда мы компилируем программу, которая пользуется функциями из so-библиотек (то есть абсолютное большинство программ), мы получаем на руки Version4 EABI, иначе GNU EABI. Для них используются разные загрузчики
Если при запуске программы (на Caanoo само собой) с Version4 EABI вы получаете
Код: | ./p3.gpe
sh: ./p3.gpe: not found |
значит у вас неправильно прописан загрузчик. Именно его мы и меняли в исходниках Паскаля.
Код: | /lib/ld-linux.so.3 p3.gpe |
у вас запустится. Кстати, если попробовать запустить
Код: | /lib/ld-linux.so.3 test.gpe |
получим просто Segmentation fault.
Последний раз редактировалось: BiSe Trojanov (Сб Апр 23, 2011 4:39 am), всего редактировалось 1 раз |
|
Вернуться к началу |
|
 |
Hahahoj
Site Admin

Пол:  Возраст: 51 Зарегистрирован: 08.10.2008 Сообщения: 1848
Группы:
|
|
Спасибо за тему.
Есть ли возможность запустить Фрипаскаль таким же образом под Windows?
Тесты на Давинчи нормально компилятся и после работает на Кену? _________________ Просто Вовк |
|
Вернуться к началу |
|
 |
ainu
Местный
Возраст: 37 Зарегистрирован: 13.11.2010 Сообщения: 133
Группы: Нет
|
|
Я попробую поднять это дело на внешнем сервере под убунтой.
Из под винды можно будет использовать.
Сейчас главное с SDL разобраться и будет супер. |
|
Вернуться к началу |
|
 |
BiSe Trojanov
Постоялец
Пол:  Возраст: 35 Зарегистрирован: 21.04.2011 Сообщения: 18 Откуда: Казань Группы: Нет
|
|
Hahahoj писал(а): | Есть ли возможность запустить Фрипаскаль таким же образом под Windows? | В марте этого года некий KidPaddle сделал сборку FPC под Винду. Внутри есть готовый бинутилс для ARM. За те 22 часа часа мытарств я попробовал разобраться и в этой сборке. Мне не удалось заставить её компилировать. В теории, нам понадобятся MinGW (как компилятор Си-кода), исходники бинутилс и FreePascal. И время что бы повторить мои шаги на Линуксе. Так как я заранее понимал, что заставить Линуксовые проги компилировать не-пойми-какой-код на не-пойми-какое-устройство не получится, я решил эксперименты проводить сразу на своей Ubuntu.
Hahahoj писал(а): | Тесты на Давинчи нормально компилятся и после работает на Кену? | Никак не могу найти информацию, что это за тесты. Из того, что точно работает: модуль netdb мои эксперименты с сетью увенчались успехом. А что ещё может понадобится? Вот что я не смог осилить это dynlibs заголовки с LoadLibrary. Возможно, если подключать dl_open прямо из libc.so и пользоваться им, то станет можно подключать so-шки налету. Но, учитывая что я смог импортировать функции из so-файлов (SDL_Init из libsdl.so), особого смысла в этом не вижу.
ainu писал(а): | Сейчас главное с SDL разобраться и будет супер. | Надеюсь, 23-24 числа появится свободное время и займусь переводом h-заголовков на Паскаль. |
|
Вернуться к началу |
|
 |
Hahahoj
Site Admin

Пол:  Возраст: 51 Зарегистрирован: 08.10.2008 Сообщения: 1848
Группы:
|
|
BiSe Trojanov писал(а): |
Hahahoj писал(а): | Тесты на Давинчи нормально компилятся и после работает на Кену? | Никак не могу найти информацию, что это за тесты. Из того, что точно работает: модуль netdb мои эксперименты с сетью увенчались успехом. А что ещё может понадобится? Вот что я не смог осилить это dynlibs заголовки с LoadLibrary. Возможно, если подключать dl_open прямо из libc.so и пользоваться им, то станет можно подключать so-шки налету. Но, учитывая что я смог импортировать функции из so-файлов (SDL_Init из libsdl.so), особого смысла в этом не вижу.
|
Я про DGE (ака Давинчи Гейм Энжайн, инициализация которого промелькнула во втором твоем примере). Твои тесты зашли дальше его инициализации? Хотя частично ты уже ответил. _________________ Просто Вовк |
|
Вернуться к началу |
|
 |
BiSe Trojanov
Постоялец
Пол:  Возраст: 35 Зарегистрирован: 21.04.2011 Сообщения: 18 Откуда: Казань Группы: Нет
|
|
Hahahoj писал(а): | Твои тесты зашли дальше его инициализации? | Нет, DGE я пока вообще не трогал. |
|
Вернуться к началу |
|
 |
BiSe Trojanov
Постоялец
Пол:  Возраст: 35 Зарегистрирован: 21.04.2011 Сообщения: 18 Откуда: Казань Группы: Нет
|
|
Наконец освободился и продолжил свои эксперименты. Не могу использовать функцию SDL_SetVideoMode. При любых входных параметрах она выдаёт в качестве ответа 0x10, что никак не может является валидным ответом. При вызове SDL_Quit программа падает с unexpected error, при этом при exit'е всё завершается прекрасно. Вызов SDL_Init вроде бы возвращает всё правильно. SDL_GetVideoInfo выдаёт правильную структуру. Смог заставить dynlibs работать. Буду пробовать инклюдить функции в процессе. |
|
Вернуться к началу |
|
 |
Hahahoj
Site Admin

Пол:  Возраст: 51 Зарегистрирован: 08.10.2008 Сообщения: 1848
Группы:
|
|
Можно попробовать поэксперементировать с внешними SDL-либами от Икари. Ну и юзать функции так, как в Сишке не забывая о том, что Паскаль передает параметры внешним процедурам не так как сишка (может в этом и глюка?).
.PS На всякий случай.
При стандартной инициализации графики и управления на гп-хе используются следующие вызовы функций и их входные параметры:
Код: | SDL_Init (SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK);
SDL_ShowCursor(SDL_DISABLE);
SDL_SetVideoMode (320, 240, 16, SDL_FULLSCREEN | SDL_SWSURFACE);
SDL_JoystickOpen(0); |
_________________ Просто Вовк |
|
Вернуться к началу |
|
 |
BiSe Trojanov
Постоялец
Пол:  Возраст: 35 Зарегистрирован: 21.04.2011 Сообщения: 18 Откуда: Казань Группы: Нет
|
|
Код: | Паскаль передает параметры внешним процедурам не так как сишка | Если бы я не поставил метод вызовов cdecl, я бы ещё при вызове функции ловил Seg Fault, там ведь параметры передаются либо через стек либо через стек + eax либо ещё несколько способов.
В общем, dynlibs помог. Если не вызывать ни одну инклюженую при компиляции функцию, то всё работает прекрасно. Так что при инициализации приложения надо все функции из SDL через LoadLibrary подключать. |
|
Вернуться к началу |
|
 |
Hahahoj
Site Admin

Пол:  Возраст: 51 Зарегистрирован: 08.10.2008 Сообщения: 1848
Группы:
|
|
Кстати, ты написал чо у тебя отлично сняло структурку SDL_GetVideoInfo.
Есть просьба, скинь пожалуйста заглядеть.
У меня такой мусор под сишкой приходит, что ой. 8/ _________________ Просто Вовк |
|
Вернуться к началу |
|
 |
BiSe Trojanov
Постоялец
Пол:  Возраст: 35 Зарегистрирован: 21.04.2011 Сообщения: 18 Откуда: Казань Группы: Нет
|
|
У меня там точно не мусор, w: 320, h: 240 это правильные значения. У меня чего-то опять компилятор сдох, опять не хочет комплировать с dynlibs. Пересоберу его, скину.
Грёбаное трюкачество. Оказалось, dynlibs не собирается, ибо программа компилируется в GNU EABI, а в GNU EABI она компилируется, если не подключать функции из .so-файлов. А я как раз переписал свой проектный SDL.pas так, что бы все функции грузились через LoadLibrary.
Код: | /usr/local/bin/arm-linux-ld: warning: link.res contains output sections; did you forget -T?
/usr/lib/fpc/2.5.1/units/arm-linux/rtl/cprt0.o: In function `_haltproc_eabi':
(.text+0x88): undefined reference to `_fini'
/usr/lib/fpc/2.5.1/units/arm-linux/rtl/cprt0.o: In function `_haltproc_eabi':
(.text+0x90): undefined reference to `_init'
p4.pas(6) Error: Error while linking | На будущее, если у кого-то возникнут такие ошибки, это значит Free Pascal пытается собрать GNU EABI. надо будет разобраться как заставить негодяя всегда собирать EABI v4.
Структуры я описал так
Код: | type SDL_VideoInfo = record
flag0 : longint;
video_mem : Uint32;
vfmt : ^SDL_PixelFormat;
current_w : longint;
current_h : longint;
end;
type SDL_PixelFormat = record
palette : ^SDL_Palette;
BitsPerPixel : Uint8;
BytesPerPixel : Uint8;
Rloss : Uint8;
Gloss : Uint8;
Bloss : Uint8;
Aloss : Uint8;
Rshift : Uint8;
Gshift : Uint8;
Bshift : Uint8;
Ashift : Uint8;
Rmask : Uint32;
Gmask : Uint32;
Bmask : Uint32;
Amask : Uint32;
colorkey : Uint32;
alpha : Uint8;
end; |
Вот их содержание
Код: | flag0: 1
video_mem: 225
vfmt: 0x2A0261A0
current_w: 320
current_h: 240
palette: 0x00000000
BitsPerPixel: 24
BytesPerPixel: 3
Rloss: 0
Gloss: 0
Bloss: 0
Aloss: 8
Rshift: 16
Gshift: 8
Bshift: 0
Ashift: 0
Rmask: 0x00FF0000
Gmask: 0x0000FF00
Bmask: 0x000000FF
Amask: 0x00000000
colorkey: 0
alpha: 255 |
|
|
Вернуться к началу |
|
 |
Hahahoj
Site Admin

Пол:  Возраст: 51 Зарегистрирован: 08.10.2008 Сообщения: 1848
Группы:
|
|
Меня смущает не это, там всё в порядке, а скорее флаги совместимости:
Код: | hw_available? 1
blit_hw? 0
blit_hw_CC? 0
blit_hw_A? 0
blit_sw? 0
blit_sw_CC? 0
blit_sw_A? 0
blit_fill? 0 |
У тебя, кстати, результат тот же. _________________ Просто Вовк |
|
Вернуться к началу |
|
 |
BiSe Trojanov
Постоялец
Пол:  Возраст: 35 Зарегистрирован: 21.04.2011 Сообщения: 18 Откуда: Казань Группы: Нет
|
|
Уф, 7 часов мытарств с SDL принесли плоды. Заставил работать event'ы и сделал многопоточность. Через sdl_createthread ни в какую не получилось заставить работать, собрал тупо через Паскалевский TThread, работающий через libPThread.so. Сейчас займусь TTF и минимальный SDL будет готов. |
|
Вернуться к началу |
|
 |
ainu
Местный
Возраст: 37 Зарегистрирован: 13.11.2010 Сообщения: 133
Группы: Нет
|
|
Вернуться к началу |
|
 |
BiSe Trojanov
Постоялец
Пол:  Возраст: 35 Зарегистрирован: 21.04.2011 Сообщения: 18 Откуда: Казань Группы: Нет
|
|
ainu писал(а): | А SDL_joystick работает? | Внутри архива пример работы с SDL. Джойстик опрашивается великолепно одной функцией. Вот что бы тачскрин опрашивать, пришлось усложнить архитектуру и читать ивенты. |
|
Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
Powered by phpBB © 2001, 2005 phpBB Group
|