FPC für Crosscompiling einrichten

Für Installationen unter Linux-Systemen
Antworten
wolf_z
Beiträge: 88
Registriert: Mo 31. Aug 2009, 09:31

FPC für Crosscompiling einrichten

Beitrag von wolf_z »

Hallo allerseits

ich steht mal wieder bzgl. Installation auf dem Schlauch. Ich versuche gerade, mir FPC auf Linux für das Cross-Compiling einzurichten. Bisher habe ich immer mit den Binär-Pakten gearbeitet. Die sind ja immer nur für ein Target eingerichtet. So wie ich das verstanden habe, muss ich mir für das Crosscompiling das FPC komplett neu z.B. aus dem Trunk compilieren. Ich habe nun mittels SVN den Trunk direkt neben mein bestehendes FPC gespeichert. Ich habe also 2 FPC-Versionen auf dem Rechner:
- /usr/share/fpcsrc/2.2.4 und
- /usr/share/fpcsrc/trunk

Was muss ich ab jetzt machen, um den Trunk zu meinem FPC für Lazarus zu machen. Eingabe von 'fpc' in ein Terminal gibt mir die Version 2.2.4-3 aus. Die brauche ich ja auf jeden Fall noch, um FPC zu übersetzen. Ich habe jetzt 2 Möglichkeiten gefunden, FPC zu kompilieren:

nach FPC-Beispielbuch als PDF:

Code: Alles auswählen

sudo make all OS_TARGET=win32 CPU_TARGET=i386
sudo make crossinstall OS_TARGET=win32 CPU_TARGET=i396


Funktioniert nicht. Wenn ich danach versuche, in Lazarus ein Programm mit win32 u. i396 zu kompilieren, kommt die Meldung:

Code: Alles auswählen

Das Projekt nutzt die Ziele OS-win32 und CPU=i386.
Die system.ppu für dieses Ziel wurden nicht in den Bbinärverzeichnissen von FPC gefunden.
Stellen Sie sicher, dass fpc für diese Zielplattform richtig installiert ist und dann die fpc.cfg die richtigen Verzeichnisangaben enthält.


Einen anderen Ansatz habe ich irgendwo im Netz gefunden. In /lazarus/tools/install$ gebe ich ein:

Code: Alles auswählen

sudo ./create_fpc_deb.sh fpc /usr/share/fpcsrc/trunk
sudo ./create_fpc_deb.sh fpcsrc /usr/share/fpcsrc/trunk


Funktioniert auch nicht. Er bricht ab mit

Code: Alles auswählen

........
Free Pascal Compiler version 2.2.4-3 [2009/06/03] for i386
Copyright (c) 1993-2008 by Florian Klaempfl
Target OS: Linux for i386
Compiling /home/wolfz/tmp/fpc/test.pas
Linking /home/wolfz/tmp/fpc/test
/usr/bin/ld: warning: link.res contains output sections; did you forget -T?
/usr/bin/ld: cannot find -lgpm
test.pas(4,7) Error: Error while linking
test.pas(4,7) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted
Error: /usr/bin/ppc386 returned an error exitcode (normal if you did not specify a source file to be compiled)


Er kann also die Datei /home/wolfz/tmp/fpc/test.pas nicht kompilieren. Diese Datei sieht so aus:

Code: Alles auswählen

program test;
{$linklib gpm}
{$linklib ncurses}
begin end.


Das Paket gpm habe ich nachinstalliert. Funktioniert aber trotzdem nicht und gibt auch keine andere Fehlermeldung.

Ich habe übrigens auch die /etc/fpc.conf provisorisch angepasst:

Code: Alles auswählen

# searchpath for units and other system dependent things
 
# -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget
# -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*
# -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl
 
-Fu/usr/lib/fpc/trunk/units/$fpctarget
-Fu/usr/lib/fpc/trunk/units/$fpctarget/*
-Fu/usr/lib/fpc/trunk/units/$fpctarget/rtl
 
#-Fu~/fpc/packages/base/*/units/;~/fpc/fcl/units/;~/fpc/rtl/units/


So, jetzt bin ich mit meinem Latein am Ende. Wie erkennt Lazarus überhaupt, welche FPC version er für $fpcversion einsetzen muss? Ich sehe nirgendwo eine Einstellmöglichkeit. Irgendwie muss ja auch nach dem Compilieren von FPC der Compiler /etc/fpc ersetzt werden durch die compilierte Version.

Ich würde gerne Lazarus einrichten für ARM-Linux. Das Beispiel oben für Windows auf Linux interessiert mich eigentlich weniger sondern nur, um zu verstehen, was da überhaupt passiert. Es wäre toll, wenn mir jemand das Verfahren im Zusammenhang erklären könnte.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: FPC für Crosscompiling einrichten

Beitrag von monta »

Ist die Inkonsistenz oben Zufall oder hast du wirklich statt für 386 für 396 ?


In Lazarus musst du zwei Dinge einstellen, erstens die LCL bei Lazarus erstellen neu bauen für die Zielplattform. Und zweitens in den Projekteinstellungen bei deinem jeweiligen Projekt.

Auch wenn nicht ganz aktuell, unten stehen die wichtigen Einstellungen:
/viewtopic.php?f=49&t=1148
Johannes

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: FPC für Crosscompiling einrichten

Beitrag von Hitman »

Ich würde nicht mit trunk arbeiten. Der fixes_2_4 Branch wäre sicherlich zu bevorzugen. Zudem sollten der "native" Compiler und der Cross-Compiler übereinstimmen - also aus den gleichen Sourcen gebaut sein. Sonst handelst du dir nur unschöne Effekte beim Testen ein und erschwerst den ganzen Vorgang.

$fpcversion wird übrigens von FPC selbst eingesetzt (es is ja seine eigene Config) - und das kennt seine Version natürlich.

wolf_z
Beiträge: 88
Registriert: Mo 31. Aug 2009, 09:31

Re: FPC für Crosscompiling einrichten

Beitrag von wolf_z »

@hitman

Ich will aber mit dem Trunk arbeiten! Zumindest will ich jetzt wissen, wie das geht. Allerdings habe ich genau bei den Punkten, die Du erwähnst, meine Verständnisprobleme. Ich übersetze ja mit einem Compiler 2.2.4-3 und bekomme aus dem Trunk eine FPC-Version, wie ich jetzt festgestellt habe 2.5.1. Ich übersetze diese Version und muss doch am Ende irgendwo dann einen Compiler 2.5.1 haben, den ich ab dann verwenden kann. Und genau da fehlt mir das Verständnis, wie ich das hinkriege.

@monta

monta hat geschrieben:Ist die Inkonsistenz oben Zufall oder hast du wirklich statt für 386 für 396 ?

Sorry, das war ein Schreibfehler. Der make-Befehl läuft auch ordnungsgemäß durch und erstellt einen Ordner unter /usr/local/lib/fpc/2.5.1 . Den hatte ich bisher nicht gefunden, weil ich immer unter /usr/lib/fpc/ gesucht habe, wo meine funktionierendes FPC 2.2.4 liegt. Das hatte ich auch bisher übersehen. Ich wusste nicht, wo er die Binärdaten hinpackt.

Wenn ich jetzt Deiner Anleitung folge und dementsprechend mein fpc.conf so einstelle, dann funktioniert es trotzdem noch nicht:

Code: Alles auswählen

#IFDEF win32
-Fu/usr/local/lib/fpc/2.5.1/units/i386-win32/
-Fu/usr/local/lib/fpc/2.5.1/units/i386-win32/*
-Fu/usr/local/lib/fpc/2.5.1/units/i386-win32/rtl
-XPi686-mingw32-
-FD/usr/lib/fpc/2.2.0
#ELSE linux
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl
-Fu~/fpc/packages/base/*/units/;~/fpc/fcl/units/;~/fpc/rtl/units/
#ENDIF


Aber ich frage mich, ob das nicht die Konfiguration für einen Windows-Rechner ist. Und auch die Einstellungen für Lazarus unter Umgebung/Einstellungen kann ich doch nicht auf win32 setzen, weil meine IDE doch unter LInux laufen soll. Ich will ja nur das Programm für Windows compilieren aber unter Linux Genauso, wie ich später für ARM-Linux kompilieren möchte und das Programm dann auf einem Emulator laufen lassen möchte (Maemo o.ä.).

Deshalb muss ich doch bei Lazarus die gtk2 Oberfläche von Linux so belassen und nur in den Projektoptionen alles auf Windows-Zielplattform einstellen. Also dort auch die Benutzeroberfläche auf win32/win64 und dann einen Reiter weiter Target und Prozessor auf win32 bzw. i386. Oder sehe ich das falsch?

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: FPC für Crosscompiling einrichten

Beitrag von Hitman »

Die einfachste Variante ist meines Erachtens ganz auf deb/rpm/whatever zu verzichten. Stattdessen legt man sich eine eigene Struktur in /opt/fpc an. So hab ich hier z.b. /opt/fpc/2.2.4 /opt/fpc/2.3.1 und /opt/fpc/2.5.1 ... und kann mit einem einzigen "export PATH=...." umschalten.

Kurz-Anleitung:
  • Lad die das Binärpaket der letzten stabilen Version für deine Plattform runter (die .tar von der FPC Website - z.B. fpc-2.2.4.i386-linux.tar)
  • Installier die mit dem beiliegenden Script ./install.sh - das fragt nach dem Zielverzeichnis, da gibst du /opt/fpc/2.2.4 an
  • Geh nach /opt/fpc, leg dir dort das Verzeichnis 2.5.1 an
  • Da drin führst du dann "svn co http://svn.freepascal.org/svn/fpc/trunk src" aus - das checkt den aktuellen Source nach "/opt/fpc/2.5.1/src" aus (den brauchst du dann sowohl zum Kompilieren als auch für Lazarus)
  • nun gehts ab nach src und ans Kompilieren
    • zuerst schalten wir auf den stabilen Compiler: export PATH=/opt/fpc/2.2.4/bin:$PATH
    • und los gehts: make all install INSTALL_PREFIX=/opt/fpc/2.5.1
    • als nächstes der cross compiler: make all crossinstall OS_TARGET=win32 CPU_TARGET=i386 INSTALL_PREFIX=/opt/fpc/2.5.1
    • jetzt noch aufräumen (WICHTIG!): make clean
  • einmalig (bei Upgrades dann nicht mehr nötig) müssen jetzt noch Symlinks gesetzt und die Config angepasst werden
    • in /opt/fpc/2.5.1/bin müssen symlinks auf /opt/fpc/2.5.1/lib/fpc/2.5.1/ppc*
    • in /etc/fpc.cfg sollten alle Pfade entsprechend stimmen ... also /opt/fpc/$fpcversion/......

Wenn du das so machst, ist dein Verwaltungsaufwand enorm gering, du kannst jede menge FPC Versionen parallel nutzen und leicht zwischen ihnen umschalten.
Packagemanager sind ebenfalls nicht nötig, weil alles, was FPC betrifft (ausser der /etc/fpc.cfg) in /opt/fpc rumliegt.

wolf_z
Beiträge: 88
Registriert: Mo 31. Aug 2009, 09:31

Re: FPC für Crosscompiling einrichten

Beitrag von wolf_z »

Ufffz, Achtung ich bin Linux-Beginner.

Also die Punkte 1 bis 4 hab ich ja schon erledigt. Die beiden Versionen liegen zwar auf unterschiedlichen Ordnerebenen, aber das dürfte ja prinzipiell egal sein. Ich möchte nur meine funktionierende 2.2.4-Version nicht wieder ändern, denn wenn ich die jetzt neu installiere, gibt's bestimmt neuen Ärger.

Beim Punkt 5.1 habe ich jetzt Verständnisprobleme: Was macht der Befehl export PATH=/opt/fpc/2.2.4/bin:$PATH genau? Er setzt doch nur einen Default-Suchpfad des Betriebssystem auf das stabile FPC. Und diese :$PATH sind wahrscheinlich relative Pfade, die von der Anwendung angehängt werden können. Aber der Pfad gilt doch jetzt für alle Programme, oder?

Punkt 5.2: make all install INSTALL_PREFIX=/opt/fpc/2.5.1 -> OK, dieses INSTALL_PREFIX hatte ich bisher vergessen. War in der Anleitung oben offensichtlich nicht nötig. Was bewirkt das? Das make all install erzeugt dann offensichtlich die Binärversion in /usr/local/lib/fpc/2.5.1 (bei mir).

Punkt 6.1: bei mir habe ich unter /usr/local/lib/fpc/2.5.1 eine Datei ppcross386 und einen Ordner 'units/i386-win32/.... . Sind das die Dateien unter /opt/fpc/2.5.1/bin bei Dir, wo ich jetzt noch die symlinks setzen muss? Also symlinks sind doch Verknüpfungen (für dumme Windows-User). Der Satz ist bei Dir etwas verstümmelt. Was genau muss da mit wem verknüpft werden?

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: FPC für Crosscompiling einrichten

Beitrag von Hitman »

"export" betrifft immer nur die aktuelle Session (also die gerade offene Konsole).

Bezüglich der Symlinks: ln -s /opt/fpc/2.5.1/lib/fpc/2.5.1/ppc* /opt/fpc/2.5.1/bin/

Aber da du eh nicht den Weg gehen willst den ich dir da aufzeige, kann ich dir auch nicht helfen. Das was du da vorhast ist ein ziemliches Gemetzel, viel Spass mit deiner fpc.cfg! ;-)

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: FPC für Crosscompiling einrichten

Beitrag von marcov »

Fange mal an mit den Buildfaq zu lesen: http://www.stack.nl/~marcov/buildfaq.pdf

wolf_z
Beiträge: 88
Registriert: Mo 31. Aug 2009, 09:31

Re: FPC für Crosscompiling einrichten

Beitrag von wolf_z »

@Hitman Warum einfach, wenn man es sich auch schwer machen kann :mrgreen: Aber im Ernst. Im Grunde ist Deine Anleitung jetzt die dritte, die ich probiere. Und da soll ich dann wieder bei Null aufsetzen? Da ist es mir lieber, wenn ich erstmal Verständnis aufbaue Schritt für Schritt. Da hat mir Deine Erläuterung jetzt sehr geholfen. Wieder viel gelernt.

Allerdings kriege ich mit dem Befehl make all crossinstall OS_TARGET=win32 CPU_TARGET=i386 INSTALL_PREFIX=/usr/lib/fpc/2.5.1
wieder Probleme. Kann es sein, dass das 'all' zuviel ist? Versteht er jedenfalls nicht. Wenn ich das weglasse (wie ganz oben übrigens), meldet er:

*** Compiler /usr/share/fpcsrc/trunk/compiler/ppcross386 not found. Schluss.

In /usr/lib/fpc/2.2.4 befindet sich eine ppc386, aber keine ppcross386. /usr/lib/fpc/2.2.4 hab ich im export-pfad drin. Aber er will partout eine ppcross386. Woran kann des nu wieder liegen (sag bitte jetzt nicht: an meinem Gemetzel :mrgreen: )

@marcov: Buildfaq? Gerade dort mal gesucht nach dem Begriff 'ppcross386'. Ich glaube, der hilft auch nicht immer weiter :shock: .

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: FPC für Crosscompiling einrichten

Beitrag von Hitman »

Kannst du mal den Output von dem make Befehl posten? Dann sehen wir vielleicht mehr.
ppcross386 ist ohnehin nicht nötig - du bist ja schon auf i386 ;-)

Und der Sinn hinter der Art und Weise wie ich das oben beschrieben habe ist, dass die FPC Versionen konsistent sind und nebeneinander laufen können. (Jede meiner installierten Versionen - 2.3.1, 2.5.1, 2.2.5 [nur 2.2.4 nicht] - können für alle drei meiner Zielplattformen kompilieren ... i386-linux (wo ich grad bin), i386-win32 und x86_64-linux. Zudem ist so das System nicht zugemüllt - wenn ich was zu FPC suche, guck ich in /opt/fpc ... und muss nich erst rätseln obs nun in /usr, /usr/local oder wer weiss wo rumliegt.)

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: FPC für Crosscompiling einrichten

Beitrag von marcov »

wolf_z hat geschrieben:
@marcov: Buildfaq? Gerade dort mal gesucht nach dem Begriff 'ppcross386'. Ich glaube, der hilft auch nicht immer weiter :shock: .


Das ist exact der Grund das der Buildfaq so ist wie es ist. Hintergrund info, keine Recepte.

Weil der Antwort van Hitman ist das wichtige: warum -cross fuer i386->i386 ?

Und das ist in der Buildfaq drin (das nur crosscompile rnoetig sind fuer cross-architectur kompilieren) :twisted:

Antworten