[HowTo]: Lazarus-Projekte im Build Service bauen

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

[HowTo]: Lazarus-Projekte im Build Service bauen

Beitrag von Targion »

Hallo!
In diesem Thema möchte ich kurz erklären, wie man mit Hilfe des openSUSE-buildService für Lazarus-Anwendungen Linux-Pakete erstellen kann. Sollte jemand Probleme mit dem Service haben, kann er diese auch hier posten.
------
0. Was ist der openSUSE buildService?
Der openSUSE Build Service ist eine offene und vollständige Plattform zur Entwicklung von Distributionen. Der Dienst versorgt Software-Entwickler mit einem Werkzeug, mit dem sie quelloffene Software für openSUSE und andere Linux-Distributionen einfach für verschiedene Hardware-Architekturen und eine große Nutzerschaft erstellen und veröffentlichen können. Nutzer können die von ihnen gesuchten Open Source-Pakete in aktuellen Versionen finden und sie nutzen. Der Dienst bietet eine Brücke zwischen Entwicklern und Nutzern mit Funktionen zur Rückmeldung und Bewertung. Für Entwickler ist er durch sein Projektmodell ein effizienter Ort, um Gruppen zu bilden und um zusammenzuarbeiten.
(Quelle: openSUSE)

1. Anmeldung
Um den buildService für ein Lazarus-Projekt zu nutzen, ist zuerst einmal eine Anmeldung am buildService nötig. Den NovellAccount holt man sich am besten direkt auf der Build Service Startseite.
Nach der Registrierung meldet man sich mit Name und Passwort am Build Service an. Diese Anleitung beschreibt, wie man das Webinterface des Build Service nutzt, die Terminal-Basierende Nutzung ist auf den openSUSE-Wiki Seiten ausführlich beschrieben.
Nach der Anmeldung gelangt man auf die Startseite des Service zurück.
Durch einen Klick auf "Home Project" im zweiten Feld (von oben) auf der linken Seite gelangt man zu seinem Startprojekt.

2. Infrastruktur erstellen
Um nun eine Lazarus-Anwendung erstellen zu können, ist erst noch einige Vorarbeit nötig. Durch Klick auf "Add Package" gelangt man zu einem Menü, in dem man den Paketnamen und die Beschreibung des Paketes für sein Lazarus-Projekt angeben kann. Mit "Save changes" wird das Paket gespeichert.
Da Lazarus nicht standardmäßig in den Distributionen vorhanden ist, muss das Paket manuell hinzugefügt werden. Ich habe dazu eine aktuelle Lazarus-Version für den Build Service angepasst.
Um Lazarus einzubinden muss zuerst ein neues Paket erstellt werden. dazu klickt man auf "Add package", gibt für "Name" lazarus und für "Title" Lazarus ein und klickt auf "Save changes". (Die Beschreibung des Paketes kann später angepasst werden)
Im Anhang dieser Anleitung befindet sich ein .tar.gz-Archiv mit benötigten Template-Dateien. Das Paket muss heruntergeladen und entpackt werden. Nun muss die Datei "_aggregate" (zu findem im Ordner "LazLink" des Paketes) über "Add file" dem neuen Paket "lazarus" im Build Service hinzugefügt werden. - Fertig! Lazarus ist nun ins Projekt integriert.

3. Projekt anpassen
INFO: Templates für die zum Build nötigen Dateien sind im Archiv im Anhang zu finden.
Nun muss ein Makefile und die entsprechenden Dateien für das im BS zu kompilierende Projekt erstellt werden. Dazu erstellt man im Projektverzeichnis eine Datei mit dem Namen "Makefile" und folgendem Inhalt:

Code: Alles auswählen

# Targets
# The First target is the one build when there is nothing on make command line
#
all:
   ./make.sh
clean:
   ./clean.sh
install:
   ./install.sh
uninstall:
   ./uninstall.sh

Dann müssen noch folgende Dateien im Projektverzeichnis erstellt und mit Execute-Rechten (+x) versehen werden: "make.sh" "clean.sh" "install.sh" "uninstall.sh"
Die Datei "make.sh" erhält folgenden Inhalt:

Code: Alles auswählen

#!/bin/bash
set -e
# Detects and parses the architecture
ARCH=$(uname -m)
case "$ARCH" in 
 "i686") ARCH="i386";;
 "i586") ARCH="i386";;
 "i486") ARCH="i386";; 
esac
 
echo "Target architecture: $ARCH"
 
if [ $ARCH = "x86_64" ]; then LCLDir="/usr/lib64/lazarus/"
else LCLDir="/usr/lib/lazarus"
fi
echo "LAZTarget: $LCLDir"
 
# Building the IDE and LCL
OS="linux"
 
echo "Target operating system: $OS"
 
#
# Command line to build the sofware
VER=$(fpc -iW)
echo "Compiler version: $VER"
 
echo "Compiling project..."

Nun muss Lazarus gestartet und das Projekt geladen werden. Über "Projekt->Compilereinstellungen->Einstellungen Zeigen" werden die Eintellungen kopiert und in der "make.sh" nach der Zeile echo "Creating installer..." eingefügt. Nun muss noch jedes "/../../../../usr/lib/lazarus/" oder Ähnlich mit $LCLDir ersetzt werden. Jedes "i386-linux" oder ähnlich muss mit "$ARCH-$OS" überschrieben werden und am Ende der kopierten Zeile muss der Name der Lazarus-Projektdatei eingefügt werden, z.B. "project1.lpr"
Alternativ kann man jedoch auch die Zeile

Code: Alles auswählen

$LCLDir/lazbuild -B projektname.lpr
benutzen. Diese Methode bietet den Vorteil, dass man nicht immer die Buildoptionen manuell aktualisieren muss, wenn man das Projekt ändert. (lazbuild nimmt die aktuellen projekteinstellungen).
Manchmal verursacht der Befehl jedoch Probleme im Build Service.
Die "make.sh" wird gespeichert.
Nun wird die "install.sh" mit einem Texteditor geöffnet und folgender Inhalt eingefügt:

Code: Alles auswählen

#!/bin/bash
#
# Parses command line options. Currently supported options are:
# DESTDIR      Destination root directory
 
 
for arg; do
  case $arg in
    DESTDIR=*) DESTDIR=${arg#DESTDIR=};;
  esac;
done
 
#Strips the debug-infos (not necessary everytime!)
# (uncomment this line if you want to publish debug packages)
strip --strip-all "./project1"
 
# Does the install
echo "Installing application..."
#Add commands to copy your project-files here
echo "Installation done."
 

Zwischen den Letzten "echo"-Zeilen wird nun eingefügt, welche Dateien installiert werden sollen und welche Ordner erstellt werden sollen. Z.B. so:

Code: Alles auswählen

mkdir -p $DESTDIR/usr/share/listaller
mkdir -p $DESTDIR/usr/share/listaller/graphics
mkdir -p $DESTDIR/usr/share/listaller/graphics/categories
mkdir -p $DESTDIR/usr/share/listaller/lang
#Copy graphics
cp ./graphics/header.png $DESTDIR/usr/share/listaller/graphics/
cp ./graphics/mime-ipk.png $DESTDIR/usr/share/listaller/graphics/

Wichtig ist, dass das "$DESTDIR" nicht fehlt. Der Name des Projektes in der "strip"-Zeile muss natürlich auch angepasst werden.
Datei speichern und schließen.
Nun wird die "uninstall.sh" geöffnet und mit folgendem Inhalt versorgt:

Code: Alles auswählen

echo "Uninstallation started."
echo "Uninstalled."
 

Zwischen den "echo" Zeilen werden nun alle zuvor installierten Dateien und Ordner wieder entfernt. Z.B:

Code: Alles auswählen

rm -f /usr/share/listaller/graphics/header.png
rm -f /usr/share/listaller/graphics/mime-ipk.png
rm -f /usr/share/listaller/graphics/SetupImage.png
rmdir /usr/share/listaller

Datei speichern und schließen.
Zuletzt bekommt die Datei "clean.sh" folgenden Inhalt:

Code: Alles auswählen

#!/bin/bash
rm -rf *.o
rm -rf *.ppu
 
rm -rf *.pas~
rm -rf *.sh~
rm -rf *.bak
 
rm -rf *~
rm -rf *.log
rm -rf project1
 

Hier muss das "project1" durch den Namen des Projektes ersetzt werden.

3. Projekt packen
Der Projektordner wird nun ein eine *.tar.gz Datei gepackt.
Im buildService wird diese Datei dann über "Add file" zum Paket hinzugefügt.

4. .spec-Datei erstellen
Eine neue Datei mit dem Namen "project1.spec" wird erstellt. (project1 mit dem Projektnamen ersetzen)
Sie könnte z.B. folgenden Inhalt haben:

Code: Alles auswählen

Name:             myproject-gtk
Version:          1.0
Release:          0
License:          GPLv3 and LGPLv3
BuildRoot:        %{_tmppath}/build-%{name}-%{version}-%{rel}
BuildRequires:    fpc, lazarus, wget, glib2-devel, gtk2-devel, glib-devel, glib2, glib, fpc-src, gtk2, xorg-x11-devel, gdk-pixbuf, gdk-pixbuf-devel
Source0:          project1.tar.gz
Requires:         gtk2, cairo, glib2, gdk-pixbuf, xdg-utils, glib
Group:            Applications/Other
Summary:          Sample application
Vendor:           Me!
 
%description
Description of your Project
 
%prep
%setup -c
 
%build
make all
 
%install
./install.sh DESTDIR=%{_tmppath}/build-%{name}-%{version}-%{rel}
 
%clean
make clean
 
%files
%defattr(-,root,root)
%dir "/"
 

Die Werte werden entsprechend angepasst. Wenn Qt4 Anwendungen gebaut werden sollen, muss das Paket libqt4intf zu den "Build-Requires" hinzugefügt werden. Auf die Erstellung von .spec-Dateien gehe ich hier nicht näher ein, für mehr Informationen und eine gute Anleitung gibt's auf dieser Seite: SPEC-File erstellen

5. Bauen
Mit einem Klick auf "Home-Project" gelangt man wieder zum Home-Projekt zurück. Nun klickt man auf der Rechten Seite auf "Add repository" und wählt eine Distribution aus, für die ein RPM-paket erstellt werden soll. Das kann man auch mehmals tun. Der Build Service erstellt nun automatisch ein RPM-Paket und eine Paketquelle für das Projekt. - Fertig.

6. Ausblick
Das war natürlich längst nicht alles, was der Build Service kann. Man kann z.B. auch DEB-Pakete erstellen, ich arbeite allerdings noch daran, dass dies auch für Lazarus-Anwendungen möglich ist. Für mehr informationen sind die openSUSE-Wiki Seiten hervorragend geeignet.
Mit der Lazarus-Implementierung können im Moment nur GTK, GTK2 und Qt4-Anwendungen für Fedora und Mandriva gebaut werden.
Wenn man die Buildscripte erstellt
Fragen/Verbesserungsvorschläge zu diesem HowTo sind sehr Willkommen!
Dateianhänge
BSTemplates.tar.gz
Templates, um Lazarus-Projekte für den Build Service vorzubereiten.
(1.48 KiB) 253-mal heruntergeladen
Zuletzt geändert von Targion am Di 11. Aug 2009, 18:27, insgesamt 3-mal geändert.

Giantics
Beiträge: 88
Registriert: Sa 3. Mär 2007, 13:46
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Langenbrettach

Re: [HowTo]: Lazarus-Projekte im Build Service bauen

Beitrag von Giantics »

Vielen Dank für die Anleitung.

Mir ist gerade was aufgefallen: Wenn ich das fpc-Paket von "home:lintns:Lazarus" linke, dann funktioniert der Paketbau nur für Fedora.
Bei allen SuSE-Versionen kommt als Meldung beim fpc-Paket: "expansion error, nothing provides fpc".
(siehe https://build.opensuse.org/project/moni ... asyMP3Gain)
Wenn ich fpc jedoch von "home:lintns:listaller" linke, dann funktioniert das zumindest. Irgendwie seltsam.
Hast du an der Version noch etwas geändert?

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: [HowTo]: Lazarus-Projekte im Build Service bauen

Beitrag von monta »

Besten Dank.

Ich verschieb das später wohl mal in die WissensDB.
Johannes

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: [HowTo]: Lazarus-Projekte im Build Service bauen

Beitrag von Targion »

@Giantics: Das ist seltsam... Funktioniert das Bauen von openSUSE 10.3 Anwendungen mit der home:lintns:Lazarus fpc Methode? Wenn ja, weiß ich woran das liegt und werde mich um den Fehler kümmern. Wenn nicht... Mal sehen..
monta hat geschrieben:Ich verschieb das später wohl mal in die WissensDB.

Gute Idee, aber noch nicht sofort, da ich wahrscheinlich noch einiges am Howto ändern/ergänzen werde. Wenn das in der WissensDB ist geht das ja nicht mehr, oder?

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: [HowTo]: Lazarus-Projekte im Build Service bauen

Beitrag von Euklid »

Danke für die ausführliche Anleitung!

Giantics
Beiträge: 88
Registriert: Sa 3. Mär 2007, 13:46
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Langenbrettach

Re: [HowTo]: Lazarus-Projekte im Build Service bauen

Beitrag von Giantics »

Targion hat geschrieben:@Giantics: Das ist seltsam... Funktioniert das Bauen von openSUSE 10.3 Anwendungen mit der home:lintns:Lazarus fpc Methode?


Nein, alle openSuSE-Distris funktionieren dann nicht. Kann man sehr einfach testen. Ich habe einfach ein neues Subprojekt (home:Giantics:test1) angelegt und darin NUR das fpc-Package von "home:lintns:Lazarus" verlinkt, dann die Distributionen hinzugefügt.
Vielleicht hat das was damit zu tun, dass nach dem Verlinken bei Files eine "_link" angezeigt wird, beim fpc vom listaller dagegen eine "_aggregate".

Nur Folgende Funktionieren:
Mandriva 2008/2007
Fedora 8/9

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: [HowTo]: Lazarus-Projekte im Build Service bauen

Beitrag von Targion »

Fedora 8 und Mandriva 2007 dürfen eigentlich nicht funktionieren. Die "_aggregate"-Methode nutze ich nur wegen der Geschwindigkeit, wenn das aber nur so geht, werde ich das später so ins Howto einfügen.
Danke für die Info!
P.S: 64bit Kompilierung läuft jetzt. Das Qt4-Interface ist etwas kniffelig, das kann noch ein bisschen dauern.

Giantics
Beiträge: 88
Registriert: Sa 3. Mär 2007, 13:46
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Langenbrettach

Re: [HowTo]: Lazarus-Projekte im Build Service bauen

Beitrag von Giantics »

Targion hat geschrieben:Fedora 8 und Mandriva 2007 dürfen eigentlich nicht funktionieren.


Ich habe gerade nochmal in mein Test-Repository reingeschaut und festegestellt, mittlerweile geht Mandriva nicht mehr (allerrdings anderer Fehler).
Fedora 8 bringt "succeded".
siehe hier: https://build.opensuse.org/project/moni ... cs%3Atest1


Targion hat geschrieben:P.S: 64bit Kompilierung läuft jetzt. Das Qt4-Interface ist etwas kniffelig, das kann noch ein bisschen dauern.


Super, habe gerade gemerkt, dass von meinem Projekt das 64-bit Paket automatisch erstellt wurde. Danke!
Wenn dann noch demnächst das deb-System funktioniert, dann bau ich dir hier einen Schrein auf ;-)

Giantics
Beiträge: 88
Registriert: Sa 3. Mär 2007, 13:46
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Langenbrettach

Re: [HowTo]: Lazarus-Projekte im Build Service bauen

Beitrag von Giantics »

Der Build-Service ändert wohl bei jedem neues Erstellen des Paketes die Build-Nummer.
Im Log steht dann sowas:

Code: Alles auswählen

I have the following modifications for xxx.spec:
3c3
< Release: 1
---
> Release: 11.1


Kann man dieses automatische Ändern abstellen? Sonst ist man nach dem Testen mit dem ersten brauchbaren Package schon bei Nummer 1256 ;)

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: [HowTo]: Lazarus-Projekte im Build Service bauen

Beitrag von Targion »

Das ist, glaube ich, nicht möglich. Ganz einfach aus folgendem Grund: Der Build Service erstellt ja auch Paketquellen für die Distributionen. Wenn nun die releasenummer nicht erhöht würde, würden die neu erstellten Pakete ja auch nicht als Updates eingespielt.
P.S: Mal sehen, ob das Bauen von DEB-Paketen bald geht :wink: Erste Tests waren schon erfolgreich.

EDIT: Das Bauen von Qt4-Anwendungen mit Lazarus ist jetzt möglich! Details dazu werde ich später veröffentlichen.

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: [HowTo]: Lazarus-Projekte im Build Service bauen

Beitrag von Targion »

So, aktuell können Qt4.5.1 und GTK2-Anwendungen für im BS gebaut werden. Leider im Moment nur für Fedora 11 und Mandriva 2009.1, aber immerhin.
(Das hängt einzig mit der Qt4 implementierung zusammen, GTK2 würde auf allen Platformen gehen) Zum einsatz kommt dabei ein etwas modifiziertes Lazarus 0.9.27-SVN.

Giantics
Beiträge: 88
Registriert: Sa 3. Mär 2007, 13:46
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Langenbrettach

Re: [HowTo]: Lazarus-Projekte im Build Service bauen

Beitrag von Giantics »

Targion hat geschrieben:So, aktuell können Qt4.5.1 und GTK2-Anwendungen für im BS gebaut werden. Leider im Moment nur für Fedora 11 und Mandriva 2009.1, aber immerhin.
(Das hängt einzig mit der Qt4 implementierung zusammen, GTK2 würde auf allen Platformen gehen) Zum einsatz kommt dabei ein etwas modifiziertes Lazarus 0.9.27-SVN.


Vielen Dank!
Dann kann ich demnächst wieder anfangen mit dem Paketbauen.
Kann man dann im BS GTK2-Anwendungen auch für Debian-Systeme bauen?

Gruß
Thomas

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: [HowTo]: Lazarus-Projekte im Build Service bauen

Beitrag von Targion »

Theoretisch ja. Allerdings muss man dazu extra noch ein Debian-Paket für sein Projekt bauen und die Debianisierten Sourcen dann hochladen.
Meine Lazarus-Paketierung erlaubt das Erstellen von DEB Paketen für Ubuntu 9.04 und Debian 5.0 (Lenny)

Giantics
Beiträge: 88
Registriert: Sa 3. Mär 2007, 13:46
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Langenbrettach

Re: [HowTo]: Lazarus-Projekte im Build Service bauen

Beitrag von Giantics »

OK, dann teste ich das mal :)

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: [HowTo]: Lazarus-Projekte im Build Service bauen

Beitrag von Targion »

Also, die Debian-Builds von Lazarus und FPC funktionieren im BS nicht richtig (fehlende Abhängigkeiten) wenn das von den BS-Entwicklern repariert wird, sollte es aber problemlos möglich sein, DEB-Pakete zu bauen.
(Hintergrund ist, dass nicht alle Repositories für DEB basierende Systeme zu Verfügung stehen)

Antworten