Aktualności Forum Graffiti Publicystyka Teleport
  • Cross-kompilacja programów C dla AmigaOS w systemach rodziny Unix

03.08.2009 06:21, autor artykułu: Radosław "strim" Kujawa
odsłon: 5293, powiększ obrazki, wersja do wydruku,

Wstęp

Proces tworzenia programów, które mają być przenośne na wiele platform jest skomplikowany. Zwłaszcza problematyczna jest faza testowania oprogramowania. Twórca jest zmuszony do ciągłej kompilacji swego programu, i uruchamiana go na wszystkich systemach, pod które pisze. Co w sytuacji gdy piszemy program, który ma być przenośny np. na systemy uniksowe, Windows i AmigaOS? Za każdym razem musimy kopiować (lub aktualizować z repozytorium) kod źródłowy na Amigę bądź do emulatora UAE i tam dokonywać kompilacji - co wydłuża cały proces rozwoju oprogramowania.

Przygotowanie plików wynikowych na jednym systemie znacznie upraszcza sprawę. Dla Windows dostępne jest środowisko AmiDevCpp, w skład którego wchodzą wszystkie narzędzia, potrzebne do cross-kompilacji oprogramowania dla Amigi. Niestety, brak podobnego środowiska dla Unixów - w tym, co raz bardziej popularnego ostatnio Linuksa.

Artykuł ten omawia sposób tworzenia środowiska dla cross-kompilacji programów C dla AmigaOS 3.x (m68k) w systemach rodziny Unix. Autor niniejszego artykułu wykorzystał dystrybucję Linuksa Fedora 11 x86_64 oraz kompilator gcc 4.4.0. Jednakże przedstawiona tu procedura jest prawdopodobnie aplikowalna dla dowolnego systemu rodziny Unix (autor przeprowadził test także na NetBSD 5.0 powerpc).

Do stworzenia środowiska kompilacji programów dla AmigaOS 3.x, potrzebne będą nam następujące komponenty: kompilator, linker, asembler, target (biblioteki docelowego systemu) oraz NDK (pliki nagłówkowe, dokumentacja itp.). Wykorzystamy kompilator VBCC autorstwa Volkera Barthelmanna, asembler vasm, linker vlink, target dla AmigaOS, które są dziełami Franka Wille oraz oficjalny NDK 3.9 H&P. Źródła można pobrać na następujących stronach:

Budowanie

W tym momencie warto określić dwie lokalizacje w systemie plików: katalog, w którym będziemy budować nasze środowisko oraz katalog, do którego zainstalujemy je. W tym celu ustawmy zmienne BUILD_DIR oraz INSTALL_DIR.

$ BUILD_DIR=~/amiga-cross-build
$ INSTALL_DIR=/opt/amiga-cross

Jeśli katalog BUILD_DIR nie istnieje, należy go utworzyć i umieścić w nim pobrane archiwa. Następnie należy je wypakować:

$ cd ${BUILD_DIR}
$ tar -zxf vasm.tar.gz
$ tar -zxf vbcc.tar.gz
$ tar -zxf vlink.tar.gz
$ lha -xq2 vbcc_target_m68k-amigaos.lha
$ unlzx -x NDK3.9.lzx

Jeżeli Twoja dystrybucja Uniksa nie dostarcza UnLZX, to stąd możesz pobrać ten program skompilowany dla Linuksa i386.

Budowanie środowiska rozpoczniemy od skompilowania asemblera m68k.

$ cd ${BUILD_DIR}/vasm

Proces kompilacji zależny jest od ustawienia dwóch zmiennych środowiskowych - CPU oraz SYNTAX. Określają one dla jakiej architektury i jakiej składni asembler będziemy budować.

$ CPU=m68k
$ SYNTAX=mot
$ export CPU SYNTAX
$ make

Jeżeli posiadamy w naszym systemie działający kompilator, powinniśmy otrzymać gotowy asembler. Uruchomienie go na tym etapie nie przyniesie sensownych rezultatów, ale dzięki temu będziemy w stanie sprawdzić czy zbudował się on poprawnie.

$ ./vasmm68k_mot
vasm 1.4a (c) in 2002-2009 Volker Barthelmann
vasm M68k/CPU32/ColdFire cpu backend 1.1a (c) 2002-2009 Frank Wille
vasm motorola syntax module 3.0 (c) 2002-2009 Frank Wille
vasm test output module 1.0 (c) 2002 Volker Barthelmann

fatal error 16: no input file specified
aborting...

Kolejnym niezbędnym nam komponentem jest linker, który także musimy zbudować ze źródeł.

$ cd ${BUILD_DIR}/vlink
$ mkdir objects

Jeżeli vlink zbudować chcemy na systemie 64-bitowym, należy wyedytować plik Makefile i w linii CONFIG zmienić opcję -DTYPES32BIT na -DTYPES64BIT. W tym momencie, możemy wydać już komendę, która zbuduje linker:

$ make

Ostatnim pozostałym do zbudowania elementem jest sam kompilator C.

$ cd ${BUILD_DIR}/vbcc
$ mkdir bin
$ TARGET=m68k
$ export TARGET
$ make

Program make zada serię pytań, dotyczących rozmiarów typów danych, z których korzysta kompilator. Zaproponowane wartości domyślne będą poprawne w 99% przypadków, więc należy się na nie zgodzić. W wyniku kompilacji w katalogu bin powinny pojawić się 4 pliki wykonywalne:

$ ls bin/
dtgen vbccm68k vc vprof

Teraz czas zainstalować środowisko w lokalizacji docelowej:

$ cd ${BUILD_DIR}
$ sudo mkdir -p ${INSTALL_DIR}
Password: ...
$ sudo chown `whoami` ${INSTALL_DIR}
$ cp -R NDK_3.9 ${INSTALL_DIR}/
$ mkdir ${INSTALL_DIR}/vbcc
$ cp -R vbcc/bin ${INSTALL_DIR}/vbcc/
$ cp vasm/vasmm68k_mot ${INSTALL_DIR}/vbcc/bin/
$ cp vasm/vobjdump ${INSTALL_DIR}/vbcc/bin/
$ cp vlink/vlink ${INSTALL_DIR}/vbcc/bin
$ cp -R vbcc_target_m68k-amigaos/targets/ ${INSTALL_DIR}/vbcc/

Ostatnim krokiem, niezbędnym do uzyskania działającego środowiska, jest stworzenie pliku konfiguracyjnego dla kompilatora. Możemy w tym celu skopiować i wyedytować przykładowy plik dołączony do targetu m68k-amigaos.

$ mkdir ${INSTALL_DIR}/vbcc/config
$ cp vbcc_target_m68k-amigaos/config/aos68k ${INSTALL_DIR}/vbcc/config/vc.config

Plik vc.config należy potraktować ulubionym edytorem.

$ vi ${INSTALL_DIR}/vbcc/config/vc.config

W pliku tym należy ustawić ścieżki do katalogów z plikami nagłówkowymi (zamienić vincludeos3:) oraz bibliotekami (zamienić vlibos3:). Ponadto trzeba zamienić amigową komendę delete na rm. Przykładowy plik konfiguracyjny może wyglądać tak:

-cc=vbccm68k -quiet %s -o= %s %s -O=%ld -I/opt/amiga-cross/vbcc/targets/m68k-amigaos/include/ -I/opt/amiga-cross/NDK_3.9/Include/include_h/
-ccv=vbccm68k %s -o= %s %s -O=%ld -I/opt/amiga-cross/vbcc/targets/m68k-amigaos/include/ -I/opt/amiga-cross/NDK_3.9/Include/include_h/
-as=vasmm68k_mot -quiet -Fhunk -phxass -opt-pea -opt-clr -opt-fconst %s -o %s
-asv=vasmm68k_mot -Fhunk -phxass -opt-pea -opt-clr -opt-fconst %s -o %s
-rm=rm %s
-rmv=rm -v %s
-ld=vlink -bamigahunk -x -Bstatic -Cvbcc -nostdlib -L/opt/amiga-cross/vbcc/targets/m68k-amigaos/lib /opt/amiga-cross/vbcc/targets/m68k-amigaos/lib/startup.o %s %s -lvc -o %s
-l2=vlink -bamigahunk -x -Bstatic -Cvbcc -nostdlib -L/opt/amiga-cross/vbcc/targets/m68k-amigaos/lib/ %s %s -o %s
-ldv=vlink -bamigahunk -t -x -Bstatic -Cvbcc -nostdlib -L/opt/amiga-cross/vbcc/targets/m68k-amigaos/lib/ /opt/amiga-cross/vbcc/targets/m68k-amigaos/lib/startup.o %s %s -lvc -o %s
-l2v=vlink -bamigahunk -t -x -Bstatic -Cvbcc -nostdlib -L/opt/amiga-cross/vbcc/targets/m68k-amigaos/lib/ %s %s -o %s
-ldnodb=-s -Rshort
-ul=-l%s
-cf=-F%s
-ml=500

Po dokładny opis powyższych zmiennych warto sięgnąć do instrukcji kompilatora VBCC. Dla typowego środowiska konieczna jest tylko zmiana odp. ścieżek. Do poprawnej pracy kompilatora potrzebne jest ustawienie zmiennej środowiskowej VBCC oraz dodanie katalogu bin do zmiennej PATH.

$ VBCC=/opt/amiga-cross/vbcc
$ PATH=${PATH}:${VBCC}/bin
$ export VBCC PATH

Powyższe ustawienie środowiska warto dorzucić do /etc/profile bądź ~/.bash_profile, aby nie trzeba było tego robić za każdym uruchomieniem nowej sesji terminala. Jeśli wszystko do tej pory przebiegło poprawnie, katalog ${BUILD_DIR} można usunąć.

Prosty przykład i test środowiska

W wybranym katalogu, najlepiej nowym i pustym, tworzymy plik main.c o następującej zawartości:


------------------------------------------
#include <stdio.h>
#include <exec/types.h>
#include <intuition/intuition.h>
#include <dos/dos.h>

#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/dos.h>

int main(void) {

        struct IntuitionBase *IntuitionBase = NULL;
        IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 0L);

        if (!IntuitionBase) {
                printf("Can't open intuition.libraryn");
        }

        printf("Hello Amiga World!n");

}
------------------------------------------

Kompilacji, asemblacji oraz linkowania dokonujemy poleceniem:

$ vc -o example main.c

Jeśli chcemy obejrzeć z jakimi parametrami wykonywane są poszczególne programy, możemy do polecenia vc dodać także parametr -v:

$ vc -v -o example main.c

W wyniku tego polecenia zbudowany zostanie plik wykonywalny example, gotowy do uruchomienia w AmigaOS - co potwierdzić możemy np. poleceniem file:

$ file example
example: AmigaOS loadseg()ble executable/binary

Cross-kompilacja Proces ten możemy z powodzeniem rozbić na dwa etapy - kompilacji oraz linkowania. Może być to przydatne, gdy kompilujemy program z więcej niż jednego pliku źródłowego, bądź też chcemy połączyć go ze statyczną biblioteką.

$ vc -c main.c
$ vc -o example main.o

Katalog, w którym pracujemy, można zamapować jako urządzenie AmigaOS w UAE celem wygodnego testowania zbudowanego programu. Ewentualnie można udostępnić go po sieci prawdziwej Amidze.

Dalsze kroki

Teraz można pokusić się o skonfigurowanie vbcc w naszym ulubionym zintegrwoanym środowisku programisty. Jest to temat na tyle obszerny, że zasługiwałby na opisanie w osobnym artykule. Autor bez większych problemów skonfigurował m.in. środowisko NetBeans.

 głosów: 1   
dodaj komentarz
Na stronie SCENA.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem