Sign in Join
Wiki copytemporary

Cross compiling/de: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Cross compiling/de

OldNewLine
1+## Vorwort
2+
3+Dies ist eine kurze Einführung für Neulinge. Die folgenden Abschnitte beschreiben, wie man ein System für cross compile einrichtet, das bedeutet, arbeiten unter Linux und erzeugen von Win32 executables (oder freebsd oder darwin, oder ...). FreePascal ist ein Compiler und konvertiert hauptsächlich Quellcode in binaries (Maschinensprache). Diese binaries enthalten auch Informationen darüber, wie das Betriebssystem das executable startet. Daher sind diese binaries Plattform-spezifisch. FreePascal selbst benötigt nicht viel Installation. Es kann binaries für viele Plattformen erzeugen. Der Compiler muss nur dazu angewiesen werden. Aber der Compiler ist nur ein Teil. Es gibt auch noch den Assembler und den Linker. Und diese Werkzeuge sind nicht in der Lage, cross code zu erzeugen. Daher müssen wir spezielle Linker 'ld' und Assembler 'as' für jede Zielplattform erzeugen. Dies sind die binutils. Nach Erstellung der cross tools, werden alle FPC Pascal Units cross compiled. Zum Beispiel, dann gibt es eine system.ppu Datei für jede Zielplattform. Dann wird ihre FPC Konfigurationsdatei eingerichtet, so dass cross compilation so einfach wird, dass sie alle langweiligen Details vergessen können. Das selbe wird für die LCL getan - die Lazarus Component Library. Und danach können sie Pascal Programme für Win32 cross kompilieren. Entweder starten sie sie mit Wine oder sie kopieren sie auf einen Windows Computer und testen sie dort.
4+
5+### Grundsätzliche Schritte
6+
7+Es gibt einige übliche Schritte, die beteiligt sind in crosscompiling, die sie in jedem Fall tun müssen:
8+
9+1. Bereits einen FreePascal Compiler haben für die Plattform, von der sie kompilieren wollen.
10+2. Sie müssen den FreePascal Quellcode haben.
11+3. You need to either build from source or obtain binaries of the cross-binutils that run on the platform you are on and are designed to build programs for your desired target platform.
12+4. Manchmal werden sie einige Dateien von der Zielplattform benötigen, zu der sie kompilieren.
13+
14+## Von Linux
15+
16+### Zu Linux
17+
18+Zur Klarstellung: Dies ist für die Kompilierung von Linux(x86_64) zu Linux(i386).
19+
20+Chances are that your 64 bit linux distrubution is already capable of compiling 32 bit programs but due to the way the fpc build process is designed there are a couple of things you might have to do.
21+
22+- Zuerst prüfen Sie, ob Sie bereits die Dateien i386-linux-ld und i386-linux-as haben:
23+
24+` bash $ which i386-linux-ld`
25+
26+` bash $ which i386-linux-as`
27+
28+Wenn sie diese Dateien haben springen sie zum "Kompilieren" Abschnitt.
29+
30+Ich hatte diese Dateien nicht und so erstellte ich ein paar Skripte:
31+
32+`#!/bin/bash`\
33+`# name this file /usr/bin/i386-linux-ld`\
34+`ld -A elf32-i386 $@`
35+
36+`#!/bin/bash`\
37+`# name this file /usr/bin/i386-linux-as`\
38+`as --32 $@`
39+
40+- Machen sie sie ausführbar:
41+
42+`bash $ chmod +x /usr/bin/i386-linux-as`\
43+`bash $ chmod +x /usr/bin/i386-linux-ld`
44+
45+- Kompilieren sie FPC:
46+
47+`bash $ cd /usr/share/fpcsrc/<version>`\
48+`bash $ make all CPU_TARGET=i386`
49+
50+dann:
51+
52+`bash $ su -c "make install CPU_TARGET=i386"`
53+
54+Das ist alles. Bearbeiten sie ihre /etc/fpc.cfg Datei falls erforderlich.
55+
56+### Zu Windows
57+
58+[[Cross compiling for Windows under Linux]]
59+
60+Wenn sie Version 2.1.1 oder höher des FPC Compilers verwenden können sie einfach tippen:
61+
62+`bash $ make all OS_TARGET=win32 CPU_TARGET=i386`
63+
64+und dann
65+
66+`bash $ su -c "make crossinstall OS_TARGET=win32 CPU_TARGET=i386"`
67+
68+Anmerkung: Um für Win64 zu erstellen lautet das make Kommando: make all OS_TARGET=win64 CPU_TARGET=x86_64
69+
70+Der Grund für diese Einfachheit ist der in dieser Version von FPC enthaltene interne Linker.
71+
72+Ein gutes Tutorial zum Thema ist im deutschen [Lazarusforum](http://www.lazarusforum.de/viewtopic.php?f=51&t=649) zu finden.
73+
74+### Zu Darwin oder macOS
75+
76+*Vorbemerkung: der Autor des Orignaltexts warnt, einige Dinge vielleicht nicht ganz originalgetreu wiedergegeben zu haben, da er seine Erfahrungen erst zu späterem Zeitpunkt protokolliert hat. Bitte ergänzen/korrigieren Sie also diese Anleitung (möglichst auch den [[Cross compiling|Originaltext]]) bei Bedarf!*
77+
78+- Zuallererst benötigen Sie die binutils für die Plattform, für die Sie kompilieren wollen: laden Sie die [odcctools](http://www.opendarwin.org/projects/odcctools/) herunter (benutzen Sie die CVS Version!) und folgen Sie deren Installationsanleitung.
79+- Sie müssen sich ein "Fake-root"-Verzeichnis wie: **\$HOME/darwinroot** anlegen und zumindest die Verzeichnisse **/System**, **/Frameworks** und **/usr** von Ihrem Apple- oder Darwin-Rechner dorthin kopieren (möglicherweise noch weitere?) .
80+- Danach erstellen Sie einen weiteren Ordner \$HOME/darwinroot/**cross** und legen darin praktischerweise symbolische Verküpfungen (symlinks) auf die odcctools an. Symlinks müssen Sie ferner für **powerpc-apple-darwin-*** der odcc tools anlegen (oder umbenennen). So wird beispielsweise "powerpc-apple-darwin-ld" zu "powerpc-darwin-ld"; nach demselben Schema bearbeiten Sie *-ar und *-as.
81+- Jetzt ist alles bereit zum Crosscompilieren von fpc! Sie brauchen dazu die FPC Quelldateien sowie ein in deren Verzeichnis geöffnetes Terminal. Darin tippen Sie (sofern Ihre Symlinks in \$HOME/darwinroot/cross liegen):
82+
83+`$PATH=$PATH:$HOME/darwinroot/cross`
84+
85+Tippen Sie (unter Vorbehalt, siehe Vorbemerkung):
86+
87+`make all TARGET_OS=darwin TARGET_CPU=powerpc OPT="-Xd -Fl/$HOME/darwinroot/usr/lib"`
88+
89+wenn das Übersetzen damit erfolgreich war ist, installieren Sie es mit:
90+
91+`make install TARGET_OS=darwin TARGET_CPU=powerpc PREFIX=/cross/fpc`
92+
93+Zuletzt kopieren oder verlinken Sie die Datei ./compiler/ppccross irgendwohin, wo Sie sie leicht wieder aufrufen können, denn es ist Ihr neuer Compiler zum Übersetzen von PowerPC-Binaries.
94+
95+- Konfigurieren Sie Ihre **/etc/fpc.cfg**, indem Sie einen Abschnitt wie diesen hinzufügen:
96+
97+`#IFDEF powerpc`\
98+`-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/`\
99+`-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/rtl`\
100+`-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/*`\
101+`-k-systemroot $HOME/darwin/cross`\
102+`#ENDIF`
103+
104+Weil Sie bei jeder Crosskompilierung sowohl **ppccross** als auch die oben beschriebenen Symlinks auf powerpc-darwin-* brauchen, sollten diese in Ihrem Suchpfad (PATH) zu finden sein. Dann genügt ein einfaches
105+
106+`ppccross someprogie.pas `
107+
108+und Sie erhalten das Binary für den PowerPC!
109+
110+## Von Windows
111+
112+### Zu Linux
113+
114+Marco vd Voort schrieb einige [crossnotes](http://www.stack.nl/~marcov/crossnotes.txt). Wenn jemand Zeit hat, dann kann er sie diesem Wiki hinzufügen.
115+
116+#### Free Pascal 3.x
117+
118+Mit fpc 3.x funktioniert die nachfolgend beschriebene Vorgehensweise. Es werden aktuelle binutils und die Quellen von Free Pascal benötigt. Lade also folgende Files herunter:
119+
120+- Aktuelle [binutils](https://sourceforge.net/projects/mingw/files/MinGW/Base/binutils/). Du brauchst binutils-xxx-mingw32-src.tar.xz.
121+- [Script zum Compilieren der binutils](ftp://www.freepascal.org/pub/fpc/contrib/cross/mingw/mkbinutils)
122+- [fpc sources](http://www.freepascal.org/down/source/sources.var) (fpc-x.x.x.source.zip)
123+
124+Binutils erstellen, am Beispiel von Fedora 20 x86_64:
125+
126+- Lade das oben genannte mkbinutils Script nach /root und mache es ausführbar.
127+- Ändere folgende Variable:
128+ - VER="2.25.1" (an die jeweilige Version der binutils anpassen)
129+ - CC="i686-w64-wingw32-gcc"
130+ - TARGETS="i386-linux x86_64-linux"
131+- Entpacke die gedownloadeden binutils ebenfalls nach /root
132+- Stelle sicher, dass folgende Pakete installiert sind (yum install ...):
133+ - glibc.i686, glibc.x86_64
134+ - glibc-devel.i686, glibc-devel.x86_64
135+ - gcc.x86_64
136+ - mingw32-binutils.x86_64
137+ - mingw32-gcc.x86_64
138+ - mingw32-gmp
139+ - mingw32-mpfr
140+- Erstelle diesen Symlink: /usr/bin/i386-pc-mingw32-ar -\> /usr/bin/i686-w64-mingw32-ar
141+- Compiliere binutils: ./mkbinutils
142+- Die erstellten Crosscompiler liegen am Ende in /tmp/binutils.
143+
144+Unter Windows lassen sich nun mit fpc die Quellen compilieren:
145+
146+- fpc liege unter c:\fpc\x.x.x
147+- Kopiere die heruntergeladenen Sources nach c:\fpc\x.x.x\source
148+- Aus den erstellten binutils, kopiere folgende Tools nach c:\fpc\x.x.x\bin\i386-win32:
149+ - x86_64-linux-ar.exe
150+ - x86_64-linux-as.exe
151+ - x86_64-linux-ld.exe
152+ - x86_64-linux-nm.exe
153+ - x86_64-linux-objcopy.exe
154+ - x86_64-linux-objdump.exe
155+ - x86_64-linux-strip.exe
156+ - i386-linux-ar.exe
157+ - i386-linux-as.exe
158+ - i386-linux-ld.exe
159+ - i386-linux-nm.exe
160+ - i386-linux-objcopy.exe
161+ - i386-linux-objdump.exe
162+ - i386-linux-strip.exe
163+- Erstelle c:\fpc\x.x.x\lib\i386-linux und c:\fpc\x.x.x\lib\x86_64-linux und kopiere aus der Fedora-Installation folgende Dateien:
164+ - crtbegin.o
165+ - crtbeginS.o
166+ - crtbeginT.o
167+ - crtend.o
168+ - crtendS.o
169+ - crti.o
170+ - crtn.o
171+ - ld-linux.so.2 bzw. ld-linux-x86-64.so.2
172+ - libc.so.6 (und nochmals als libc.so)
173+ - libdl.so
174+ - libgcc.a
175+ - libpthread.so
176+- Manche liegen unter Linux nur als Verweis auf eine konkrete Version; dann sollte die referenzierte Version kopiert und entsprechend umbenannt werden. In der x86_64-Variante wird ld-linux-x86-64.so.2 zusätzlich als ld-linux.so.2 benötigt.
177+- In einer cmd, wechsle nach c:\fpc\x.x.x\source und führe folgende Befehle aus:
178+ - PATH=c:\fpc\x.x.x\bin\i386-win32;%PATH%
179+ - make clean
180+ - make OS_TARGET=linux CPU_TARGET=x86_64 LIBDIR=c:\fpc\x.x.x\lib all
181+ - make OS_TARGET=linux CPU_TARGET=x86_64 install INSTALL_PREFIX=c:\fpc\x.x.x OPT="-XPx86_64-linux- "
182+ - make OS_TARGET=linux CPU_TARGET=i386 LIBDIR=c:\fpc\x.x.x\lib all
183+ - make OS_TARGET=linux CPU_TARGET=i386 install INSTALL_PREFIX=c:\fpc\x.x.x OPT="-XPi386-linux- "
184+- Die fürs Cross-Compilieren benötigten Files sollten sich anschliessend in c:\fpc\x.x.x\units und c:\fpc\x.x.x\fpmkinst befinden.
185+- Hinweis: Die aufgelisteten Bibliotheken sind für console-Anwendungen ausreichend. Für GUI-Anwendungen werden zusätzliche Bibliotheken benötigt. Die Logs während des Compilierens sollten ausreichend sein, um herauszufinden, welche das sind.
186+
187+## Von Darwin (macOS) i386
188+
189+### Von i386 zu PowerPC
190+
191+- Cross binutils
192+
193+Prüfen Sie zuerst, ob Sie bereits die Dateien **powerpc-darwin-ld** und **powerpc-darwin-as** besitzen:
194+
195+` $ which powerpc-darwin-ld`\
196+` $ which powerpc-darwin-as`
197+
198+Wenn ja, überspringen Sie die Erzeugung der Symlinks und fahren Sie fort mit "FPC übersetzen".
199+
200+Tatsächlich können Sie die "normalen" Binutils verwenden, weil sie "universal Binaries" sind. Aus diesem Grund reichen einfache Symlinks aus:
201+
202+` $ sudo ln -s /usr/bin/as /usr/bin/powerpc-darwin-as`\
203+` $ sudo ln -s /usr/bin/ld /usr/bin/powerpc-darwin-ld`
204+
205+Die Symlinks können auch in jedem anderen Ordner abgelegt sein, so lange sich dieser in Ihrem \$PATH befindet (z. B. /sw/bin, wenn man mittels *fink* installiert).
206+
207+- FPC übersetzen:
208+
209+` $ cd fpc/compiler`\
210+` $ make cycle CPU_TARGET=powerpc`
211+
212+Das erzeugt den powerpc Compiler (fpc/compiler/ppcppc) und die Units der rtl.
213+
214+Um powerpc Binaries zu erzeugen, braucht man keinen Cross-compiler. Powerpc fpc und ppcppc laufen mittels Rosetta problemlos auf IntelMacs.
215+
216+Benötigt werden weitere Tests und Dokumentation für die parallele Installation beider Compiler und ihre Verwendung.
217+
218+Fehlen Units, überprüfen Sie Ihre config Dateien \$HOME/.fpc.cfg, /etc/fpc.cfg oder /sw/etc/fpc.cfg Je nachdem, wo Ihre Units abgespeichert sind, kann es sein, dass Sie folgendes ergänzen müssen:
219+
220+`-Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/`\
221+`-Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/rtl`\
222+`-Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/*`
223+
224+Erinnerung: Universal Binaries erzeugt man mittels lipo aus den individuellen (i386 und powerpc) Binaries.
225+
226+### Zu Windows, Linux und andere Plattformen
227+
228+Der Paketmanager [fink](http://finkproject.org/) hat Pakete für das den 64-bit compiler fpc und Crosscompiler für Windows, Linux, FreeBSD mit mehreren CPUs.
229+
230+Ein Beispiel für die Installation eines Crosscompilers ist:
231+
232+`$ fink install fpc-cross-i386-win32`
233+
234+oder
235+
236+`$ fink install fpc-cross-arm-linux`
237+
238+Programme übersetzt man dann mit diesen Kommandos:
239+
240+` fpc -Pi386 -Twin32 FILENAME`\
241+` fpc -Parm -Tlinux FILENAME`
242+
243+Die derzeitige Liste an Crosscompiler mit fpc 3.0.4 ist:
244+
245+``` bash
246+fpc-cross-arm-gba
247+fpc-cross-arm-linux
248+fpc-cross-arm-nds
249+fpc-cross-arm-wince
250+fpc-cross-arm-armv4t-embedded
251+fpc-cross-arm-armv7m-embedded
252+fpc-cross-i386-darwin
253+fpc-cross-i386-freebsd
254+fpc-cross-i386-go32v2
255+fpc-cross-i386-linux
256+fpc-cross-i386-nativent
257+fpc-cross-i386-netbsd
258+fpc-cross-i386-solaris
259+fpc-cross-i386-win32
260+fpc-cross-i386-wince
261+fpc-cross-jvm-android
262+fpc-cross-jvm-java
263+fpc-cross-m68k-linux
264+fpc-cross-mipsel-linux
265+fpc-cross-powerpc-linux
266+fpc-cross-sparc-linux
267+fpc-cross-x86-64-dragonfly
268+fpc-cross-x86-64-freebsd
269+fpc-cross-x86-64-linux
270+fpc-cross-x86-64-win64
271+```
272+
273+Für andere Plattformen (Prozessoren und Systeme) muss man den Crosscompiler selbst erstellen. Das Schema ist immer das gleiche: Als erstes braucht man die entsprechenden binutils (Siehe [[Binutils]]) . Danach kann man den Crosscompiler und die Laufzeitbibliothek (run time library) erstellen. Mehr Details, wie man das erstellt, sind aus den Fink Paketbeschreibungen der obigen Crosscompiler ersichtlich.
274+
275+## Cross compile FAQ
276+
277+### Automatisches Tool (FPCUdeluxe)
278+
279+Wen das zu kompliziert ist, kann folgendes Tool nehmen:
280+
281+- [[fpcupdeluxe/de|fpcupdeluxe]] (deutsch)
282+- [[fpcupdeluxe]] (englisch)
283+
284+Es läuft auf allen gängigen Plattformen und erzeugt Cross-Compiler für die meisten gängigen Plattformen.
285+
286+### Warum cross compilieren?
287+
288+Damit können sie ein Programm für ein anderes Betriebssystem/CPU entwickeln. Dieses kann per cross-compiling für ein anderes Betriebssystem oder eine andere CPU ohne Neustart oder Wechsel des Computers kompiliert werden.
289+
290+### Warum Linux zu Windows und nicht in der anderen Richtung?
291+
292+Der Hauptgrund dafür ist, dass die Erzeugung von Unix binaries auf einer fremden Plattform (ein anderes Unix oder sogar Linux eingeschlossen) komplizierter ist. Statisches Linking ist bereits kompliziert, shared Linking noch um ein vielfaches schwieriger.
293+
294+Sie würden die verwendeten Bibliotheken der Zielplattformen benötigen (gtk, glib,libc etc), und eine Menge zusätzlicher Konfiguration für ld. (library paths, dynlinker path, usw.)
295+
296+Für statisches Linking wurde dies bereits teilweise erledigt. Es ist allerdings sehr kompliziert, da es die manuelle Nachbearbeitung der linker Dateien sowie der linker Befehlszeile erfordert. Ein tiefes Verständnis der Funktionsweise von Unix binaries ist dabei absolute Vorraussetzung.
297+
298+### Ich möchte mehr Informationen über die Erstellung von Freepascal. Wo kann ich diese finden?
299+
300+Eine allgemeine FAQ (englischsprachig) im PDF-Format über die Erstellung und Konfiguration von FPC: <http://www.stack.nl/~marcov/buildfaq.pdf>.
301+
302+---
303+*From the Free Pascal wiki, page "Cross compiling/de", as it stood on 2021-07-19 after a change by Dbannon, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
304+Category: Main/de

Back to history