Ich nutze seit längerem ArchLinux und es hat sich darum eine große Community gebildet. So entstand das Arch User Repository (AUR) in welches die Benutzer eigene Pakete zum Installieren hochladen können. Ich möchte hier eine Anleitung geben, wie man ein eigenes Paket erstellt und dorthin hoch lädt.
Vorbereitungen
Wenn wir eine Software im AUR bereitstellen möchten, dann sollten wir diese Software mindestens einmal bei uns installiert haben und diese sollte nicht bereits im AUR vorhanden sein.
Bevor man sein Paket hochladen kann, muss man dieses zunächst lokal bei sich bauen. Dazu legen wir uns einen Unterordner im Homeverzeichnis an:
mkdir ~/builds
In diesem Verzeichnis legen wir dann für jedes Paket einen Unterordner an. Für unser kleines Beispielprojekt erstellen wir einen Ordner „helloworld“:
mkdir ~/builds/helloworld
PKGBUILD schreiben
Als nächstes müssen wir eine Datei namens „PKGBUILD“ anlegen und diese füllen. Hier gibt es verschiedene Variablen, welche wir zunächst belegen sollten:
#Maintainer: <BENUTZER> <EMAIL> pkgname=helloworld #Paketname pkgver=20130314 #Versionsnummer ggf. Datum pkgrel=1.0 #Releaseversion pkgdesc="Simple helloworld" #Helloworld arch=('any') #Alle Architekturen nutzbar url="http://technik.blogbasis.net" #URL des Projekts license=('GPL') #Licence #depends=('curl') #Abhängigkeiten des Programms ; Hier: Keine
makedepends=('wget') #Abhängigkeiten zum erstellen des Paketes
Ich hoffe die Kommentare sind selbsterklärend. Ansonsten findet man unten entsprechende Lektüre. Als nächstes werden wir die folgenden Variablen in der PKGBUILD nutzen:
- $srcdir => Ordner in dem der Quelltext hingeladen werden sollte
- $pkgdir => Kann als späterer Rootordner angesehen werden
Variablen im PKGBUILD sollten nach dem Wiki mit einem Unterstrich eingeleitet werden, damit diese keine Konflikte mit anderen Variablen erzeugen. Es fehlen uns noch zwei Funktionen im PKGBUILD, nämlich „build()“ und „package()“. In der build()-Funktion werden wir den Quelltext herunterladen.
_srcURL="http://uploads.blogbasis.net/helloworld.txt"
build() {
rm -rf $srcdir/$pkgname-$pkgver
mkdir $srcdir/$pkgname-$pkgver
wget $_srcURL -O $srcdir/$pkgname-$pkgver/helloworld.sh
cd $srcdir/$pkgname-$pkgver
}
Wir haben also die URL zu dem Shell-Script als eigene Variable angelegt. In der build()-Funktion erstellen wir zunächst den Zielordner und laden daraufhin per wget das File in den Zielordner herunter. Zuletzt wechseln wir in den Zielordner, da darin unsere package()-Funktion ausgeführt werden soll. Es folgt die package()-Funktion:
package() {
mkdir -p $pkgdir/usr/bin
cp "$srcdir/$pkgname-$pkgver/helloworld.sh" "$pkgdir/usr/bin/helloworld"
chmod +x $pkgdir/usr/bin/helloworld
}
Wir legen unser /usr/bin Verzeichnis in unserem FakeRoot-Ordner $pkgdir an. Dorthin wird dann entsprechend das Script kopiert und das Ausführungsrecht gesetzt. Später entspricht $pkgdir dem Rootordner, sodass das Script an der richtigen Stelle landet.
Sind nun diese Funktionen alle in der PKGBUILD vereint, so ist diese fertig und wir können uns an das erstellen der Pakete machen.
Paket schnüren
Wenn wir nun ein Paket erstellen möchten, dann führen wir einfach in unserem Ordner den Befehl „makepkg“ aus:
cd ~/builds/helloworld/
makepkg
Entstehen hierbei keine Fehler, dann können wir froh sein und mit dem nächsten Schritt fortfahren. Sollte makepkg jedoch einige Fehler werfen, dann muss man die PKGBUILD entsprechend ausbessern, sodass alles reibungslos abläuft.
Bevor wir mit den Paketen weiter hantieren sollten wir diese nochmal überprüfen. Wir installieren uns dazu „namcap“:
sudo pacman -S namcap
Danach überprüfen wir jeweils die PKGBUILD-Datei bzw. das erzeugte Paket.
namcap PKGBUILD
namcap helloworld-20130314-1.0-any.pkg.tar.xz
Wenn namcap nicht meckert und sich zufrieden gibt, dann haben wir gute Arbeit geleistet und kommen dem Upload ins AUR ein wenig näher. Andernfalls sollte man wieder in seine PKGBUILD schauen und die Fehler beheben. Nichts ists ärgerlicher, als wenn das zu installierende Programm nicht installierbar ist.
Das erzeugte Archiv kann man nun bereits per pacman installieren, jedoch nicht hochladen. Wer bis hierhin sein Paket installieren möchte, der kann den folgenden Befehl ausführen:
sudo pacman -U helloworld-20130314-1.0-any.pkg.tar.xz
Möchte man sein eigenes Paket wieder deinstallieren, dann ruft man entsprechend pacman auf:
sudo pacman -R helloworld
Wenn das Paket all diese Tests bestanden hat, dann können wir die Uploadversion erstellen. Dazu benötigen wir wieder makepkg, welches wir folgendermaßen aufrufen:
makepkg --source
Nun sollte unser Ordner ungefähr so ähnlich aussehen:
gehaxelt@LagTop [01:54:41] [~/builds/helloworld]
-> % ls
insgesamt 28K
drwxr-xr-x 4 gehaxelt users 4,0K 14. Mär 01:54 .
drwxr-xr-x 4 gehaxelt users 4,0K 14. Mär 01:33 ..
-rw-r--r-- 1 gehaxelt users 765 14. Mär 01:45 PKGBUILD
-rw-r--r-- 1 gehaxelt users 520 14. Mär 01:45 helloworld-20130314-1.0-any.pkg.tar.xz
-rw-r--r-- 1 gehaxelt users 551 14. Mär 01:54 helloworld-20130314-1.0.src.tar.gz
drwxr-xr-x 3 gehaxelt users 4,0K 14. Mär 01:45 pkg
drwxr-xr-x 3 gehaxelt users 4,0K 14. Mär 01:45 src
Der Upload ins AUR
Das zuletzt erstellte Archiv mit „.src.“ im Namen können wir dann ins AUR hochladen. Dazu müssen wir uns im AUR einen Account anlegen. Ist dies getan, gehen wir im Menü auf „Abschicken“, können dort eine Kategorie unseres Paketes, sowie das Paket auswählen und den Upload starten. Es wäre jedoch angebracht, dort nicht tausende helloworlds hochzuladen.
Ist das Paket hochgeladen, so findet man es sofort im yaourt. Ihr habt nun erfolgreich ein Paket erstellt und ins AUR hochgeladen. :)
Wichtige Lektüre
Im Wiki zum Arch bzw. AUR wird jedoch wichtige Lektüre genannt, um sich z.B. an Paketstandards zu halten. Einige Artikel dazu sind:
- https://wiki.archlinux.org/index.php/Arch_Packaging_Standards
- https://wiki.archlinux.org/index.php/Creating_Packages
- https://wiki.archlinux.org/index.php/Makepkg
- https://wiki.archlinux.org/index.php/PKGBUILD
- https://wiki.archlinux.org/index.php/AUR_User_Guidelines#Submitting_packages
- https://wiki.archlinux.org/index.php/Arch_User_Repository#Submitting_packages
Mein kleines Script
Ich habe heute ein kleines Shellscript geschrieben, welches verschiedene UserAgents der verschiedenen Bots/Betriebssysteme/Hardware ausgibt. Damit erspart man sich das C&P, wenn man z.B. mit curl einen bestimmten UserAgent annehmen möchte. Ihr könnt euch das Paket ja mal anschauen:
https://aur.archlinux.org/packages/useragent-git/
~ Sebastian