fpmkunit und fpmake verstehen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Korkenkrone
Beiträge: 33
Registriert: Sa 18. Sep 2010, 20:33
OS, Lazarus, FPC: OpenSUSE 11.3 (L 0.9.28.2 Beta FPC 2.2.4)
CPU-Target: x86-64

fpmkunit und fpmake verstehen

Beitrag von Korkenkrone »

Guten Abend Lazarus-Forum,

Ich habe vor Kurzem begonnen mich in die Programmiersprache FreePascal einzuarbeiten und versuche derzeit beim Durcharbeiten eines Tutorials rund um OOP in ObjectPascal ( http://delphi.about.com/od/course/a/oop_intro.htm" onclick="window.open(this.href);return false; ) ein paar Werkzeuge kennen zu lernen. Ich habe, neben FPC selbst und Lazarus natürlich, MSEIDE/MSEGUI, FPGUI und eben FPMake ins Auge gefasst, Letzteres bereitet mir aber einige Probleme. Die Idee an sich finde ich absolut super, aber ich verstehe leider nicht einmal die Grundlagen und bin verzweifelt auf der Suche nach Dokumentation.

Auf http://wiki.freepascal.org/FPMake" onclick="window.open(this.href);return false; habe ich ein paar Beispiele gefunden, aber die sind leider nicht erklärt, nicht einmal kommentiert. Auch die Quelldatei fpmkunit.pp aus den FPC-Quellen ist absolut unkommentiert. Dabei wäre es dort vielleicht möglich die Funktionsweise herauszulesen (ist es in FreePascal üblich, dass so viele Klassen in einer Unit stecken?), wenn ich zumindest wissen würde, wie das System grundlegend funktioniert.

So weit ich es bisher herauslesen konnte, sind die grundlegenden Elemente TTarget/TTargets, TPackage/TPackages und TDependency/TDependencies. TTarget ist wohl das bekannte System, in dem die einzelnen Ziele (Libs, Executables) beschrieben werden, Package wird dann vermutlich benutzt, um mehrere Ziele in einem Paket zu packen, zusammen mit Metainformationen, wie beispielsweise in Linux Systemen üblich und hat daher auch ein Feld TTargets und ein Feld TDependencies. Wie diese Klassen benutzt werden und wie sie sich verhalten ist für mich jedoch ein absolutes Rätsel.

Ich versuche es mal anhand des "einfachen" Beispiels (Kommentare von mir hinzugefügt):

Code: Alles auswählen

program fpmake;
 
  uses fpmkunit;
 
  Var
    P: TPackage;
    T: TTarget;  // TPackage enthält doch bereits TTargets, wieso brauchen wir hier ein zusätzliches?
 
  begin
    With Installer do
    begin
      P := AddPackage('my-nice-program');  // Ich füge "Installer" ein Package hinzu und referenziere es mit "P".
      P.OSes := [win32,openbsd,netbsd,freebsd,darwin,linux];  // Die zugelassenen Zielsysteme vermutlich.
      T := P.Targets.AddUnit('myunit');  // Hier wird wohl das erste Target für "P" festgelegt. Es ist eine Unit. Warum hat dies ein Rückgabewert?
      T.ResourceStrings := True;  // Diese Zeile sagt mir überhaupt nichts.
 
      { Ein zweites Ziel, diesmal wieder eine Unit obwohl es "myprogram" heißt?
        "T" wird überschrieben, ohne dass es vorher verwendet wurde? }
      T := P.Targets.AddUnit('myprogram');
 
      { "T" ist von "myunit" abhängig. Sollte das nicht, da es im gleichen Package liegt, ohnehin verfügbar sein?
        Oder gilt die Abhängigkeit für die Zeit des Build-Vorgangs? Natürlich bleibt die Frage, wieso ein
        zusätzliches Target definiert sein muss }
      T.Dependencies.Add('myunit');
      Run;
    end;
  end.
Ich hoffe, dass ihr mir helfen könnt FPMake zu verstehen, da ein Buildsystem in FreePascal ein enormer Vorteil gegenüber Autotools sein sollte.


Grüße,
Korkenkrone

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: fpmkunit und fpmake verstehen

Beitrag von mse »

Was möchtest du denn tun? Normalerweise reichen die eingebauten make Fähigkeiten in FPC völlig. Beispielsweise ist

Code: Alles auswählen

ppc386 apps/ide/mseide.pas -Fulib/common/* -Fulib/common/kernel/i386-linux -Fi/lib/common/kernel
alles was zum Bau einer doch nicht ganz trivialen MSEide unter Linux benötigt wird.

Martin

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: fpmkunit und fpmake verstehen

Beitrag von Socke »

fpcmake ist dazu gedacht, aus einer relativ einfachen Beschreibungsdatei ein komplexes makefile für GNU make zu erstellen. Make ist unter Linux einfach das üblichste um ein Programm zu kompilieren (d.h. den richtigen Compiler, Linker usw. aufzurufen).

Wenn du deine selbstgeschrieben Programme übersetzen möchtest, musst du nur den FPC aufrufen und der kümmert sich dann um alles weitere, sodass das fertige Programm herauskommt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: fpmkunit und fpmake verstehen

Beitrag von mse »

Socke hat geschrieben:fpcmake ist dazu gedacht, aus einer relativ einfachen Beschreibungsdatei ein komplexes makefile für GNU make zu erstellen.
fpcmake
http://www.freepascal.org/docs-html/pro ... 89-291000E
<>
fpmake.
http://wiki.lazarus.freepascal.org/FPMake

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: fpmkunit und fpmake verstehen

Beitrag von Socke »

mse hat geschrieben:fpcmake
<>
fpmake.
Argh. Bitte meinen Post oben ignorieren. :oops:
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: fpmkunit und fpmake verstehen

Beitrag von mse »

Socke hat geschrieben:Argh. Bitte meinen Post oben ignorieren. :oops:
Wobei die Aussage absolut stimmt. Die "unit"-Funktion in FPC ist ja gerade einer der Vorteile von FPC gegenüber C-ähnlichen Sprachen.

Korkenkrone
Beiträge: 33
Registriert: Sa 18. Sep 2010, 20:33
OS, Lazarus, FPC: OpenSUSE 11.3 (L 0.9.28.2 Beta FPC 2.2.4)
CPU-Target: x86-64

Re: fpmkunit und fpmake verstehen

Beitrag von Korkenkrone »

mse hat geschrieben:Was möchtest du denn tun? Normalerweise reichen die eingebauten make Fähigkeiten in FPC völlig. Beispielsweise ist

Code: Alles auswählen

ppc386 apps/ide/mseide.pas -Fulib/common/* -Fulib/common/kernel/i386-linux -Fi/lib/common/kernel
alles was zum Bau einer doch nicht ganz trivialen MSEide unter Linux benötigt wird.

Martin
Ich möchte eine Möglichkeit bieten die Software einfach und auf das System abgestimmt bauen und installieren zu können, wie es bei OpenSource Projekten üblich ist. "./configure" "./make" "./make install" eben. Das scheint bei FPMake auch nur "./fpc fpmake.pp" "./fpmake install" zu sein, bzw bei RPM-Paketen noch mit dem Build-Zwischenschritt. Da wäre FPMake doch eine wunderbare Alternative, da ein Pascal Pogramm leichter zu lesen sein sollte, als ein Makefile und man sich zudem die Abhängigkeiten zu dem GNU Build System spart. Der Compiler wird ja ohnehin benötigt und liefert man das Programm vorkompiliert aus, dann benötigt man überhaupt keine Abhängigkeiten, da die fpmake.pp dann ebenfalls vorkompiliert vorliegt.


fpcmake sieht auch hilfreich aus, aber mich würde FPMake schon interessieren. Spricht denn außer der fehlenden Dokumentation etwas dagegen? Das Problem sollte doch nicht schwer zu lösen sein. Irgendjemand sollte sich doch damit auskennen.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: fpmkunit und fpmake verstehen

Beitrag von mse »

Na ja, falls du nicht gerade eine neue RTL sondern einfach Applikationen programmieren und verbreiten möchtest, brauchst du das ganze make-Karsumpel eigentlich nicht, siehe MSEide+MSEgui. Die Linux distributions-gerechte Aufbereitung ist ein anderes Kapitel und je nach Distribution sowieso wieder anders.
Die Leute die sich mit fpmake auskennen sind hier:
http://lists.freepascal.org/mailman/lis ... pc-pascal/

Korkenkrone
Beiträge: 33
Registriert: Sa 18. Sep 2010, 20:33
OS, Lazarus, FPC: OpenSUSE 11.3 (L 0.9.28.2 Beta FPC 2.2.4)
CPU-Target: x86-64

Re: fpmkunit und fpmake verstehen

Beitrag von Korkenkrone »

mse hat geschrieben:Na ja, falls du nicht gerade eine neue RTL sondern einfach Applikationen programmieren und verbreiten möchtest, brauchst du das ganze make-Karsumpel eigentlich nicht, siehe MSEide+MSEgui. Die Linux distributions-gerechte Aufbereitung ist ein anderes Kapitel und je nach Distribution sowieso wieder anders.
Die Leute die sich mit fpmake auskennen sind hier:
http://lists.freepascal.org/mailman/lis ... pc-pascal/
Danke für den Hinweis auf die Liste, da werde ich mich dann wohl anmelden müssen, wenn sich hier nicht noch jemand meldet, der sich damit auskennt.

Ich halte Buildsysteme für etwas wichtiger, vor Allem für OpenSource Projekte. Man erhält nur Unterstützung, wenn die Leute die Software auch benutzen und man bringt Leute eher dazu sie zu benutzen, wenn man ihnen dabei unter die Arme greift: Einfach zu beziehen, einfach zu installieren und gut Dokumentiert sind meiner Meinung nach wichtig für den Erfolg eines OpenSource Projekts. Ein Buildsystem vereinfacht und vereinheitlicht die Installation auf allen möglichen Systemen, es vereinfacht aber auch das Packen von fertigen Paketen. Und Paketsysteme werden auch immer flexibler. Im OpenSUSE Build Service kannst du beispielsweise mit dem RPM Specfile und dem Sourcetarball automatisiert für verschiedene Distributionen, Versionen und Architekturen bauen lassen und auch bei einer Veränderungen von Abhängigkeiten oder dem Release einer neuen Version einer der unterstützten Distributionen wird sofort ein Rebuild getriggert falls nötig. RPM Specfiles sind natürlich nur so flexibel wie ihr Inhalt es zulässt und da kann es schnell sehr ärgerlich werden, wenn die Entwickler des Projekts auf ein Buildsystem verzichten. Zumindest ich würde so ein Paket nicht pflegen wollen.

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: fpmkunit und fpmake verstehen

Beitrag von carli »

Ich hab, als ich den Post gelesen hab, gleich mal eine Makefile angelegt:

Code: Alles auswählen

all: gwX gwide
	@echo "gwX Make complete"
 
gwX: src/*.pas src/*.lpr
	lazbuild src/gwx.lpi
 
gwide: src/ide/*.pas src/ide/*.lpr
	lazbuild src/ide/gwide.lpi
 
release: all strip
 
strip: ./gwX ./gwide
	strip gwX
	upx gwX
	strip gwide
	upx gwide
Im Grunde läuft es so, dass ihr für das Target "all" die Abhängigkeit der einzelnen Executables setzt. Die Executables bekommen dann eine Liste von Sourcen, aus denen sie gebaut werden ("src/*.pas"). Sollte sich da was geändert haben, wird das Target ausgeführt, da ruft ihr einfach "lazbuild" mit der lpi-Datei auf und fertig ist das vollautomatische Buildscript.

Korkenkrone
Beiträge: 33
Registriert: Sa 18. Sep 2010, 20:33
OS, Lazarus, FPC: OpenSUSE 11.3 (L 0.9.28.2 Beta FPC 2.2.4)
CPU-Target: x86-64

Re: fpmkunit und fpmake verstehen

Beitrag von Korkenkrone »

Ich habe es hinbekommen, eine der Aufgaben aus dem Tutorial mit FPMake zu bauen und um es etwas schwerer zu machen, FPGUI von lokalen Quellen verwendet. Ich poste mal das Buildskript zusammen mit ein paar Kommentaren, vielleicht hilft es ja Jemandem. Das "T" Target habe ich nicht verwendet, genauso wie das ResourceStrings property - Was mich noch ein bischen wurmt, da es sonst jeder zu benutzen scheint. Aber es funktioniert wunderbar und wie gewollt. Ich musste jedoch eine gepatchte Version von fpmkunit.pp verwenden, da sonst Multiarch Linux systeme ( */lib64/) nicht berücksichtigt werden. Falls hier jemand Kontakt zum FPC-Team hat, kann ich ihm ein Diff erstellen.

Der Inhalt des fpgui "src" Ordners wurde einfach unbearbeitet nach "fpguisrc" kopiert. Das Programm und weitere Units liegen im Hauptordner.

Code: Alles auswählen

program fpmake;
 
{$mode objfpc}{$h+}
 
uses 
  fpmkunit;
var
  P: TPackage;
begin
  { Die meisten FPMake Programme werden größtenteils im Kontext des Installers
    ausgeführt. Für einen besseren Überblick wird Installer jedoch einzeln explizit
    qualifiziert und das "with" auskommentiert. }
//  with Installer do begin
 
    { Ein Package wird generiert. Packages können mehrere Targets beinhalten,
      Metainformationen wie Version, Name und Lizenz und Abhängigkeiten zu
      anderen Packages. "P" wird verwendet, um das Package zur weiteren
      Bearbeitung zu referenzieren. }
    P := Installer.AddPackage('conveyors');
 
    { Vergleichbar zum Compilerswitch -Fi werden die Verzeichnisse, die 
      zu verwendende Include Dateien enthalten aufgelistet }
    P.IncludePath.Add('fpguisrc');
    P.IncludePath.Add('fpguisrc/corelib');
 
    { Dieser Pfad gilt nur, falls das Target OS in der Menge aller UnixOSes
      liegt. }
    P.IncludePath.Add('fpguisrc/corelib/x11', AllUnixOSes);
    P.IncludePath.Add('fpguisrc/corelib/gdi', AllWindowsOSes);  // s.o.
 
    { Vergleichbar zum Compilerswitch -Fu werden die Verzeichnisse, 
      die zu verwendende Unit Dateien enthalten aufgelistet }
    P.UnitPath.Add('fpguisrc/corelib');
    P.UnitPath.Add('fpguisrc/corelib/x11', AllUnixOSes);  // s.o.
    P.UnitPath.Add('fpguisrc/corelib/gdi', AllWindowsOSes);  // s.o.
    P.UnitPath.Add('fpguisrc/gui');
    P.UnitPath.Add('fpguisrc/gui/db');
 
    { Das erste Target des Package "P" wird definiert. Es findet sich nach
      dem Build im "bin" Verzeichnis für die Kombination aus Architektur
      und Betriebssystem, da es eine ausführbare Binärdatei ist. }
    P.Targets.AddProgram('conveyors.pas');
 
    { Der Installer wird gestartet. Er installiert die Dateien standardmäßig
      In das FPC-Verzeichnis, daher sollte bei der Installation der Pfad
      angegeben werden. }
    Installer.Run;
//  end;  // with
end.
Beim Install muss, wie in den Kommentaren zu lesen, das Installationsverzeichnis angepasst werden. Für Add On Software, die Paketiert wurde, sollte das auf Unix-Systemen "/opt/PACKAGENAME" sein. "bin", "lib" und weitere Unterordner werden automatisch erstellt.

Code: Alles auswählen

./fpc fpmake.pp
./fpmake install --baseinstalldir='/opt/conveyors'
Die Ausführbare Datei "conveyors", das einzige Target in diesem Beispiel, befindet sich dann in "/opt/conveyors/bin/".

Korkenkrone
Beiträge: 33
Registriert: Sa 18. Sep 2010, 20:33
OS, Lazarus, FPC: OpenSUSE 11.3 (L 0.9.28.2 Beta FPC 2.2.4)
CPU-Target: x86-64

Re: fpmkunit und fpmake verstehen

Beitrag von Korkenkrone »

Der Patch für fpmkunit.pp:

Code: Alles auswählen

--- fpmkunit.pp.original	2009-03-27 22:23:14.000000000 +0100
+++ fpmkunit.pp	2010-09-19 12:38:41.351134673 +0200
@@ -2584,6 +2584,10 @@
       if not DirectoryExists(BD) and
          DirectoryExists('/usr/lib/fpc/'+FCompilerVersion) then
         BD:='/usr/lib/fpc/'+FCompilerVersion;
+      if DirectoryExists('/usr/lib64/fpc/'+FCompilerVersion) then
+        BD:='/usr/lib64/fpc/'+FCompilerVersion;
+      if DirectoryExists('/usr/local/lib64/fpc/'+FCompilerVersion) then
+        BD:='/usr/local/lib64/fpc/'+FCompilerVersion;
     end;
 {$else unix}
   BD:=FixPath(GetEnvironmentVariable('FPCDIR'));
"P: TPackage und "T: TTarget" werden übrigens vermutlich verwendet, um das jeweils zuletzt erstellte Paket/Target zu referenzieren, um es bearbeiten zu können.

Antworten