Tutorial
FreeBASIC aus dem Git Quellcode compilieren
von MOD | Seite 1 von 1 |
Seit einiger Zeit wird der Code des FreeBASIC-Compilers nicht mehr in einem SVN-Repository verwaltet, sondern in einem Git-Repo. Hinzu kamen viele Änderungen am Build-System, sodass der Compiler nicht mehr wie früher compiliert werden kann. Im Allgemeinen ist es nicht nötig, sich den Compiler in der Development-Version zu compilieren, doch kann es durchaus nützlich sein, um neue Funktionen auszuprobieren oder zu nutzen. In diesem Tutorial erkläre ich, wie der Compiler für Windows oder Linux compiliert werden kann.
Es wird ein Grundverständnis vorausgesetzt, sodass nicht alles bis ins letzte Detail erläutert wird.
Source Code runterladen
Der Code kann bei SourceForge unter http://sourceforge.net/p/fbc/code/ eingesehen werden.
Mittels Git-Client kann der Code von git://git.code.sf.net/p/fbc/code heruntergeladen werden.
Ein Git-Client für Windows könnte z. B. TortoiseGit sein. Weiterhin benötigt man MSYS Git.
Vorbereitung
Zu aller erst, muss das System für den Prozess vorbereitet werden. Dazu sind verschiedene Programme/Pakete nötig.
Doch zu aller erst: FreeBASIC ist ein selfhosting compiler, das bedeutet, dass er sich selbst compiliert. Dafür ist also eine bestehende FreeBASIC-Installation nötig. Auch wenn ältere Versionen oft gehen, empfehle ich, immer die aktuellste zu verwenden. Unter Windows sollte man den Pfad zum Compiler zudem zur PATH-Variable beifügen.
Windows
Um FreeBASIC unter Windows zu compilieren, sollte man sich MinGW/MSYS installieren. Dazu ladet euch die letzte Version von mingw-get runter und extrahiert es nach C:\MinGW. Danach öffnet eine CMD und gebt folgendes ein:
cd C:\MinGW\bin
mingw-get update
mingw-get upgrade
mingw-get install <Paketname>
<Paketname> ist dabei durch diese Pakete zu ersetzen:
- gcc-core
- gcc-g++
- binutils
- mingwrt
- w32api
- gettext-dev
- msys-core
- bash
- msys-coreutils
- msys-findutils
- msys-make
- libffi (die Dateien sind dem MinGW-Ordner beizufügen)
Über C:\MinGW\msys\1.0\msys.bat kann man die MinGW Shell starten, die zum Compilieren benötigt wird.
Weiterhin benötigt man für FreeBASICs fbgfx2 DirektX Header, insbesondere ddraw.h und dinput.h. Diese kann man diesem Paket entnehmen und in C:\MinGW\include einfügen.
Linux
Ein 32bit Linux benötigt folgende Pakete:
- gcc
- g++ (gcc-c++)
- binutils
- binutils-dev (binutils-devel or binutils-static)
- make
- libncurses-dev (ncurses-devel)
- libx11-dev (libX11-devel)
- libxext-dev (libXext-devel)
- libxpm-dev (libXpm-devel)
- libxrandr-dev (libXrandr-devel)
- libxrender-dev (libXrender-devel)
- libgpm-dev (gpm-devel)
- freeglut3-dev (freeglut-devel)
- libffi-dev (ffi-devel)
Ein 64bit Linux benötigt folgende Pakete (ohne Gewähr):
- ia32-libs-dev
- libc6-dev-i386
- gcc-multilib
- g++-multilib
- lib32ncurses5-dev
FreeBASIC compilieren
Windows
Mit der MSYS Shell sollte man zunächst in den Ordner wecheln, in dem sich der Code befindet, danach kann auch schon compiliert werden. Das sieht im Einzelnen wie folgt aus:
cd /C/Pfad/zum/Code/fbc
make clean
make
Nach dem Compilieren liegt der Compiler im Ordner new. Weiterhin benötigt der Compiler eine Reihe anderer Programme und Dateien, um lauffähig zu sein:
- ar.exe
- as.exe
- dlltool.exe
- ld.exe
- GoRC.exe
Diese können der aktuellen FB-Version entnommen werden, oder aus dem Ordner C:\MinGW\bin\. GoRC.exe gibt es in der aktuellsten Version unter http://www.godevtool.com/.
Die benötigten Libs liegen in C:\MinGW\lib\ und C:\MinGW\lib\gcc\mingw32\version\. Gebraucht werden folgende Libs:
C:\MinGW\lib\
- crt2.o
- dllcrt2.o
- gcrt2.o
- libgmon.a
- libmingw32.a
- libmingwex.a
- libmoldname.a
- libadvapi32.a
- libgdi32.a
- libkernel32.a
- libmsvcrt.a
- libuser32.a
- libwinmm.a
- libwinspool.a
- libbfd.a
- libiberty.a
- libintl.a
C:\MinGW\lib\gcc\mingw32\version\
- crtbegin.o
- crtend.o
- libgcc.a
- libsupc++.a
Linux
Unter Linux reicht es, im entsprechenden Code-Ordner ein Terminal zu öffnen und folgendes einzugeben:
make
Um den Compiler auch gleich unter /usr/local zu installieren, kann man alternativ auch folgendes tun:
make install
Aktualisierungen
Zunächst einmal, sollte man den Code aktualisieren:
git pull
Danach genügt auch wieder ein einfaches make zum Compilieren.
Compile-Optionen
Um den Compiler mit bestimmten Optionen zu compilieren, kann man diese einfach angeben. Dazu sollte vorher alles aufgeräumt werden:
make clean-compiler
make OPTIONFLAG=OPTION
Für OPTIONFLAG=OPTION gibt es einige Möglichkeiten:
- FBFLAGS='-g -exx' : wird benötigt, wenn man z. B. eine Debug-Version des fbc zu erstellen
- CFLAGS='-g -O0' : zusätzliche Optionen, die zum Compilieren der fbrtlib und fbgfx2 verwendet werden
- new=new-foo : ändert das Zielverzeichnis des compilierten fbc (Standard ist new/
- prefix=c:/mingw : ändert den Standard-Prefix /usr/local
- TARGET=i686-pc-mingw32 : für cross-compiling
- SUFFIX=foo : es werden dadurch Suffixe an die ausführbaren Dateien und libs gehängt. Dadurch können mehrere FB-Versionen gleichzeitig genutzt werden
- SUFFIX2=foo : wie die vorherige Option, nur mit einem weitern Suffix für ausführbare Dateien
- ENABLE_STANDALONE=1 : entspricht einem FB Release Build (unter Windows empfohlen)
- ENABLE_PREFIX=1 : Prefix wird hart in den Compiler übernommen, statt exepath() zu nutzen
- ENABLE_FBBFD=217 : der fbc nutzt hierdurch seine eigenen bfd Header, statt dem Wrapper
- DISABLE_OBJINFO=1 : libbfd wird nicht verwendet, wodurch keine objinfos mehr verfügbar sind (wird für eigene Testbuilds empfohlen, da der Umgang mit der libbfd etwas umständlich ist)
- ENABLE_TDMGCC=1 : compiliert den fbc mit TDM-GCC statt MinGW (nur unter Windows)
Bekannte Probleme
Win32 rtlib compilation error: _controlfp, _PC_64 undeclared
CC new/libfb/hinit_win32.o
rtlib/hinit_win32.c: In function 'fb_hInit':
rtlib/hinit_win32.c:21:5: warning: implicit declaration of function '_controlfp' [-Wimplicit-function-declaration]
rtlib/hinit_win32.c:21:17: error: '_PC_64' undeclared (first use in this function)
Sowohl MinGW als auch MinGW GCC besitzen eine float.h, wodurch in manchen Fällen die falsche Version verwendet wird.
Um den Fehler zu beheben, kann man einfach am Ende der Datei C:\MinGW\lib\gcc\mingw32\version\include\float.h ein #include_next <float.h> anhängen.
Warning: .drectve ... unrecognized when linking fbc
CC new/compiler/bfd-wrapper.o
LINK new/bin/fbc.exe
Warning: .drectve `-aligncomm:"_FB_bfd_format",2 '
Warning: .drectve `-aligncomm:"_FB_bfd_architecture",2' unrecognized
Hierbei gibt es ein Problem beim Linken der richtigen libbfd-Version. Dabei handelt es sich nur um eine Warnung und keinen Fehler.
Um die Warnung zu entfernen, sollte man die ld.exe im FreeBASIC-Ordner mit der aus dem MinGW-Ordner ersetzen.
fbc crasht in einer bfd_*() Funktion der libbfd
Im make-Prozess sollte DISABLE_OBJINFO=1 angegeben werden, um diesen Fehler vollständig zu umgehen.
Fehler beim kompilieren der rtlib: "wchar.h:644:2: error: unknown type name 'dev_t' "
In aktuellen MinGW Versionen, genauer im Paket "mingwrt-4.x.x-x-mingw32-dev" befindet sich ein Fehler in der Header-Datei "wchar.h" (im "include" Ordner des MinGW-Installationsverzeichnisses). In der Version 4.0.3-1 müssen dazu ab Zeile 644 vier Unterstriche eingefügt werden, sodass der Code wie folgt aussieht:
struct _stat64 {
_dev_t st_dev; /* Equivalent to drive number 0=A 1=B ... */
_ino_t st_ino; /* Always zero ? */
_mode_t st_mode; /* See above constants */
short st_nlink; /* Number of links. */
short st_uid; /* User: Maybe significant on NT ? */
short st_gid; /* Group: Ditto */
_dev_t st_rdev; /* Seems useless (not even filled in) */
_off64_t st_size; /* File size in bytes */
__time64_t st_atime; /* Accessed date (always 00:00 hrs local
* on FAT) */
__time64_t st_mtime; /* Modified time */
__time64_t st_ctime; /* Creation time */
};
Andere Versionen unterscheiden sich möglicherweise geringfügig, sodass die Zeilennummern nicht mehr übereinstimmen. Weitere Informationen dazu im zugehörigen Foren-Thread (engl.).
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|