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.

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...

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
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

Jetzt sind die Scripte installiert, jedoch nicht die Desktop Dateien. Diese erstellen wir nun mit der Specfile.

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
[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.

mkdir -p %{buildroot}%{_datadir}/kde4/services/ServiceMenus
Erstellt den Ordner ServiceMenus in /usr/share/kde4/services
%__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.

%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 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
pic

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.

pic

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/

pic

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.