Золотые страницы форума GP2X Community
Новостной форум посвященный консолям GP2X
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   СудокуСудоку    Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Free Pascal, компилирующий под Caanoo
На страницу 1, 2  След.
 
Начать новую тему   Ответить на тему    Список форумов GP2X Community -> Программирование: Консоли GP2X F100 F200 Wiz Caanoo
Предыдущая тема :: Следующая тема  
Автор Сообщение
BiSe Trojanov

Постоялец


Пол: Пол:Мужской
Возраст: 28
Зарегистрирован: 21.04.2011
Сообщения: 18
Откуда: Казань
Группы: Нет

СообщениеДобавлено: Чт Апр 21, 2011 7:51 pm    Заголовок сообщения: Free Pascal, компилирующий под Caanoo Ответить с цитатой

В этом сообщении я постараюсь написать как собрать 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 раз
Вернуться к началу
Посмотреть профильBiSe Trojanov сейчас оффлайн  Отправить личное сообщение
Hahahoj

Site Admin


Пол: Пол:Мужской
Возраст: 44
Зарегистрирован: 08.10.2008
Сообщения: 1848

Группы: 
[ Команда сайта ]
[Модераторы Модераторы ]


СообщениеДобавлено: Пт Апр 22, 2011 8:23 am    Заголовок сообщения: Ответить с цитатой

Спасибо за тему.
Есть ли возможность запустить Фрипаскаль таким же образом под Windows?
Тесты на Давинчи нормально компилятся и после работает на Кену?

_________________
Просто Вовк
Вернуться к началу
Посмотреть профильHahahoj сейчас оффлайн  Отправить личное сообщение
ainu

Местный



Возраст: 30
Зарегистрирован: 13.11.2010
Сообщения: 133

Группы: Нет

СообщениеДобавлено: Пт Апр 22, 2011 3:36 pm    Заголовок сообщения: Ответить с цитатой

Я попробую поднять это дело на внешнем сервере под убунтой.
Из под винды можно будет использовать.
Сейчас главное с SDL разобраться и будет супер.
Вернуться к началу
Посмотреть профильainu сейчас оффлайн  Отправить личное сообщение
BiSe Trojanov

Постоялец


Пол: Пол:Мужской
Возраст: 28
Зарегистрирован: 21.04.2011
Сообщения: 18
Откуда: Казань
Группы: Нет

СообщениеДобавлено: Пт Апр 22, 2011 9:50 pm    Заголовок сообщения: Ответить с цитатой

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-заголовков на Паскаль.
Вернуться к началу
Посмотреть профильBiSe Trojanov сейчас оффлайн  Отправить личное сообщение
Hahahoj

Site Admin


Пол: Пол:Мужской
Возраст: 44
Зарегистрирован: 08.10.2008
Сообщения: 1848

Группы: 
[ Команда сайта ]
[Модераторы Модераторы ]


СообщениеДобавлено: Пт Апр 22, 2011 10:39 pm    Заголовок сообщения: Ответить с цитатой

BiSe Trojanov писал(а):

Hahahoj писал(а):
Тесты на Давинчи нормально компилятся и после работает на Кену?
Никак не могу найти информацию, что это за тесты. Из того, что точно работает: модуль netdb мои эксперименты с сетью увенчались успехом. А что ещё может понадобится? Вот что я не смог осилить это dynlibs заголовки с LoadLibrary. Возможно, если подключать dl_open прямо из libc.so и пользоваться им, то станет можно подключать so-шки налету. Но, учитывая что я смог импортировать функции из so-файлов (SDL_Init из libsdl.so), особого смысла в этом не вижу.

Я про DGE (ака Давинчи Гейм Энжайн, инициализация которого промелькнула во втором твоем примере). Твои тесты зашли дальше его инициализации? Хотя частично ты уже ответил.

_________________
Просто Вовк
Вернуться к началу
Посмотреть профильHahahoj сейчас оффлайн  Отправить личное сообщение
BiSe Trojanov

Постоялец


Пол: Пол:Мужской
Возраст: 28
Зарегистрирован: 21.04.2011
Сообщения: 18
Откуда: Казань
Группы: Нет

СообщениеДобавлено: Сб Апр 23, 2011 4:37 am    Заголовок сообщения: Ответить с цитатой

Hahahoj писал(а):
Твои тесты зашли дальше его инициализации?
Нет, DGE я пока вообще не трогал.
Вернуться к началу
Посмотреть профильBiSe Trojanov сейчас оффлайн  Отправить личное сообщение
BiSe Trojanov

Постоялец


Пол: Пол:Мужской
Возраст: 28
Зарегистрирован: 21.04.2011
Сообщения: 18
Откуда: Казань
Группы: Нет

СообщениеДобавлено: Пн Апр 25, 2011 7:11 am    Заголовок сообщения: Ответить с цитатой

Наконец освободился и продолжил свои эксперименты. Не могу использовать функцию SDL_SetVideoMode. При любых входных параметрах она выдаёт в качестве ответа 0x10, что никак не может является валидным ответом. При вызове SDL_Quit программа падает с unexpected error, при этом при exit'е всё завершается прекрасно. Вызов SDL_Init вроде бы возвращает всё правильно. SDL_GetVideoInfo выдаёт правильную структуру. Смог заставить dynlibs работать. Буду пробовать инклюдить функции в процессе.
Вернуться к началу
Посмотреть профильBiSe Trojanov сейчас оффлайн  Отправить личное сообщение
Hahahoj

Site Admin


Пол: Пол:Мужской
Возраст: 44
Зарегистрирован: 08.10.2008
Сообщения: 1848

Группы: 
[ Команда сайта ]
[Модераторы Модераторы ]


СообщениеДобавлено: Пн Апр 25, 2011 9:00 am    Заголовок сообщения: Ответить с цитатой

Можно попробовать поэксперементировать с внешними 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);

_________________
Просто Вовк
Вернуться к началу
Посмотреть профильHahahoj сейчас оффлайн  Отправить личное сообщение
BiSe Trojanov

Постоялец


Пол: Пол:Мужской
Возраст: 28
Зарегистрирован: 21.04.2011
Сообщения: 18
Откуда: Казань
Группы: Нет

СообщениеДобавлено: Пн Апр 25, 2011 9:05 am    Заголовок сообщения: Ответить с цитатой

Код:
Паскаль передает параметры внешним процедурам не так как сишка
Если бы я не поставил метод вызовов cdecl, я бы ещё при вызове функции ловил Seg Fault, там ведь параметры передаются либо через стек либо через стек + eax либо ещё несколько способов.

В общем, dynlibs помог. Если не вызывать ни одну инклюженую при компиляции функцию, то всё работает прекрасно. Так что при инициализации приложения надо все функции из SDL через LoadLibrary подключать.
Вернуться к началу
Посмотреть профильBiSe Trojanov сейчас оффлайн  Отправить личное сообщение
Hahahoj

Site Admin


Пол: Пол:Мужской
Возраст: 44
Зарегистрирован: 08.10.2008
Сообщения: 1848

Группы: 
[ Команда сайта ]
[Модераторы Модераторы ]


СообщениеДобавлено: Пн Апр 25, 2011 10:55 am    Заголовок сообщения: Ответить с цитатой

Кстати, ты написал чо у тебя отлично сняло структурку SDL_GetVideoInfo.
Есть просьба, скинь пожалуйста заглядеть.
У меня такой мусор под сишкой приходит, что ой. 8/

_________________
Просто Вовк
Вернуться к началу
Посмотреть профильHahahoj сейчас оффлайн  Отправить личное сообщение
BiSe Trojanov

Постоялец


Пол: Пол:Мужской
Возраст: 28
Зарегистрирован: 21.04.2011
Сообщения: 18
Откуда: Казань
Группы: Нет

СообщениеДобавлено: Пн Апр 25, 2011 11:24 am    Заголовок сообщения: Ответить с цитатой

У меня там точно не мусор, 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
Вернуться к началу
Посмотреть профильBiSe Trojanov сейчас оффлайн  Отправить личное сообщение
Hahahoj

Site Admin


Пол: Пол:Мужской
Возраст: 44
Зарегистрирован: 08.10.2008
Сообщения: 1848

Группы: 
[ Команда сайта ]
[Модераторы Модераторы ]


СообщениеДобавлено: Пн Апр 25, 2011 4:50 pm    Заголовок сообщения: Ответить с цитатой

Меня смущает не это, там всё в порядке, а скорее флаги совместимости:

Код:
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


У тебя, кстати, результат тот же.

_________________
Просто Вовк
Вернуться к началу
Посмотреть профильHahahoj сейчас оффлайн  Отправить личное сообщение
BiSe Trojanov

Постоялец


Пол: Пол:Мужской
Возраст: 28
Зарегистрирован: 21.04.2011
Сообщения: 18
Откуда: Казань
Группы: Нет

СообщениеДобавлено: Вт Апр 26, 2011 6:01 am    Заголовок сообщения: Ответить с цитатой

Уф, 7 часов мытарств с SDL принесли плоды. Заставил работать event'ы и сделал многопоточность. Через sdl_createthread ни в какую не получилось заставить работать, собрал тупо через Паскалевский TThread, работающий через libPThread.so. Сейчас займусь TTF и минимальный SDL будет готов.
Вернуться к началу
Посмотреть профильBiSe Trojanov сейчас оффлайн  Отправить личное сообщение
ainu

Местный



Возраст: 30
Зарегистрирован: 13.11.2010
Сообщения: 133

Группы: Нет

СообщениеДобавлено: Чт Апр 28, 2011 11:02 am    Заголовок сообщения: Ответить с цитатой

А SDL_joystick работает?
Вернуться к началу
Посмотреть профильainu сейчас оффлайн  Отправить личное сообщение
BiSe Trojanov

Постоялец


Пол: Пол:Мужской
Возраст: 28
Зарегистрирован: 21.04.2011
Сообщения: 18
Откуда: Казань
Группы: Нет

СообщениеДобавлено: Чт Апр 28, 2011 12:48 pm    Заголовок сообщения: Ответить с цитатой

ainu писал(а):
А SDL_joystick работает?
Внутри архива пример работы с SDL. Джойстик опрашивается великолепно одной функцией. Вот что бы тачскрин опрашивать, пришлось усложнить архитектуру и читать ивенты.
Вернуться к началу
Посмотреть профильBiSe Trojanov сейчас оффлайн  Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов GP2X Community -> Программирование: Консоли GP2X F100 F200 Wiz Caanoo Часовой пояс: GMT + 3
На страницу 1, 2  След.
Страница 1 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы




Powered by phpBB © 2001, 2005 phpBB Group

Locations of visitors to this page