Sign in Join
Wiki copytemporary

Cross compiling/de: what changed

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

OldNewLine
11## Vorwort
22
33Dies 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.
44
55### Grundsätzliche Schritte
66
77Es gibt einige übliche Schritte, die beteiligt sind in crosscompiling, die sie in jedem Fall tun müssen:
88
991. Bereits einen FreePascal Compiler haben für die Plattform, von der sie kompilieren wollen.
10102. Sie müssen den FreePascal Quellcode haben.
11113. 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.
12124. Manchmal werden sie einige Dateien von der Zielplattform benötigen, zu der sie kompilieren.
1313
1414## Von Linux
1515
1616### Zu Linux
1717
1818Zur Klarstellung: Dies ist für die Kompilierung von Linux(x86_64) zu Linux(i386).
1919
2020Chances 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.
2121
2222- Zuerst prüfen Sie, ob Sie bereits die Dateien i386-linux-ld und i386-linux-as haben:
2323
24-` bash $ which i386-linux-ld`
24+```text
25+ bash $ which i386-linux-ld
26+```
2527
26-` bash $ which i386-linux-as`
28+```text
29+ bash $ which i386-linux-as
30+```
2731
2832Wenn sie diese Dateien haben springen sie zum "Kompilieren" Abschnitt.
2933
3034Ich hatte diese Dateien nicht und so erstellte ich ein paar Skripte:
3135
32-`#!/bin/bash`\
33-`# name this file /usr/bin/i386-linux-ld`\
34-`ld -A elf32-i386 $@`
36+```text
37+#!/bin/bash
38+# name this file /usr/bin/i386-linux-ld
39+ld -A elf32-i386 $@
40+```
3541
36-`#!/bin/bash`\
37-`# name this file /usr/bin/i386-linux-as`\
38-`as --32 $@`
42+```text
43+#!/bin/bash
44+# name this file /usr/bin/i386-linux-as
45+as --32 $@
46+```
3947
4048- Machen sie sie ausführbar:
4149
42-`bash $ chmod +x /usr/bin/i386-linux-as`\
43-`bash $ chmod +x /usr/bin/i386-linux-ld`
50+```text
51+bash $ chmod +x /usr/bin/i386-linux-as
52+bash $ chmod +x /usr/bin/i386-linux-ld
53+```
4454
4555- Kompilieren sie FPC:
4656
47-`bash $ cd /usr/share/fpcsrc/<version>`\
48-`bash $ make all CPU_TARGET=i386`
57+```text
58+bash $ cd /usr/share/fpcsrc/<version>
59+bash $ make all CPU_TARGET=i386
60+```
4961
5062dann:
5163
52-`bash $ su -c "make install CPU_TARGET=i386"`
64+```text
65+bash $ su -c "make install CPU_TARGET=i386"
66+```
5367
5468Das ist alles. Bearbeiten sie ihre /etc/fpc.cfg Datei falls erforderlich.
5569
5670### Zu Windows
5771
5872[[Cross compiling for Windows under Linux]]
5973
6074Wenn sie Version 2.1.1 oder höher des FPC Compilers verwenden können sie einfach tippen:
6175
62-`bash $ make all OS_TARGET=win32 CPU_TARGET=i386`
76+```text
77+bash $ make all OS_TARGET=win32 CPU_TARGET=i386
78+```
6379
6480und dann
6581
66-`bash $ su -c "make crossinstall OS_TARGET=win32 CPU_TARGET=i386"`
82+```text
83+bash $ su -c "make crossinstall OS_TARGET=win32 CPU_TARGET=i386"
84+```
6785
6886Anmerkung: Um für Win64 zu erstellen lautet das make Kommando: make all OS_TARGET=win64 CPU_TARGET=x86_64
6987
7088Der Grund für diese Einfachheit ist der in dieser Version von FPC enthaltene interne Linker.
7189
7290Ein gutes Tutorial zum Thema ist im deutschen [Lazarusforum](http://www.lazarusforum.de/viewtopic.php?f=51&t=649) zu finden.
7391
7492### Zu Darwin oder macOS
7593
7694*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!*
7795
7896- 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.
7997- 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?) .
8098- 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.
8199- 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):
82100
83-`$PATH=$PATH:$HOME/darwinroot/cross`
101+```text
102+$PATH=$PATH:$HOME/darwinroot/cross
103+```
84104
85105Tippen Sie (unter Vorbehalt, siehe Vorbemerkung):
86106
87-`make all TARGET_OS=darwin TARGET_CPU=powerpc OPT="-Xd -Fl/$HOME/darwinroot/usr/lib"`
107+```text
108+make all TARGET_OS=darwin TARGET_CPU=powerpc OPT="-Xd -Fl/$HOME/darwinroot/usr/lib"
109+```
88110
89111wenn das Übersetzen damit erfolgreich war ist, installieren Sie es mit:
90112
91-`make install TARGET_OS=darwin TARGET_CPU=powerpc PREFIX=/cross/fpc`
113+```text
114+make install TARGET_OS=darwin TARGET_CPU=powerpc PREFIX=/cross/fpc
115+```
92116
93117Zuletzt 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.
94118
95119- Konfigurieren Sie Ihre **/etc/fpc.cfg**, indem Sie einen Abschnitt wie diesen hinzufügen:
96120
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`
121+```text
122+#IFDEF powerpc
123+-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/
124+-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/rtl
125+-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/*
126+-k-systemroot $HOME/darwin/cross
127+#ENDIF
128+```
103129
104130Weil 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
105131
106-`ppccross someprogie.pas `
132+```text
133+ppccross someprogie.pas
134+```
107135
108136und Sie erhalten das Binary für den PowerPC!
109137
110138## Von Windows
111139
112140### Zu Linux
113141
114142Marco vd Voort schrieb einige [crossnotes](http://www.stack.nl/~marcov/crossnotes.txt). Wenn jemand Zeit hat, dann kann er sie diesem Wiki hinzufügen.
115143
116144#### Free Pascal 3.x
117145
118146Mit 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:
119147
120148- Aktuelle [binutils](https://sourceforge.net/projects/mingw/files/MinGW/Base/binutils/). Du brauchst binutils-xxx-mingw32-src.tar.xz.
121149- [Script zum Compilieren der binutils](ftp://www.freepascal.org/pub/fpc/contrib/cross/mingw/mkbinutils)
122150- [fpc sources](http://www.freepascal.org/down/source/sources.var) (fpc-x.x.x.source.zip)
123151
124152Binutils erstellen, am Beispiel von Fedora 20 x86_64:
125153
126154- Lade das oben genannte mkbinutils Script nach /root und mache es ausführbar.
127155- Ändere folgende Variable:
128156 - VER="2.25.1" (an die jeweilige Version der binutils anpassen)
129157 - CC="i686-w64-wingw32-gcc"
130158 - TARGETS="i386-linux x86_64-linux"
131159- Entpacke die gedownloadeden binutils ebenfalls nach /root
132160- Stelle sicher, dass folgende Pakete installiert sind (yum install ...):
133161 - glibc.i686, glibc.x86_64
134162 - glibc-devel.i686, glibc-devel.x86_64
135163 - gcc.x86_64
136164 - mingw32-binutils.x86_64
137165 - mingw32-gcc.x86_64
138166 - mingw32-gmp
139167 - mingw32-mpfr
140168- Erstelle diesen Symlink: /usr/bin/i386-pc-mingw32-ar -\> /usr/bin/i686-w64-mingw32-ar
141169- Compiliere binutils: ./mkbinutils
142170- Die erstellten Crosscompiler liegen am Ende in /tmp/binutils.
143171
144172Unter Windows lassen sich nun mit fpc die Quellen compilieren:
145173
146174- fpc liege unter c:\fpc\x.x.x
147175- Kopiere die heruntergeladenen Sources nach c:\fpc\x.x.x\source
148176- Aus den erstellten binutils, kopiere folgende Tools nach c:\fpc\x.x.x\bin\i386-win32:
149177 - x86_64-linux-ar.exe
150178 - x86_64-linux-as.exe
151179 - x86_64-linux-ld.exe
152180 - x86_64-linux-nm.exe
153181 - x86_64-linux-objcopy.exe
154182 - x86_64-linux-objdump.exe
155183 - x86_64-linux-strip.exe
156184 - i386-linux-ar.exe
157185 - i386-linux-as.exe
158186 - i386-linux-ld.exe
159187 - i386-linux-nm.exe
160188 - i386-linux-objcopy.exe
161189 - i386-linux-objdump.exe
162190 - i386-linux-strip.exe
163191- 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:
164192 - crtbegin.o
165193 - crtbeginS.o
166194 - crtbeginT.o
167195 - crtend.o
168196 - crtendS.o
169197 - crti.o
170198 - crtn.o
171199 - ld-linux.so.2 bzw. ld-linux-x86-64.so.2
172200 - libc.so.6 (und nochmals als libc.so)
173201 - libdl.so
174202 - libgcc.a
175203 - libpthread.so
176204- 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.
177205- In einer cmd, wechsle nach c:\fpc\x.x.x\source und führe folgende Befehle aus:
178206 - PATH=c:\fpc\x.x.x\bin\i386-win32;%PATH%
179207 - make clean
180208 - make OS_TARGET=linux CPU_TARGET=x86_64 LIBDIR=c:\fpc\x.x.x\lib all
181209 - make OS_TARGET=linux CPU_TARGET=x86_64 install INSTALL_PREFIX=c:\fpc\x.x.x OPT="-XPx86_64-linux- "
182210 - make OS_TARGET=linux CPU_TARGET=i386 LIBDIR=c:\fpc\x.x.x\lib all
183211 - make OS_TARGET=linux CPU_TARGET=i386 install INSTALL_PREFIX=c:\fpc\x.x.x OPT="-XPi386-linux- "
184212- 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.
185213- 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.
186214
187215## Von Darwin (macOS) i386
188216
189217### Von i386 zu PowerPC
190218
191219- Cross binutils
192220
193221Prüfen Sie zuerst, ob Sie bereits die Dateien **powerpc-darwin-ld** und **powerpc-darwin-as** besitzen:
194222
195-` $ which powerpc-darwin-ld`\
196-` $ which powerpc-darwin-as`
223+```text
224+ $ which powerpc-darwin-ld
225+ $ which powerpc-darwin-as
226+```
197227
198228Wenn ja, überspringen Sie die Erzeugung der Symlinks und fahren Sie fort mit "FPC übersetzen".
199229
200230Tatsächlich können Sie die "normalen" Binutils verwenden, weil sie "universal Binaries" sind. Aus diesem Grund reichen einfache Symlinks aus:
201231
202-` $ sudo ln -s /usr/bin/as /usr/bin/powerpc-darwin-as`\
203-` $ sudo ln -s /usr/bin/ld /usr/bin/powerpc-darwin-ld`
232+```text
233+ $ sudo ln -s /usr/bin/as /usr/bin/powerpc-darwin-as
234+ $ sudo ln -s /usr/bin/ld /usr/bin/powerpc-darwin-ld
235+```
204236
205237Die 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).
206238
207239- FPC übersetzen:
208240
209-` $ cd fpc/compiler`\
210-` $ make cycle CPU_TARGET=powerpc`
241+```text
242+ $ cd fpc/compiler
243+ $ make cycle CPU_TARGET=powerpc
244+```
211245
212246Das erzeugt den powerpc Compiler (fpc/compiler/ppcppc) und die Units der rtl.
213247
214248Um powerpc Binaries zu erzeugen, braucht man keinen Cross-compiler. Powerpc fpc und ppcppc laufen mittels Rosetta problemlos auf IntelMacs.
215249
216250Benötigt werden weitere Tests und Dokumentation für die parallele Installation beider Compiler und ihre Verwendung.
217251
218252Fehlen 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:
219253
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/*`
254+```text
255+-Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/
256+-Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/rtl
257+-Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/*
258+```
223259
224260Erinnerung: Universal Binaries erzeugt man mittels lipo aus den individuellen (i386 und powerpc) Binaries.
225261
226262### Zu Windows, Linux und andere Plattformen
227263
228264Der 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.
229265
230266Ein Beispiel für die Installation eines Crosscompilers ist:
231267
232-`$ fink install fpc-cross-i386-win32`
268+```text
269+$ fink install fpc-cross-i386-win32
270+```
233271
234272oder
235273
236-`$ fink install fpc-cross-arm-linux`
274+```text
275+$ fink install fpc-cross-arm-linux
276+```
237277
238278Programme übersetzt man dann mit diesen Kommandos:
239279
240-` fpc -Pi386 -Twin32 FILENAME`\
241-` fpc -Parm -Tlinux FILENAME`
280+```text
281+ fpc -Pi386 -Twin32 FILENAME
282+ fpc -Parm -Tlinux FILENAME
283+```
242284
243285Die derzeitige Liste an Crosscompiler mit fpc 3.0.4 ist:
244286
245287``` bash
246288fpc-cross-arm-gba
247289fpc-cross-arm-linux
248290fpc-cross-arm-nds
249291fpc-cross-arm-wince
250292fpc-cross-arm-armv4t-embedded
251293fpc-cross-arm-armv7m-embedded
252294fpc-cross-i386-darwin
253295fpc-cross-i386-freebsd
254296fpc-cross-i386-go32v2
255297fpc-cross-i386-linux
256298fpc-cross-i386-nativent
257299fpc-cross-i386-netbsd
258300fpc-cross-i386-solaris
259301fpc-cross-i386-win32
260302fpc-cross-i386-wince
261303fpc-cross-jvm-android
262304fpc-cross-jvm-java
263305fpc-cross-m68k-linux
264306fpc-cross-mipsel-linux
265307fpc-cross-powerpc-linux
266308fpc-cross-sparc-linux
267309fpc-cross-x86-64-dragonfly
268310fpc-cross-x86-64-freebsd
269311fpc-cross-x86-64-linux
270312fpc-cross-x86-64-win64
271313```
272314
273315Fü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.
274316
275317## Cross compile FAQ
276318
277319### Automatisches Tool (FPCUdeluxe)
278320
279321Wen das zu kompliziert ist, kann folgendes Tool nehmen:
280322
281323- [[fpcupdeluxe/de|fpcupdeluxe]] (deutsch)
282324- [[fpcupdeluxe]] (englisch)
283325
284326Es läuft auf allen gängigen Plattformen und erzeugt Cross-Compiler für die meisten gängigen Plattformen.
285327
286328### Warum cross compilieren?
287329
288330Damit 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.
289331
290332### Warum Linux zu Windows und nicht in der anderen Richtung?
291333
292334Der 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.
293335
294336Sie 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.)
295337
296338Fü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.
297339
298340### Ich möchte mehr Informationen über die Erstellung von Freepascal. Wo kann ich diese finden?
299341
300342Eine allgemeine FAQ (englischsprachig) im PDF-Format über die Erstellung und Konfiguration von FPC: <http://www.stack.nl/~marcov/buildfaq.pdf>.
301343
302344---
303345*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).*
304346Category: Main/de

Back to history