Ein einfaches RPM Paket für PCLinuxOS erstellen
von Daniel Meiß-Wilhelm (Leiche)
In der letzten Ausgabe kreierten wir ein Servicemenu für KDE4 in PCLinuxOS. Wir stellen fest, das es sauber arbeitet und wollen es nun mit anderen PCLinuxOS Benutzer teilen. Doch wie können wir dieses erreichen?
Als erstes sollten Sie folgendes lesen:
Ausgabe 30 von Juli 2009, Seite 8.
Neal beschreibt das erstellen von RPM Paketen. Befolgen Sie seine Ratschläge, er schreibt über die Befehle in den Specfiles, wie die Befehle arbeiten und wie die Specfile strukturiert werden sollte.
Ich habe eine unausgefüllte Specfile mit den meisten Befehlen zum bilden eines Paketes in meinem Arbeitsverzeichnis abgespeichert.
%define prefix /usr %define name %define version %define release %mkrel 1 %define url Name: %{name} Version: %{version} Release: %{release} License: Group: URL: %{url} Source: Summary: Summary(de): BuildRoot: %{_tmppath}/%{name}-buildroot BuildRequires: Requires: Obsoletes: %name < %version %description #german %description -l de %prep %setup -q -n %{name}-%{version} %build cmake . -DCMAKE_INSTALL_PREFIX=/usr %make %install rm -rf $RPM_BUILD_ROOT %makeinstall_std %post %{update_menus} %{update_desktop_database} %postun %{clean_menus} %{clean_desktop_database} %files %defattr(-,root,root) %{_bindir}/%{name} %clean rm -rf %{buildroot} rm -rf $RPM_BUILD_DIR/%{name}-%{version} %changelog
Wir werden nun die freien Zeilen füllen. Ich füge die Informationen für den Zip_Player kursiv hinzu.
- %define prefix /usr
- Wohin es installiert werden soll, folglich in /usr
- %define name Zip_Player
- geben Sie den Namen des Pakets ein
- %define version 0.1
- Die aktuelle Version Ihres Programms
- %define release %mkrel 3
- wird für das erneute erstellen eines aktuellen Paketes benötigt. Von Zip_Player ist das aktuell lautende Release 0.1-4 in den Repositories.
- %define url
- http://kellerleiche.bplaced.net — füge deine Webseite oder ähnliches ein, als Beispiel: sourceforge
Die Kopfzeilen sind fertig, jedoch können wir weiteres hinzufügen. Wir haben die Makros definiert und können nun mit diesen arbeiten.
Nun ist es Zeit die Inhalte für unser Paket zu bestimmen.
- Name: %{name}
- Mit dem %{name} Makros legen wir den Namen unseres Paketes fest
- Version: %{version}
- Version hat die gleiche Funktion wie beim Namen
- Release: %{release}
- Release hat die gleiche Funktion wie beim Namen
- License: GPL
- Welcher Lizenz unser Programm unterliegt
- Group: Sound
- in welcher Kategorie es im Pakete Manager angezeigt werden soll
- URL: %{url}
- URL hat die gleiche Funktion wie beim Namen
- Source: %{name}-%{version} .tar.gz
- In welchem Archiv Container das Programm/Source liegt
- Summary: Zip_Player plays Your music in zip-archive
- Inhaltliche Kurzfassung des Programms
- Summary(de): Zip_Player spielt Musik aus Zip Archive
- Inhaltliche Kurzfassung des Programms in Deutsch, (weitere Sprachen können ebenfalls hinzugefügt werden)
- BuildRoot: %{_tmppath}/%{name}-buildroot
- wo das Paket erstellt werden soll
- Requires: xmms, unzip, zenity,
- weitere Pakete die für den Ablauf dieses Programms benötigt werden
- Obsoletes: %name < %version
- löscht die ältere Version eines Paketes
- %description Zip Player XMMS plays Your music in zip-archive. (Created by leiche)
- die Beschreibung des Pakets
- #german %description -l de Zip Player XMMS spielt Musik aus Zip Archive. (Erstellt von leiche)
- für die deutschen Benutzer, die Beschreibung in deutsch für Synaptic oder Smart Pakete Management.
- rm -rf $RPM_BUILD_ROOT
- Sollte eine älteres Build im buildroot Verzeichnis existieren, so wird es gelöscht, somit bekommen wir keine Fehler wenn wir ein neues Paket erstellen.
- install -d -m 755 $RPM_BUILD_ROOT%{_bindir}
- Das Verzeichnis, in dem das kompilierte Paket installiert werden soll (/usr/bin) und die Berechtigung für das installierte Paket
- install -m 755 zip_player.sh zip_player $RPM_BUILD_ROOT%{_bindir}
- Was installiert werden soll (zip_player.sh zip_player) und die Berechtigung für das installierte Paket
- mkdir -p %{buildroot}%{_datadir}/applications
- Erstellt den Ordner der Anwendung in /usr/share/. Das ist der Pfad für alle Desktop Dateien die im Startmenü angezeigt werden.
- cat > %{buildroot}%{_datadir}/applications/%{name}.desktop
- EOF
- mkdir -p %{buildroot}%{_datadir}/kde4/services/ServiceMenus
- Erstellt den Ordner ServiceMenus in /usr/share/kde4/services
- %files
- %defattr(-,root,root)
- Diese Funktion definiert die Berechtigung und Eigenschaften.
- %{_bindir}/zip_player
- Installiert den zip_player in /usr/bin.
- %{_bindir}/zip_player.sh
- Gleiche Funktion wie zip_player.
- %{_datadir}/applications/%{name}.desktop
- Installiert die Desktop Datei in /usr/share/applications, die anschließend im Startmenü angezeigt wird.
- %{_datadir}/kde4/services/ServiceMenus/%{name}.desktop
- Installiert die Desktop Datei in /usr/share/services/ServiceMenus, die anschließend im Rechtsklick Menü von KDE4 angezeigt wird.
Nun haben wir die Inhalte zusammen und können das Paket für PCLinuxOS erstellen.
Mit dem Befehl
%prep %setup -q -n %{name}-%{version}
wird das Archiv in das Verzeichnis BUILD entpackt.
Welche Archive werden benötigt?
Wir müssen ein tar.bz2 oder tar.gz Archiv für die Scripte und die .desktop Datei erstellen. Jedoch benötigen wir nur die Scripte die unser Programm bearbeitet. Wieso nur die Script Dateien? Die Antwort folgt später.
Um ein Archiv zu erstellen, generieren wir einen Ordner mit dem Namen zip_player-0.1. In diesen speichern wir die Scripte, klicken Sie mit der rechten Maustaste auf den Ordner. Im Rechtsklick Menü finden wir den Eintrag Komprimieren >> KomprimierenAlsTar. Nutzen Sie diese Option und das Archiv zip_player-0.1.tar.gz wird erstellt. Dies muß nur noch in den Ordner SOURCES in unserem RPM Verzeichnis gespeichert werden.
Nun wird unser Archiv das Verzeichnis BUILD zur Installation in das Verzeichnis buildroot entpacken, welches das Verzeichnis /tmp ist.
Nun ist aber unser Programm reiner Source Code, und kein ausführbarer Code. Deshalb müssen wir zunächst eine ausführbare Datei aus unserem Source Code mit cmake, oder configure und make kompilieren, bevor wir sie installieren können. Unsere Anwendung benötigt jedoch keine Kompilierung und wir können die folgenden Zeilen aus unserer Specfile entfernen.
%build cmake . -DCMAKE_INSTALL_PREFIX=/usr %make
Meiner Meinung nach, können wir direkt install verwenden...
%install
Jetzt sind die Scripte installiert, jedoch nicht die Desktop Dateien. Diese erstellen wir nun mit der Specfile.
[Desktop Entry] Name=Zip Player XMMS Name[de]=Zip Player XMMS Comment=plays music in zip archives Comment[de]=spielt Musik aus den ZIP Archiven Exec=%{_bindir}/zip_player.sh Icon=xmms.png Terminal=false Type=Application Categories=Categories=Application;X-MandrivaLinux-Multimedia Sound;AudioVideo;Audio ServiceTypes=zip Encoding=UTF-8 EOF
cat erstellt die Desktop Datei Zip_Player.desktop im Verzeichnis /usr/share/applications/. Zwischen EOF steht was in der Zip_Player.desktop Datei stehen soll
Nun fügen wir das Servicemenü für KDE4 im Verzeichnis /usr/share/kde4/services/ServiceMenus hinzu.
%__cat > %{buildroot}%{_datadir}/kde4/services/ServiceMenus/%{name}.desktop << EOF [Desktop Entry] Type=Service Name=%{name} Encoding=UTF-8 ServiceTypes=application/zip Actions=zip_player X-KDE-ServiceTypes=KonqPopupMenu/Plugin MimeType=zip;ZIP; Icon=xmms.png [Desktop Action zip_player] Name=Zip Player XMMS GenericName=Zip_Player Exec=zip_player Icon=xmms.png EOF
cat generiert die Desktop Datei zip_player in /usr/share/kde4/services/ServiceMenus.
%post %{update_menus} %{update_desktop_database} %postun %{clean_menus} %{clean_desktop_database}
Texstar sagte, dass %post und %postun nur benötigt wird, falls Ihr Paket Bibliotheken in /usr/lib installiert, und Sie benötigen dies zur Registrierung oder Nicht-Registrierung für Ihre Installation. Jedoch ist die Specfile frei von Bibliotheken und es werden die Menüs, sowie die Desktop Datenbank aktualisiert. Wird es benötigt? Ich weiß es nicht, aber es scheint auch nicht zu stören.
Letztendlich, sind nun alle Daten die in dem Paket enthalten sind definiert.
Nun zum Changelog, hier wird eingeschrieben was alles geändert oder hinzugefügt wurde und von wem.
%changelog * Wed May 26 2010 Texstar <texstar at gmail.com> 0.1-4pclos2010 - fix rpm/synaptic group Sound * Sat May 08 2010 leiche <meisssw01 at aol.com> 0.1-3pclos2010 - Open Browser filtering *.zip files - added correct name of Zip Player in Zip Player XMMS * Wed Apr 28 2010 leiche <meisssw01 at aol.com> 0.1-2pclos2010 - shows servicemenu only for zipfiles - change file open browser from kdialog to zenity * Thu Mar 04 2010 leiche <meisssw01 at aol.com> 0.1-1pclos2010 - created for pclinuxos
Nun wird es Zeit das Paket zu erstellen. Wir öffnen eine Konsole/Terminal im Verzeichnis /home/daniel/src/rpm/SPECS/, und schreiben den folgenden Befehl:
rpm -ba Zip_player.spec
Wir haben unsere Specfile noch nicht in rpm/SPECS/ gespeichert, so machen wir dies, bevor wir eine Konsole öffnen und nennen die Datei Zip_Player.
Wenn das Paket fehlerfrei erstellt wurde, ist das Ergebnis ein Paket namens Zip_Player-0.1-4pclos2010.i586.rpm. in /home/daniel/src/rpm/RPMS/i586/
Anmerkung: Ich bin absoluter Anfänger in Sachen RPM Paketebau und das Tutorial geht nicht bis ins kleinste Detail. Um mehr über die Erstellung von RPM Paketen zu lernen, besuchen Sie die folgende Seite:
http://www.pclinuxos.com/forum/index.php/board,55.0.html.
Zu guter letzt, ich hoffe das es für den einen oder den anderen hilfreich im Umgang mit Scripten, ServiceMenus und RPMs unter PCLinuxOS ist.
Viel Glück.