Serie: DOSBox unter Windows kompilieren 2/10

Diese Artikelserie zeigt auf, wie man unter Windows eine Entwicklungsumgebung mit Open Source basierten Programmen erstelllt und darin Programme und deren Abhängigkeiten kompiliert. Die daraus entstehenden Dateien können unter Windows wie normale Programme verwendet werden.

Im zweiten Teil dieser Artikelserie beschreibe ich die Installation einer Entwicklungsumgebung basierend auf dem MinGW Projekt. Eine Entwicklungsumgebung besteht aus einer Zusammenstellung von Programmen und Werkzeugen, welche zur Erstellung beliebiger Software verwendet werden kann. In solch einer Zusammenstellung können z.B. ein Texteditor zum bearbeiten der Quelltexte, ein Dateiverwaltungssystem, ein Kompiler und ein Linker vorhanden sein.

Wikipedia schreibt zu MinGW

MinGW oder Mingw32 (Minimalist GNU for Windows) ist eine Softwareportierung der GNU-Entwicklerwerkzeuge (GCC, GDB) auf die Windows-Plattform, mit der man Programme für Windows entwickeln kann. MinGW entstand aus dem Cygwin Projekt heraus. Es wird, anders als bei Cygwin, keine Kompatibilitätsschicht in Form einer DLL benötigt. Auch kann hiermit entwickelte Software unter Lizenzen veröffentlicht werden, die nicht mit der GNU GPL kompatibel sind.

Prinzipiell kann man einfach den Installer von der MinGW Webseite herunterladen, anklicken und abwarten. Es hat sich jedoch bei mir gezeigt, dass diese Installationsart im späteren Verlauf zu Problemen führt. So wird z.B. MinGW wie auch MSYS in ein und das selbe Verzeichnis installiert. Das sollte bei neueren Versionen eigentlich kein Problem sein. Sollte… Meine Erfahrungen haben gezeigt, dass es besser ist alles von Hand zu installieren.

Vorinformationen

  • Da eine Entwicklungsumgebung naturgemäss relativ viel Platz belegt, sollte man sich für die Installation eine Disk aussuchen, welche mindestens noch 4-5GB übrig hat.
  • Für alle Installationen in dieser Artikelserie wird von folgendem Basis-Installationspfad ausgegangen:
    D:\Entwicklung\MinGW-MSYS
  • Wer sich bereits ein wenig mit der Thematik des kompilierens auseinander gesetzt hat, kann getrost die neusten Versionen aller in dieser Artikelserie beschriebenen Pakete herunterladen. Man muss aber damit rechnen, dass unerwartete Fehler auftreten können. Wer auf Nummer sicher gehen will, sollte genau die in diesem Artikel angegebenen Versionen herunterladen.

Installation und Konfiguration

  1. In dem oben angegebenen Basis-Installationspfad werden als erstes alle Pakete aus der unten stehenden Tabelle heruntergeladen.
  2. Im Basis-Installationspfad wird vom gzip Archiv bin/gzip entpackt, vom libarchiv die Dateien bin/{bsdtar,libarchive2.dll} und vom Dependencie Paket die beide Bibliotheken bin/{bzip2,zlib1}.dll.
  3. bsdtar.exe in tar.exe umbenennen.
  4. Innerhalb des Basis-Installationspfades muss ein MinGW Verzeichnis angelegt werden in welchem alle heruntergeladenen Pakete entpackt werden. Hierzu öffnet mein eine Eingabeaufforderung (Start/Ausführen/cmd [Enter]) und gibt darin die folgenden Befehle ein.

    cd /D D:\Entwicklung\MinGW-MSYS\
    mkdir MinGW
    tar -xvzf binutils-* -C ./MinGW/
    tar -xvzf gcc-core-* -C ./MinGW/
    tar -xvzf gcc-g++-* -C ./MinGW/
    tar -xvzf gcc-ada-* -C ./MinGW/
    tar -xvzf gcc-g77-* -C ./MinGW/
    tar -xvzf gcc-java-* -C ./MinGW/
    tar -xvzf gcc-objc-* -C ./MinGW/
    tar -xvzf mingwrt-*-mingw32-dev* -C ./MinGW/
    tar -xvzf mingwrt-*-mingw32-dll* -C ./MinGW/
    tar -xvzf w32api-* -C ./MinGW/
Paket Beschreibung Link
binutils Enthält Programme wie den Assembler, den Linker und viele andere. binutils-2.19.1
gcc-core Grundlegende Kompiliertools sowie der C-Compiler aus der Gnu Compiler Collection. gcc-core-3.4.5
gcc-g++ Der C++ Compiler aus der Gnu Compiler Collection. gcc-g++-3.4.5
gcc-ada Der ada Compiler aus der Gnu Compiler Collection. gcc-ada-3.4.5
gcc-g77 Der g77 Compiler aus der Gnu Compiler Collection. gcc-g77-3.4.5
gcc-java Der java Compiler aus der Gnu Compiler Collection. gcc-java-3.4.5
gcc-objc Der Obective C Compiler aus der Gnu Compiler Collection. gcc-objc-3.4.5
mingw32-dev Grundlegende Dateien der MinGW Runtime Umgebung. mingwrt-3.15.2-dev
mingw32-dll Basisbibliotheken der MinGW Runtime Umgebung. mingwrt-3.15.2-dll
mingw32-API Essenzielle Header Dateien sowie Bibliotheken der MinGW Runtime Umgebung. w32api-3.13
gzip gzip ent-/packer um die .gz Dateien entpacken zu können gzip.zip
tar tar ent-/packer um die .tar Dateien entpacken zu können tar.zip
dependencies Bibliotheksabhängigkeiten zu gzip und tar. deps.zip

Im dritten Teil dieser Artikelserie wird die MSYS Umgebung installiert, welche erst den sinnvollen Umgang mit den Entwicklungswerkzeugen ermöglicht.




Serie: DOSBox unter Windows kompilieren 1/10

1987 habe ich als 10 Jähriger Knirps mit meinem C64 herumgespielt. Eigentlich war zu der Zeit der 386er gerade aktuell, doch von solch einem Rechner konnte ich nicht einmal träumen 😉 Jedenfalls erschien im Jahre 1987 das Spiel Police Quest: In Pursuit of the Death Angel. Ich weiss noch, wie ich damals bei uns im Ort an die Herbstschau ging und da zum ersten mal dieses Spiel erblickt hatte. Das Spiel hatte mich sofort gefesselt. Man durfte selber steuern wohin man den Protagonisten schicken wollte und wenn man z.B. eine Tür aufmachen wollte, stellte man die Figur vor selbige und gab open door ein. Ich war sofort Feuer und Flamme und gab mein ganzes Taschengeld dafür aus, jeden Tag einen Messeeintritt zu erwerben um mich bei diesem Stand aufhalten zu können. Irgendwann liessen mich die Leute da sogar selber spielen! Und hätte es nicht so etwas wie Hunger, Durst, Schlaf oder Hausaufgaben gegeben, ich würde wohl heute noch dort sitzen 🙂

Jedenfalls sind es solche Erinnerungen, welche mich persönlich immer wieder die alten Spiele hervorkramen lassen. Doch leider wird es immer schwieriger solche Spiele unter einem heutigen System überhaupt zum laufen zu bekommen. Die Spiele welche sehr Hardwarenah programmiert wurden, rasen bei den heutigen Gigahertzen nur so über den Bildschirm. Die ISA Soundkarten gibt es schon lange nicht mehr und von onboard PCI Karten wussten die damaligen Spiele noch nichts. Und von heutigen Monitorauflösungen jenseits von 640×480 will ich gar nicht erst anfangen zu sprechen.

Um also all diese Hürden überwinden zu können, bietet sich die Verwendung eines Emulators an. Und genau für diesen Zweck gibt es einen Emulator mit Namen DOSBox.

Zitat Wikipedia:

DOSBox ist ein freier x86-Emulator, der das Betriebssystem DOS und die in dessen Ära gebräuchliche Hardware nachbildet. Ziel ist das Ausführen älterer, DOS-basierter Software, die mit modernen Computersystemen nur eingeschränkt oder gar nicht kompatibel ist.

Da der Emulator auf den unterschiedlichsten Systemen wie etwa Linux, BSD, Mac OS X und vielen anderen läuft, ist er natürlich sehr beliebt und verbreitet. Mit Hilfe dieses Emulators habe ich schon so manches Kleinod aus früheren Kindertagen wieder in altem Glanz erstrahlen lassen.

Titelbild von Bazooka Sue
Titelbild von Bazooka Sue

Doch wie das nunmal im Leben so ist, irgendwann gelangt man an einen Punkt wo selbst die tollsten Tricks das alte Spiel nicht mehr zum laufen bringen. Bei mir war dieser Punkt beim Spiel Bazooka Sue erreicht.

Das Problem bei diesem Spiel ist die Verwendung von Umlauten in den Dateinamen. So gibt es z.B. eine Datei GLÜCK.WAV oder LÖWE.WAV welche in der entsprechenden Situation abgespielt wird.

Da DOSBox ein internationales Projekt ist und die Programmierer englischsprachig sind, gibt es für Umlaute zuerst einmal keine Unterstützung. Das merkt man auch daran, dass das Spiel an den jeweiligen Stellen mit einer Fehlermeldung abstürzt.

Doch Open Source wäre nicht Open Source, wenn man nicht einfach selber Hand am Code anlegen könnte. Also habe ich mir den Quellcode heruntergeladen und die besagte Stelle relativ schnell identifiziert und gepatch.

Viel schwieriger war dann jedoch die Frage zu beantworten, wie man denn dieses Paket – inklusive all seiner Abhängigkeiten – unter Windows XP zum kompilieren bringt. Nach einer Woche intensiven ausprobierens, Foren scannens, Bugreports lesen und Anwendung von Vodoo Praktiken habe ich es tatsächlich geschafft eine DOSBox Version auf meinen Rechner zu zaubern, welche Umlaute in Dateinamen versteht.

Da dieses Unterfangen doch einige Stolperfallen beherbergen kann, habe ich mich entschieden eine Artikelserie zu veröffentlichen, welche aufzeigt, wie man das kompilieren einer derart komplexen Software mit Hilfe von Open Source Tools unter Windows bewerkstelligen kann. Obwohl es in diesem Artikel explizit um DOSBox geht, kann diese Artikelserie für jedermann interessant sein, der selber das eine oder andere Projekt unter Windows kompilieren möchte.

Im zweiten Teil der Serie werde ich mich der Erstellung und Installaiton der MinGW/MSYS Entwicklungsumgebung widmen.




FLV Embed – Multimedia Button Erweiterung

Wordpress Multimedia Button

Zum darstellen von Videos (wie etwa im Jack Keane Artikel) ist das WordPress Plugin FLV Embed ideal geeignet. Schade daran ist nur, dass dieses Plugin die Multimedia Schaltfläche nicht aktiv unterstützt. Will heissen, wenn man via Multimedia Button einen Flash Film einbinden will, dann kann man den Film zwar aus der Galerie auswählen, die nötigen Tags wie [flv :<Dateiname> breite hoehe] muss man jedoch immer noch selber darum herum schreiben.

Das was mir persönlich etwas lästig. Aus diesem Grund habe ich das Plugin so erweitert, dass bei einem Flash Film ein Button erscheint, welcher zum einen automatisch ein [flv : etc. darum herum packt, und zum anderen einfach einen Standard Wert von 320×240 Pixeln wählt.

Nachfolgend die Beschreibung, was man selber verändern muss.

  1. Im Adminbereich klickt man auf Plugins / Plugins bearbeiten.
  2. Unter Plugin-Dateien wählt man FLV Embed an.
  3. Im nun erscheinenden Source Code Fenster sucht man die Zeile //////////////////// parse content functions, und fügt darunter folgenden Code ein (alternativ ab WP 2.7.1 FLV_EMBED 1.2.1 folgenden Code und ab WP 2.9.x FLV_EMBED 1.2.1 folgenden Code) ein.
  4. Wählt man nun ein Flash Video aus, wird ein Button Namens FLV Player dargestellt. Klickt man darauf, wird das flv darum gebaut und bei Einfügen in den Artiekl sogleich der gesamte String in den Artikel übertragen. Je nach Gusto kann man dann noch die default Grösse verändern.

So einfach kann das sein 😉




QEMU Gamer Edition 0.9.1

Manchmal überkommt es mich und ich wühle ich in meinen alten Games herum. Gefunden habe ich dieses mal – passend zur EM – FIFA international Soccer aus dem Jahre 1994.

Leider ist das Spiel nicht mehr ohne Probleme unter neueren Betriebsystemen lauffähig. Will man es unter DosBox betreiben, stürzt das Spiel einfach ab. Auch nativ unter XP ist nicht viel zu machen.

Daher habe ich es einmal mit dem Opensource Prozessor Emulator QEMU versucht. Und tatsächlich, nach ein wenig herumprobieren konnte ich das Game starten. Dummerweise lief es aber zu schnell. Und im Gegensatz zur DosBox gibt es keine Möglichkeit den Emulator zu bremsen.

Glücklicherweise hat das Problem bereits Miroslav Novak gelöst. Er hat für die QEMU Version 0.9.0 einen Patch veröffentlicht, welchen ich für die aktuellste 0.9.1 als Grundlage verwendet habe. In der von mir angepassten QEMU Gamer Edition Version wurden ausserdem alle Prozessoren wie etwa SPARC oder ARM entfernt.

Will man die QEMU Umgebung verlangsamen, startet man einfach qemu.exe mit der Option -brake <WERT>. Wobei WERT der Zahl 0 entsprechen kann um die Verlangsamung zu deaktivieren oder einem Wert >0. Verwendet man z.B. die Option -brake 1000 wird der Emulator 10x langsamer.

Die von mir angepasste QEMU Version für 32Bit Windows Systeme kann man von hier herunterladen. Das Archiv wurde mit dem Opensource Packetierer 7zip gepackt.




Doppelte Einträge in Python Listen entfernen

Zur Zeit programmiere ich gerade einen kleinen Launcher für das Spiel Lure of the Temptress (hierzu später mehr in diesem Blog) in Python. Damit auch unerfahrene Windows Benutzer den Launcher benutzen können ohne vorher Python installieren zu müssen, habe ich das ganze mit py2exe umgewandelt und in eine exe gepackt.

Während des Arbeitens mit py2exe ist mir aufgefallen, dass die übergebenen Parameter (in diesem Fall Dateipfade zu DLL Dateien) manchmal doppelt vorkommen.

Will man diese doppelten Einträge eliminieren gibt es zwei sehr simple Möglichkeiten dazu:

Zwei Listen. Eine mit reinen Zahlen, die andere mit Strings von Farbnamen:

x = [1, 3, 5, 7, 5, 5, 9]
y = ["blau", "gelb", "braun", "blau", "gelb", "violett"]

Möglichkeit 1 (< Ptyhon 2.4):

>>> x_sauber = dict(map(lambda i: (i,1),x)).keys()
>>> y_sauber = dict(map(lambda i: (i,1),y)).keys()

Ergibt:

>>> print x_sauber
[1, 3, 9, 5, 7]
>>> print y_sauber
['violett', 'gelb', 'blau', 'braun']

Möglichkeit 2 (ab Ptyhon 2.4):

>>> x_sauber = list(set(x))
>>> y_sauber = list(set(y))

Ergibt:

>>> print x_sauber
[1, 3, 9, 5, 7]
>>> print y_sauber
['violett', 'gelb', 'blau', 'braun']




PHP: Call to undefined function: utf8_decode()

Das kommt davon, wenn man versucht seinen Rechner und die darauf laufenden Programme nach der Methode «alles raus was nicht benötigt wird» zu sichern. Irgend etwas vergisst man garantiert…

Mir wurde das bewusst, nachdem ich folgende Fehlermeldung beim betreiben des Blogs entgegengeschmettert bekam.

Call to undefined function: utf8_decode()

PHP will mir also mitteilen, dass er den übergebenen String gerne von UTF8 nach irgendwas decodieren möchte, dies jedoch aufgrund fehlender Funktionalität nicht möglich ist. Die Frage ist nur, wie kriege ich diese Funktionalität in PHP gepackt?

Die Antwort ist einfach. Man muss lediglich XML Unterstützung beim kompilieren aktivieren.

Wer (wie ich) Gentoo verwendet muss dabei nur wissen, welches USE Flag zu aktivieren ist.

  • Für PHP4 wird zwingend das USE Flag expat benötigt.
  • Für PHP5 wird zwingend das USE Flag xml benötigt.

So einfach kann es sein 😉