eXec.plMAGAZYN UŻYTKOWNIKÓW KOMPUTERÓW AMIGA
MAGAZYN UŻYTKOWNIKÓW KOMPUTERÓW AMIGA

środa, 18. października, 2017, 13:22

Dodano: 2013-06-15, Autor: Spot (tłumaczenie - Konrad Rojek), Kategoria: Oprogramowanie, Liczba wyświetleń: 3381

A A A

Spota kurs programowania dla początkujących, cz. 1

Część 1

  1. Po co mam to czytać? Przecież nie potrafię programować!
  2. Co portować?
  3. Dostęp do aktualnego SDK
  4. Podstawy
  5. Konfigurowanie środowiska
  6. Konfigurowanie cross-kompilatora
  7. Błędy konfigurowania środowiska
  8. Wyjaśnienie komunikatów o błędach

Część 2

  1. Naprawianie błędów
  2. Błędy linkowania?
  3. Konwersja ścieżek unixowych do amigowych
  4. Problemy 'LValue'
  5. Obsługa właściwej kolejności bajtów (ENDIAN)
  6. Definicje
  7. Sztuczki i kruczki

Część 3

  1. Konwersja windowsowego makefile na amigowy
  2. Naprawianie źródeł
  3. Sprawdzanie obecności bibliotek
  4. Tworzenie GUI w oparciu o Emperor (ALPHA!)
  5. Kompilowanie aplikacji SDL/GL
  6. Dodawanie muzyki do aplikacji SDL
  7. POMÓŻ MI!
  8. Kontakt
  9. Podziękowania
  10. SPOTa Wyzwanie Portowania
  11. WIP

1. Po co mam to czytać? Przecież nie potrafię programować!

Cóż, tak na prawdę, to ja też nie! :) Jestem po prostu upartym prykiem. Spójrzcie na mnie: wniosłem ponad 500 pozycji (stan na 2009 r. - przyp. eXec) na os4depot.net. Kompilacja wieloplatformowych programów dla AmigaOS 4.0 nie jest aż tak trudna. Ludzie!!! Jeśli ja to potrafię, to wy tym bardziej! Będziecie biegać w podskokach, tak jak zresztą i ja, kiedy uda się wam skompilować swoją pierwszą aplikację SDL!!! Na swoją obronę powiem tylko, że wiele rzeczy musiałem wypracować samodzielnie, tymi "trudniejszymi" sposobami! :)
/Spot

2. Co portować?

Sprawdźcie jakie dodatkowe pakiety wymagane są przez przenoszone oprogramowanie. Nie można tak po prostu przekompilować aplikację, jeśli jest ona oparta o obce GUI, takie jak GTK. Aplikacje QT, SDL czy GL są obiecującym tropem, ale warto jeszcze zwrócić uwagę na sposób obsługi audio. Oto kilka dobrych źródeł otwartego oprogramowania wykorzystującego SDL, GL czy Allegro:

  • http://www.happypenguin.org
  • http://www.allegro.cc
  • http://www.libsdl.org

3. Dostęp do aktualnego SDK

Pakiet SDK można pobrać ze strony Hyperionu, z sekcji download. Od czerwca 2012 aktualizacja tego pakietu jest także elementem AmiUpdate (serwer: www.amiupdate.net/SdkServer.) - przyp. eXec.

Wiele składowych SDK nie było oficjalnie aktualizowanych od czasu udostępnienia danej wersji. Pakiet programistyczny warto odświeżyć wgrywając dodatkowe elementy. Jest to szczególnie ważne dla aplikacji SDL, ponieważ standardowe biblioteki wymagały poprawek.

Niezbędnik

Pobierz z http://www.os4depot.net

  • ABC-Shell
  • Make
  • Diffutils
  • M4
  • AWK
  • YACC
  • GREP
  • GNU core utilities
  • Texinfo

Pobierz clib2 z http://sourceforge.net/project/showfiles.php?group_id=115224

Języki programowania

Pobierz z http://www.os4depot.net

  • Free Pascal Compiler
  • Perl 5.8.5
  • Lua - efektywny, skryptowy język programowania

Różności

Pobierz z http://www.os4depot.net

  • Boost C++ libraries
  • Expat C library do parsowania XML
  • GNU termcap library

Dodatkowe biblioteki

Pobierz z http://www.os4depot.net

  • LibCurl
  • libFreetype2
  • libJPEG
  • libPNG
  • libTIFF
  • libODE
  • libOGG
  • libOpenSSL
  • libPNG
  • libSDL_gfx
  • libSDL_perl
  • libSDL_ttf
  • libSDL_net
  • libVorbis
  • libXML2.

4. Podstawy

Pierwszą umiejętnością, którą trzeba opanować jest budowanie własnych programów (projektów). Jeśli w katalogu głównym projektu znajduje się plik o nazwie "configure", to znaczy, że należy opracować konfigurację środowiska przeznaczoną dla swojej platformy. Można tego dokonać poprzez ABC-Shell, wywołany poleceniem "sh" powłoki. Procedura postępowania jest opisana w kolejnym rozdziale.

Poprawna konfiguracja projektu pozwala zająć się kompilowaniem. Możesz zbudować swój program poleceniem 'GMAKE'.

Jeśli plik 'Configure' nie występuje, znajdź plik o nazwie 'Makefile'. Zmień go tak, by odpowiadał specyfice AmigaOS 4 i zbuduj projekt poleceniem "GMAKE".

Po poprawnej kompilacji I zlinkowaniu składowych można rozpocząć testy portu. Dość częstą przyczyną niepowodzeń są problemy z odnalezieniem plików danych. Rozwiązaniem jest poprawienie ścieżek dostępu, co zostało opisane w odpowiednim rozdziale.

Po zlinkowaniu bibliotek warto wywołać polecenie "GMAKE INSTALL" by skopiować niezbędne składowe we właściwe miejsca.

OK, skończone! Wrzucamy binarkę na OS4Depot i Aminet!

5. Konfigurowanie środowiska

Konfiguracja dołączania bibliotek

Przy konfiguracji dołączania bibliotek należy wykorzystać dodatkowy parametr: "--includedir=", by wskazać gdzie znajdują się zainstalowane pliki. W tym miejscu można wykorzystać katalog /common/, jeśli projekt konfigurowany jest pod clib2 i newlib. Nazwę tę można zmienić na /newlib/ albo /clib2/ jeśli wykorzystywana jest tylko jedna z nich. Zalecane jest, jeśli możliwe, przygotowanie projektu dla obu wersji. Oto przykład polecenia konfiguracyjnego:

./configure --disable-dependency-tracking --bindir=/SDK/Local/C --prefix=/SDK/Local --libdir=/SDK/Local/newlib/lib LIBS="-lauto -lunix"

Tajniki konfigurowania

Niektóre skrypty konfiguracyjne po prostu nie chcą działać zgodnie z oczekiwaniami.. Oto rzeczywisty przykład, kiedy musiałem podrasować skrypt, wprowadzając dodatkowe flagi:

Xmoto konfigurowane bez Automake (zwróć uwagę na dostosowanie do ścieżek AmigaOS: --srcdir=/Scene/Coding/xmoto-0.2.4):

./configure --disable-dependency-tracking --srcdir=/Scene/Coding/xmoto-0.2.4  --datadir=/PROGDIR/ --bindir=/SDK/Local/C --prefix=/PROGDIR/  CFLAGS="-mcrt=clib2 -DMINIGL" CXXFLAGS="-mcrt=clib2 -DMINIGL" LIBS="-mcrt=clib2 -lGL -lGLU -llua -lode -lSDL_gfx -lSDL_net -lSDL_image -ltiff -lpng -ljpeg -lz -lSDL_mixer -lsmpeg -lm -lvorbisfile -lvorbis -logg -lstdc++ -lSDL_ttf -lfreetype -lz -lsdlmain -lsdl -lauto -lpthread -lm -lunix" --with-sdl-prefix=/sdk/local/clib2

Oraz kilka ręcznych zmian do Xmoto Makefile:

remove: $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) ... from LINK
remove: $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) ... from CXXLINK

libXML:

./configure --disable-dependency-tracking --bindir=/SDK/Local/C --prefix=/SDK/Local --libdir=/SDK/Local/clib2/lib CFLAGS=-mcrt=clib2 CPPFLAGS=-mcrt=clib2 -DLIBXML_DOTTED_VERSION=2.6.26 -DLIBXML_TEST_VERSION=20626 -DLIBXML_VERSION=20626 -DLIBXML_VERSION_STRING=20626" CXXFLAGS=-mcrt=clib2 LIBS=-lunix LDFLAGS=-mcrt=clib2

GNGEO: ścieżka UNIX'owa została poprawiona na końcu (pkgdatadir=/PROGDIR/data)

./configure --disable-dependency-tracking --bindir=/SDK/Local/C --prefix=/SDK/Local --libdir=/SDK/Local/clib2/lib CFLAGS=-mcrt=clib2 CPPFLAGS=-mcrt=clib2 CXXFLAGS=-mcrt=clib2 LIBS="-lauto -lunix" LDFLAGS=-mcrt=clib2 pkgdatadir=/PROGDIR/data

Mała podpowiedź

Polecenie konfiguracyjne powinno być zapisane w pliku tekstowym. W ten sposób można je łatwo edytować ponownie, np. tak: 'sh mybuildscript.sh'

Trzeba pamiętać, by przed ponownym wywołaniem skryptu wykonać 'gmake distclean' albo 'rm -f config.cache' (po unix'owemu) lub 'delete config.cache' (po amigowemu) by zresetować proces konfiguracji.

Opis wybranych flag GCC

LDLAGS="-lunix" - włącza obsługę Linuksowego formatu zapisu ścieżek katalogów. Aplikacje Linuksowe często wykorzystują pełną ścieżkę do wskazania plików danych, jednak AmigaOS interpretuje je trochę inaczej. Przykładowa ścieżka taka jak "/usr/local/app" będzie znaczyć: przejdź jeden poziom wyżej i tam znajdź katalog "usr/local/app".

--prefix=PROGDIR: - uzupełnia wszystkie ścieżki o PROGDIR: Razem z opcją -lunix pozwala wykorzystywać linuksowe ścieżki podczas kompilowania oraz amigowe przy uruchamianiu pliku wykonywalnego.

Uwaga, deklaracja opcji -lunix spowoduje, że program będzie prawdopodobnie pytał się o przypisania (assign) dla USR: oraz ETC:.

6. Konfigurowanie cross-kompilatora

Kompilacja programów i bibliotek dla AmigaOS4 na innych platformach jest możliwa. W tej części poradnika zakładamy, że cross-kompilator będzie się nazywał ppc-amigaos-gcc, a nazwy wszystkich innych narzędzi będą poprzedzone przedrostkiem: "ppc-amigaos".

Ogólnie, możemy wyróżnić dwa typy skryptów konfiguracyjnych: takie, które obsługują cross-kompilację oraz takie, które tego nie robią.

Przygotowanie skryptu obsługującego cross-kompilowanie polega na zdefiniowaniu prefixu identyfikującego narzędzia danej platformy. Wykorzystywany jest w tym celu argument "host". Taka definicja może wyglądać następująco:
./configure --host=ppc-amigaos

Skrypt obsługujący cross-kompilację będzie wyszukiwał wskazane narzędzia. W takim przypadku pojawią się informacje o postaci zbliżonej do:

 Checking for gcc... ppc-amigaos-gcc
Checking for ranlib... ppc-amigaos-ranlib
Checking for strip... ppc-amigaos-strip
...itd.

Natomiast jeśli skrypt konfigurujący wygeneruje następujący rezultat:

Checking for gcc... gcc
Checking for ranlib... ranlib
Checking for strip... strip
...itd.

To znaczy, że nie obsługuje on cross-kompilacji i należy samodzielnie wskazać jakie narzędzia powinny być wykorzystane. Można to zrobić w następujący sposób:

CC=ppc-amigaos-gcc CXX=ppc-amigaos-g++ RANLIB=ppc-amigaos-ranlib STRIP=ppc-amigaos-strip ./configure

7. Błędy konfigurowania środowiska

Dobrym nawykiem jest dołączenie następującego argumentu do polecenia konfigurującego: --srcdir=/DH1/Ścieżka/Do/MojegoProjektu/
Rozwiąże to WIELE problemów związanych z konfiguracją.

Wyjaśnienie błędów:

a) configure: error: unrecognized option: -lSDL_net
Try `./configure --help' for more information.

Rozwiązanie: usunięcie bibliotek z polecenia konfigurującego (LIBS="-lSDL_gfx...")

b) configure: error: C compiler cannot create executables
Rozwiązanie: AmigaOS nie wspiera flag -pipe oraz s, należy je ze skryptu konfigurującego (pliku o nazwie 'Configure').

Warto pamiętać, by w przypadku cross-kompilacji umieścić w skrypcie opcję --host=ppc-amigaos. Jej wykorzystanie przełączy skrypt w odpowiedni tryb i zapobiegnie próbie uruchomienia wygenerowanych pików wykonalnych.

c) checking for png_create_read_struct in -lpng... no
Rozwiązanie: linkujemy bilioteki w sposób statyczny, i musimy dokładnie określić co powinno zostać uwzględnione. Należy zlokalizować w skrypcie następującą linię:
LIBS="-lpng $LIBS"

libPNG do poprawnego działania potrzebuje dodatkowych bibliotek. Można je dodać w następujący sposób:
LIBS="-lpng -lz $LIBS"

Problem ten można rozwiązać także bez zmiany pliku konfiguracyjnego, dodając LDFLAGS="-lz" przed './configure'. Wywołanie przyjmie następującą postać:
LDFLAGS="-lz" ./configure

d) Mam błędy powodowane przez libTIFF
checking for TIFFClientOpen in -ltiff... no

Rozwiązanie: analogicznie do libpng. Biblioteka ta wymaga dodatkowych obiektów do poprawnego działania. Deklaracja:
LIBS="-lTIFF $LIBS"
powinna wyglądać następująco:
LIBS="-lTIFF -lz $LIBS"

Wykorzystanie LDFLAGS, tak jak w przypadku libpng, również naprawi ten błąd.

e) checking for IMG_Load in -lSDL_image... no
Rozwiązanie: analogicznie do powyższych. Biblioteka SDL_image wymaga dodatkowych komponentów. Prawidłowe wywołanie przyjmie postać:
LIBS="-lSDL_image -ltiff -lpng -ljpeg -lz $LIBS"

Alternatywnie, bez zmiany skryptu konfiguracyjnego, można wykorzystać: LDFLAGS="-ltiff -lpng -ljpeg -lz" przed './configure'.

f) checking for Mix_OpenAudio in -lSDL_mixer... no
Rozwiązanie: dołączenie dodatkowych bibliotek.
LIBS="-lSDL_mixer -lsmpeg -lm -lvorbisfile -lvorbis -logg -lstdc++ $LIBS"

Bez zmiany pliku konfiguracyjnego:
LDFLAGS="-lsmpeg -lm -lvorbisfile -lvorbus -logg -lstdc++" before the './configure'.

g) Ten sam problem często występuje w przypadku SDL_ttf
Rozwiązanie: należy dodać -lfreetype and -lz. Uzupełnienie skryptu dla tego elementu niech będzie ćwiczeniem. Poza skryptem, brakujące składowe można zadeklarować tak jak we wcześniejszych przykładach:
LDFLAGS="-lfreetype -lz" befor the './configure'.

Jeśli dodanie brakujących składowych nie rozwiązało problemu, może to oznaczać, że w SDK nie ma potrzebnych plików. W moim przypadku, w zasobach OS4Depot brakowało bibliotek Freetype-config i smpeg-config. Skompilowałem je samodzielnie, ale miejmy nadzieję, że autorzy Amiga OS 4 dostrzegą ten brak.

Innym częstym problemem są niewłaściwe ścieżki do plików .la, znajdujących się w SDK:Local/newlib/lib albo SDK:Local/clib2/lib. Sprawdź, czy są one skonfigurowane poprawnie. W tym celu zlokalizuj następujące linie:

# katalog, w którym biblioteki muszą być zainstalowane: libdir='/SDK/Local/newlib/lib'

Oto przykład poprawnego wpisu: libdir='/SDK/Local...' Ten jest błędny: '/USR/Local...'

Jeśli skrypt wciąż nie działa, a jesteś pewny, że biblioteki są zainstalowane, spróbuj usunąć całą sekcję powodującą błąd. Nie jest to zalecane działanie, ale jeśli nie ma innego wyjścia.

Teraz jesteśmy gotowi by zbudować projekt. Portując aplikacje unix'owe musimy wpisać GMAKE. MAKE jest przeznaczony tylko dla amigowych projektów.

8. Wyjaśnienie komunikatów o błędach

a) Error:
No return statement in function returning non-void

Co ten komunikat oznacza?
Brak słowa kluczowego "return" w funkcji, która go potrzebuje.

Z technicznego punktu widzenia nie jest to błąd, a ostrzeżenie (chyba, że wykorzystana została opcja -Werror). Każda funkcja, która nie została zadeklarowana jako "void", powinna zwracać jakąś wartość za pomocą słowa kluczowego "return". Wymóg ten dotyczy też wszystkich rozgałęzień kodu. Dla zainteresowanych, oto przykład wystąpienia oraz rozwiązania dla tego komunikatu:

 int bla(int input)
 {
   int i=0;

   if (input > 0)
   {
     i++;
     return i;
   }
 }

Funkcja powyżej, jak widać, zwraca wartość tylko jeśli zostanie spełniony warunek "if input > 0. Brakuje drugiej deklaracji "return", w przypadku gdy warunek nie zostanie spełniony. Warto też się zastanowić JAKA powinna być zwracana, brakująca wartość. Najbezpieczniejszym założeniem jest, że zwrócone powinno być 0 (zero). Rozwiązaniem powyższego przykładu jest:
- albo przeniesienie 'return i;' poza sekcję "if"
- albo dodanie return 0 poza tą sekcją

Poprawki te wyglądają następująco:

int bla(int input)
 {
   int i=0;

   if (input > 0)
   {
     i++;
   }
   return i;
 }

ALBO:

int bla(int input)
 {
   int i=0;

   if (input > 0)
   {
     i++;
     return i;
   }
   return 0;
 }

b) Error:
Control reaches end of non-void function

Co ten komunikat oznacza?
Kompilator dotarł do końca funkcji, która powinna mieć "return", ale go nie znalazł.

c) Error:
May be used uninitialized in this function

Co ten komunikat oznacza?
Zmienna nie została zainicjowana.

Kompilator przewiduje, że wykorzystywana zmienna może w danym kontekście nie mieć jeszcze przypisanej wartości. Najprostszym rozwiązaniem jest jej jawne zainicjowanie do wartości domyślnej, w miejscu deklaracji. Zmiennym liczbowym najczęściej przypisuje się 0, a string'om (i wskaźnikom) NULL.

d) Error:
Warning: implicit declaration of function 'blah blah'

Co ten komunikat oznacza?
Kompilator, w danym kontekście kodu, nie jest w stanie znaleźć funkcji o podanej nazwie. Jeśli jest już ona utworzona w innej części projektu (innym pliku), to należy umieścić deklarację jej nazwy w dołączanym pliku nagłówkowym.

Spot (tłumaczenie - Konrad Rojek)
zobacz inne nasze artykuły »



AmigaOS.pl

Polecamy
Najpopularniejsze
eXec blog

Świat poza Amigą: