News | About | Get Frugalware | Packages | Documentation | Discussion Forums | Bug Tracker | Wiki | Community | Development

Package building / Pakete erstellen

From FrugalWiki

Jump to: navigation, search

Eigene Pakete erstellen

Im Grunde ist es nicht schwer, eigene Pakete zu erstellen, die sich mit pacman installieren lassen.

Eigentlich benötigt man dafür nur ein FrugalBuild Skript. So ein Skript erstellen wir jetzt mal. :)

Das FrugalBuild Skript kann, oder muss man ;) mit einem einfachen Texteditor erstellen. Für die Konsolenfanatiker empfiehlt sich Vim. Für die Mausschubser, zu denen ich mich zähle gibt es unter KDE KVim, oder (unabhängiger) GVim.

Natürlich kann man auch jeden anderen Editor verwenden. Ich gehe jetzt mal von Vim, bzw. [GK]Vim aus. Und in meinen Beispielen nehmen ich GVim, da er mein Standard-Editor ist.

Als erstes sollte man ein paar Einstellungen treffen, um die FrugalBuilds besser bearbeiten zu können. Das ist der Inhalt meiner ~/.vimrc.

au BufEnter FrugalBuild setlocal softtabstop=0
au BufEnter FrugalBuild setlocal shiftwidth=8
au BufEnter FrugalBuild setlocal ft=sh

Ob KVim ebenfalls auf die ~/.vimrc zugreift weiß ich nicht. Hab ihn selber noch nie verwendet. Auf die Bedeutung dieser Zeilen gehe ich jetzt nicht ein. Dies kann man in der Vim-Hilfe nachlesen.

Meine ganzen FrugalBuilds verstaue ich in ~/build. Für jedes Paket gibt es dort ein Verzeichnis. Als Beispiel nehme ich mal den Loginmanager Slim.

mkdir -p ~/build/slim

Und nun erstellen wir das FrugalBuild

gvim ~/build/slim/FrugalBuild

Die erste Zeile eines FrugalBuilds enthält immer das Datum und die Zeit der letzten Änderung. Makepkg aktualisiert diese Zeile zwar immer, sie muss aber bei einem "frischen" FrugalBuild angelegt werden.

Das korrekte Format erhält man mit dem Befehl

date -R

Dies ist dann die Ausgabe

Tue, 01 Nov 2005 18:44:34 +0100

Also ist die erste Zeile unseres FrugalBuilds

# Last Modified: Tue, 01 Nov 2005 18:44:34 +0100

In der zweiten Zeile vermerkt man die Zeit, die benötigt wird um das Paket zu erstellen. Ist für den hauseigenen Gebrauch aber nicht nötig. Daher nehmen wir 0. :)

# Compiling time: 0 SBU

Derjenige, der für das Paket zuständig ist, oder das FrugalBuild zur Verfügung gestellt hat, wird in die dritte Zeile geschrieben.

Wenn Du selber das FrugalBuild Skript warten wirst, schreibst Du dies:

# Maintainer: Name <ich@domain.de>

Anstelle von "Name" natürlich Deinen Namen oder irc Nick. Letzteres ist eigentlich üblich. Sofern Du Einen hast. :)

Wenn Du das FrugalBuild uns zur Verfügung stellen möchtest, damit wir das Paket offiziell ins Repo aufnehmen:

# Contributor: Name <ich@domain.de>

Danach folgt eine Leerzeile.

Nun kommt der Name des Paketes.

pkgname=slim

Die Version des Programms

pkgver=1.2.3

Jetzt die Version des Paketes. Diese fängt \\\immer\\\ bei 1 an.

pkgrel=1

Der nächste Eintrag ist eine Beschreibung des Programms und sollte nicht länger als 80 Zeichen sein.

pkgdesc="SLiM is a Desktop-independent graphical login manager for X11"

Für den Hausgebrauch kann die Beschreibung natürlich auch in deutsch sein. Nur bei offiziellen Pakten muss sie in englisch sein.

Damit man auch weiß, wo im Internet man das Programm findet, kann man auch die Homepage eintragen.

url="http://slim.berlios.de/"

Um sofort sehen zu können, ob man das Paket problemlos weitergeben kann, kann man auch die Lizenz, der die Software unterliegt angeben.

license="GPL2"

Manchmal ist es notwendig, dass vor oder nach der Installation/Deinstallation oder dem Update noch etwas gemacht wird. Zum Beispiel Konfigurationsdateien anpassen. Dafür kann man diesen Eintrag verwenden.

install=$pkgname.install

Das Format eines Installations-Skriptes schreibe ich in einen anderen Artikel.

Da es \\\sehr\\\ umständlich sein kann sämtliche Pakete auf Aktuallität zu prüfen, bieten FrugalBuild eine nette Hilfe an: Die Zeile up2date.

In diese Zeile wird ein Shell-Befehl geschrieben, der die aktuelle Version von der Homepage des Programms ausliest. Diese Zeile wird dann immer geprüft, wenn makepkg ausgeführt wird. Oder wenn man mehrere Skripte in einem Verzeichnis prüfen will:

chkworld ~/build

In unserem Beispiel sieht die up2date Zeile so aus.

up2date="lynx -dump $url|grep 'Latest release'|grep -o '[0-9][0-9\.]\+'"

Nun kommt eines der wichtigsten Einträge überhaupt. Die Liste mit den Quelldateien.

source=(http://download.berlios.de/$pkgname/$pkgname-$pkgver.tar.gz)

Damit makepkg prüfen kann, ob man ein korrektes Archiv herunter geladen hat, wird das Archiv, oder die Quellen mit sha1sum überprüft.

sha1sums=('d7e63bcfc1547a8677c0aec84853924f1652cb5f')

Am Einfachsten benutzt man dafür

makepkg -g

Die Ausgabe kann man dann ganz einfach ins FrugalBuild übernehmen oder mit

makepkg -G

automatisch eintragen lassen.

Als nächstes kann man Gruppen definieren, in die das Paket in der pacman Datenbank eingeordnet wird. Ich benutze dafür immer 'mh' (Marcus Habermehl). Wenn man offizielle Gruppen nehmen möchte, kann man sich eine Liste mit

pacman -Sg

anzeigen lassen.

Gruppen, die mit -extra enden unterscheiden sich nicht mit denen ohne -extra. Das -extra steht in dem Fall nur für das extra Repo.

Für Slim habe ich 'x11' genommen.

groups=('x11')

Die nächste Zeile ist eine Liste mit Architekturen, für die das Paket zur Verfügung steht. Momentan gibt es i686 und x86_64.

Mein Slim-Paket existiert derzeit nur für i686. Also

archs=('i686')

Jetzt müssen wir noch Abhängigkeiten definieren. Da man selten genau weiß, welche Pakete wirklich benötigt werden, kann man wieder makepkg zu Hilfe nehmen.

makepkg -a

Nach dem das Paket erstellt wurde, gibt makepkg eine Liste mit Paketen aus, von denen unser Slim-Paket abhängt.

Allerdings muss man dann das Paket noch mal \\\mit\\\ der Liste von Abhängigkeiten neu erstellen.

depends=('libjpeg' 'x')

Wenn das Paket Kofigurations-Dateien enthält, kann man angeben, dass diese von pacman weder überschrieben noch gelöscht werden. Außer man gibt dies bei der (De-) Installation explizit an.

backup=(etc/slim.conf)

Bei einer Deinstallation wird diese Datei als /etc/slim.conf.pacsave gespeichert. Bei einem Update würde die alte Konfigurationsdatei bestehen bleiben und die neue als /etc/slim.conf.pacnew installiert.

Es gibt noch das Feld conflicts. In diesem Feld kann man Pakete definieren, mit denen unser Slim-Paket im Konflikt steht.

Würde das Slim-Binary zum Beispiel nicht als /usr/bin/slim sondern als /usr/sbin/gdm installiert, müssten wir unserem FrugalBuild diese Zeile hinzufügen.

conflicts=('gdm')

Noch haben wir das Feld provides. Das beste Beispiel für diese Feld sind xorg und xfree. Keines der Frugalware-Pakete hängt von xorg ab. Immer nur von x. Das kommt daher, dass das xorg FrugalBuild diese Zeile enthält.

provides=('x')

Dadurch spielt es keine Rolle, ob man xorg oder xfree installiert hat. Die Abhängigkeiten werden so immer erfüllt. Sonst müsste man jedes Paket einmal mit der Abhängigkeit xorg und einmal mit xfree erstellen.

Für den Fall, dass die Entwickler von Slim den Namen des Programms ändern ist auch vor gesorgt.

Nehmen wir mal an, dass die Vorgängerversion von Slim einfach nur slm hieß. Dann würden wir dem FrugalBuild diese Zeile hinzufügen.

replaces=('slm')

Das wären schon mal die Informationen, die pacman später braucht.

Ab jetzt gehe ich davon aus, dass du pacman-tools installiert hast. Dieses Paket enthält nämlich ein Skript mit sehr nützlichen Funktionen. Die sogenannten F-Befehle, oder F-Makros.

Ich denke mal, wenn man sich das Skript (/usr/lib/frugalware/fwmakepkg) ansieht, sieht man auch, was hinter den einzelnen Befehlen steckt.

Wenn unser Paket (also Slim) einfach mit dem berühmten Dreisatz

./configure
make
make install

zu installieren ist, ist unser FrugalBuild fertig. :) Denn makepkg geht von dieser Methode aus, wenn keine build() Funktion angegeben ist.

Da mein Slim-Paket aber ein offizielles Paket werden soll, musste ich noch etwas an der optimierung schrauben. :)

Also habe ich diese build() Funktion angegeben.

build()
{
    Fsed '^CFLAGS=' 'CFLAGS+=' Makefile
    Fbuild
}

Fsed ist einer dieser F-Makros. Eine einfachere Variante für sed.

Und Fbuild ist dieser berühmte Dreisatz. Denn man nun mal braucht, sobald man eine build() Funktion angibt.

Bei Frugalware wird ./configure aber gleich passende Parameter mit gegeben. Fbuild fährt den Dreisatz so aus.

./configure --prefix=/usr --sysconfdir=/etc
make
make DESTDIR=$Fdestdir install

$Fdestdir wäre in unserem Fall ~/build/slim/pkg.

Hat man jetzt alles wichtige zusammen, kann man das FrugalBuild speichern und den Editor beenden.

Als nächstes erstellen wir jetzt unser Paket und fragen gleichzeitig die Abhängigkeiten ab.

makepkg -ac

Die Option -c bewirkt, dass temporäre Sachen wie src/ pkg/ oder das Log gelöscht werden.

Nach gewisser Zeit erhalten wir dann die Ausgabe mit den Abhängigkeiten.

depends=('libjpeg' 'x')

Bereits vorformatiert, so dass man es einfach in das FrugalBuild kopieren kann.

Jetzt noch einmal

makepkg -cf

und man hat ein eigenes Paket, dass man mit

pacman -A <Paket>.fpm

installieren kann.

-f bei makepkg bewirkt, dass ein vorhandenes Paket überschrieben wird.

Hier mal mein komplettes FrugalBuild für Slim.

# Last Modified: Tue, 25 Oct 2005 21:45:17 +0200
# Compiling Time: 0.06 SBU
# Maintainer: BMH1980 <bmh1980de@yahoo.de>

pkgname=slim
pkgver=1.2.3
pkgrel=1
pkgdesc="SLiM is a Desktop-independent graphical login manager for X11"
url="http://slim.berlios.de/"
license="GPL2"
install=$pkgname.install
up2date="lynx -dump $url|grep 'Latest release'|grep -o '[0-9][0-9\.]\+'"
source=(http://download.berlios.de/$pkgname/$pkgname-$pkgver.tar.gz)
sha1sums=('d7e63bcfc1547a8677c0aec84853924f1652cb5f')
groups=('x11')
archs=('i686')
depends=('libjpeg' 'x')
backup=(etc/slim.conf)

build()
{
    Fsed '^CFLAGS=' 'CFLAGS+=' Makefile
    Fbuild
}

# vim: ft=sh

# optimalization OK

Und um es sich schon mal anzuschauen auch das Install-Skript slim.install

post_install()
{
    if ! grep -q 'desktop="/usr/bin/slim -d"' /etc/sysconfig/desktop ; then
        echo '#desktop="/usr/bin/slim -d"' >> /etc/sysconfig/desktop
    fi
}

post_remove()
{
    sed -i '/desktop="\/usr\/bin\/slim -d"/ d' /etc/sysconfig/desktop
}

op=$1
shift

$op $*

# vim: ft=sh

Alternativ gäbe es noch

pre_install()
pre_remove()
pre_update()
post_update()
Personal tools
Namespaces
Variants
Actions