AMIGA-Magazin · Ausgabe 7/04 · Praxis: Programmierung unter »AmigaOS 4«

Aktuelles Heft 7/04

Entwicklungshelfer

Auf den folgenden Seiten wollen wir Ihnen zeigen, wie eigene Programme für »AmigaOS 4« mit dem neuen SDK zu kompilieren sind. Dieser kleine Artikel soll den Auftakt für weitere Artikel zur Programmierung unter AmigaOS 4 bilden.

von Michael Christoph

Los geht´s:
Mit einem Klick auf das Icon kann die SDK-Installation für »AmigaOS 4« beginnen.

Bevor das Kompilieren beginnen kann, muss erst einmal ein neuer Compiler her und natürlich auch installiert, bzw. eingerichtet werden. Die Developer-CD bringt alles mit, was nachfolgend benötigt wird. Als Compiler steht der »gcc« in Version 2.95 und 3.4.0 zur Verfügung. Eine integrierte Entwicklungsumgebung ist nicht vorhanden. Der Compiler lässt sich vermutlich aber in GoldEd integrieren. Zum Programmieren reicht aber auch jeder beliebige Editor und zum Kompilieren ein Shell-Fenster.

Das SDK (Software Developer Kit) für AmigaOS 4 ist auf der Prerelease-CD von AmigaOS 4 enthalten. Diese sollten allen »AmigaOne Early Bird«-Besitzern bereits zugestellt sein. Wer noch nicht über einen AmigaOne verfügt, aber trotzdem schon mal seine Programme vorbereiten will oder auch einfach nur hineinschnuppern möchte, kann sich direkt mit Hyperion Entertainment in Verbindung setzen (http://www.hyperion-entertainment.biz).

Compiler-Installation
Die Frage müsste eigentlich lauten, mit welcher Umgebung soll das Programm kompiliert werden. Zur Auswahl steht eine PPC-Version für die Verwendung unter AmigaOS 4 und eine 68k-Version. Letztere ist für den Einsatz mit AmigaOS 3.x gedacht und ist ein so genannter Cross-Compiler. Der PPC-, bzw. Cross-Compiler erzeugt ein Programm, das nicht unter AmigaOS 3.x ausgeführt werden kann. In unserem Fall ist das Ergebnis ein ELF-Binary, mit dem ein 68k-Prozessor nichts verarbeiten kann. Man sollte dem nativen Compiler für AmigaOS 4 den Vorzug geben.

Erster Test:
Das kleine Programm »HelloWord.c« im Editor und der passende Compileraufruf in der Shell.
Mittlerweile gibt es auch ein komplettes Archiv mit Installer. Dort kann ausgewählt werden, welche Komponenten installiert werden sollen. Im ausgewählten Pfad wird dabei ein Verzeichnis SDK erzeugt, auf das ein Assign angelegt wird. Alternativ darf man auch den Eintrag in der user-startup-Datei ergänzen. Werden alle Komponenten installiert, sind später 200 MByte mehr an Daten auf der Festplatte zu finden. Informationen zu den einzelnen Komponenten lesen Sie im Kasten »SDK-Komponenten«.

Die Installation von »Basic Documentation and Autodocs« enthält auch alle benötigten Amiga-Header-Dateien und die Autodocs (englischsprachige Beschreibungen für alle Funktionen). Nach der Installation sind diese unter »SDK:Documentation/AutoDocs« zu finden. Die meisten Dateien wurden schon auf den aktuellen Stand gebracht (V50), jedoch fehlen teilweise noch Informationen zu den neueren Bibliotheken. Die notwendigen Includes sind in SDK:Include/include_h zu finden. Der gcc sucht sie hier automatisch, bei Verwendung anderer Compiler ist der Include-Pfad anzupassen.

Hallo Welt
Den Klassiker »Hello World« findet man garantiert in jedem Lehrbuch für die Programmiersprache C. Er wird aber auch gerne für die ersten Gehversuche mit einem neuen Compiler benutzt. Der folgende Sechszeiler ist unsere Version:

#include <proto/dos.h>

int main()
{
  IDOS->PutStr("Hello World\n");
  return( 0 );
}

Interface und Library

Nach wie vor werden in AmigaOS 4 »shared libraries« eingesetzt, um Funktionen des Betriebssystems aufzurufen. Bei 68k-Programmen erfolgte dies über eine Sprungtabelle. Beim »PPC nativ« Compilaten hat man allerdings darauf keinen Zugriff. Jetzt stellt die Library so genannte Interfaces zur Verfügung. Das Interface ist im Endeffekt auch nichts anderes, als die alte Sprungtabelle. Neu ist allerdings, dass eine Library mehrere dieser Interfaces bereitstellen kann. Bei den Systembibliotheken ist das Standardinterface mit »main« benannt und in der Version 1.0 verfügbar.


struct DOSBase  *DOSBase;
struct DosIFace *IDOS;

/* Library öffnen */
if(DOSBase = IExec->OpenLibrary(¿dos.library",50))
{
  /* Interface ermitteln */
  if(IDOS = (struct DosIFace *) IExec->GetInterface(DOSBase,"main",1,NULL))
  {
    /* ab hier kann auf Dos-Funktionen */
    /* zugegriffen werden */
    IDOS->PutStr("Dos Interface steht zur Verfügung.\n");

    /* Interface freigeben */
    IExec->DropInterface((struct Interface *)IDOS);
  }
  
  /* Library schließen */
  IExec->CloseLibrary(DOSBase);
}

Das Dos-Interface wird bereits vom Startup-Code zur Verfügung gestellt und muss daher nicht noch einmal extra von der Application geöffnet werden! Das Beispiel kann aber einfach durch Intuition für die »intuition.library« ersetzt werden. Die normalen Libraries haben nur ein main-Interface. Ausnahmen bilden »exec« (main 1.0, MMU 1.0, debug 1.0) und »expansion« (main 1.0, pci 1.0).

Tippen Sie den Quelltext in einem beliebigen Editor und speichern das Ergebnis unter HelloWorld.c ab. Danach geht`s in der Shell mit dem Compileraufruf weiter:

gcc HelloWorld.c -o HelloWorld

Wurde alles fehlerfrei eingegeben, steht nach wenigen Sekunden das ausführbare Programm zur Verfügung, das über die Shell gestartet werden kann.
Wie auch schon früher, stehen alle Funktionen von Exec und Dos zur Verfügung. Die entsprechenden Libraries/Interfaces werden bereits vom Startup-Code geöffnet. Auffallend am Beispiel ist, dass die Dos-Funktion der Library-Interface-Zeiger vorangestellt ist. Für Exec-Funktionen lautet er übrigends IExec.

Umsetzung der eigenen Programme
Bevor Sie sich jetzt an die Umsetzung/Anpassung der eigenen Programme machen, sollten Sie zuerst einen Blick auf die mitgelieferten Beispiele werfen und mithilfe der Autodocs die neuen Funktionen erforschen. Damit bekommen Sie dann ein Gefühl für die neuen Möglichkeiten.
Zum Kompilieren von Alt-Sourcen wird man sicher nicht zuerst sämtliche Funktionsaufrufe (Calls) anpassen wollen. Auch daran haben die Entwickler des SDK gedacht. Mit den Anweisungen

-d__USE_INLINE__

als Compileraufruf, kann weiterhin die alte Aufrufnotation verwendet werden.

Alternativ kann auch
#define __USE_INLINE__
im Quellcode eingefügt werden.
Der Preprozessor setzt dann intern die entsprechenden Basiszeiger. Gelinkt werden muss dann allerdings mit der libauto.a- Bibliothek (-l auto), damit auch die Interfaces bereitgestellt werden (z.B. für Intuition, Graphics, ect.).

Das Neu-Kompilieren bestehender »Alt-Sourcen« sollte damit kein Problem mehr darstellen. Je nachdem welcher Compiler früher verwendet wurde, sind allerdings Anpassungen im Sourcecode vorzunehmen. Mögliche Gründe sind fehlende Includes oder fehlende Typcasts. Den Compilern beigelegten Include-Dateien entsprechen teilweise nicht den offiziellen Versionen (speziell: prama/ pramas/proto). Ältere C-Compiler interessierten sich auch nicht für die Typen von Zeigern.

Wurde also ein struct Window-Zeiger von OpenWindow() zurückgeliefert, konnte dieser einem struct Screen * zugewiesen werden. Speziell AllocVec() bzw. das ältere AllocMem() sind hier Kandidaten, da diese einen VOID-Zeiger liefern, die Variablen aber vom Typ UBYTE *, ULONG * etc. sind. Hier sind also am ehesten Nacharbeiten zu erwarten. Wer früher bereits mit »StormC« oder »MaxonC« Programme in C++ geschrieben hat, kennt die strengen Typprüfungen bereits und dürfte kaum Anpassungen zu erwarten haben. Bei Zuweisungen von char-Variablen unterscheidet der gcc außerdem sehr genau zwischen singned und unsigned (vorzeichenbehaftet und vorzeichenlos). Ein Mischen von UBYTE* und STRPTR in C++ Code nimmt der gcc-Compiler daher sehr übel.

In den nächsten Ausgaben des Amiga Magazins, gehen wir dann auf weitere Besonderheiten bei der Programmierung mit AmigaOS4 und bei der Nutzung des neuen SDKs ein.


SDK-Komponenten
Beschreibung Datei
Basic Documentation und Autodocs basedocs tar.bz2
Beispielprogramme mit Quellen examples tar.bz2
GNU C Compiler 2.95.3 (65 MByte) gcc.tar.bz2
GNU C Compiler 3.4.0 BETA (100MByte) gcc34.tar.bz2
GCC-Dokumentation gccdoc.tar.bz2
Shared-C-library (Ersatz für die clib-Bibliothek) newlib.tar.bz2
GDB-Dokumentation (Debugger) gdbdocs.tar.bz2
VBCC-C-Compiler vbcc.tar.bz2
CIB2-Sourcecode (Ansi-C/Amiga/Netzwerk-Bibliotheken) clib2src.tar.bz2

lb



Ergänzende Grafiken:
Komfortable Auswahl der zu installierenden Komponenten. Ein Minimal-Enforcer im Betriebssystem verhindert, daß fehlerhafte Programme Schaden anrichen. Der Gimp Reaper erlaubt auch das Erzeugen von "Crash" Protokollen (über den Schalter 'More' zu erreichen).


Hauptseite © 2004 All Rights Reserved. Alle Rechte vorbehalten Franzis' Verlag GmbH
Veröffentlichung und Vervielfältigung nur mit schriftlicher Genehmigung des Verlags

Kommentare, Fragen, Korrekturen und Kritik bitte an Webmaster AMIGA schicken.
Zuletzt aktualisiert am 9. Juli 2004, Michael Christoph.