Quand vous construisez un paquetage pour Arch Linux, vous devez adhérer à la ligne de conduite des paquetages, particulièrement si vous voulez distribuer votre paquetage à la communauté Arch Linux.
/etc. Si il y a plus d'un fichier de configuration, il est recommandé d’utiliser un sous-répertoire pour conserver /etc le plus sain possible. Utilisez /etc/{pkgname}/ où {pkgname} est le nom du paquetage ou de référence (ex, apache utilise /etc/httpd/). /etc Fichiers de configuration **indispensables** au système
/usr/bin Applications binaires
/usr/sbin Binaires du système
/usr/lib Bibliothèques
/usr/include Fichiers d’en-têtes
/usr/lib/{pkg} Modules, plugins, etc.
/usr/share/doc/{pkg} Documentation d’application
/usr/share/info Système de fichier GNU Info
/usr/share/man Pages de man
/usr/share/{pkg} Données des applications
/var/lib/{pkg} Stockage persistant d’application
/etc/{pkg} Fichiers de configuration pour {pkg}
/opt/{pkg} Gros paquetages autonomes comme KDE, Mozilla, etc.
voir le wiki « comprendre les dossiers »
/dev/home/media/mnt/proc/root/selinux/sys/tmp/var/tmpQuand vous utilisez makepkg pour construire un paquetage, voilà ce qu’il fait automatiquement :
/usr/doc, /usr/info, /usr/share/doc, et /usr/share/info dans le paquetage./usr/localpatch -Np1 -i ../patchfile.patch || return 1 make || return 1 make DESTDIR=$pkgdir install || return 1
_customvariable=
AUR ne peut détecter l’utilisation de variables personnelles et ne peut pas les utiliser dans les substitutions. Cela est particulièrement valable pour le champ source. Ex :
http://downloads.sourceforge.net/sourceforge/directxwine/$patchname.$patchver.diff.bz2
Un tel fonctionnement supprime les fonctionnalités de AUR.
/usr/libexec/ pour n’importe quoi. Utilisez plutôt /usr/lib/{pkg}.packager compris dans le meta-fichier peut être personnalisé par le constructeur du paquetage en modifiant l'option appropriée dans le fichier /etc/makepkg.conf ou bien en exportant la variable d’environnement PACKAGER avant de construire le paquetage avec makepkg :# export PACKAGER="John Doe@your.email"
optdepends=('cups: printing support'
'sane: scanners support'
'libgphoto2: digital cameras support'
'alsa-lib: sound support'
'giflib: GIF images support'
'libjpeg: JPEG images support'
'libpng: PNG images support')
L’exemple ci-dessus est tiré du paquetage wine de extra. Les informations de optdepends sont automatiquement affichées à l’installation/mise à jour à partir de pacman 3.2.1, vous ne devez donc plus garder ce type d’information dans le fichier .install.
PKGBUILD (provides, replaces, etc.)PKGBUILD. Cependant ce n’est pas obligatoire tant que la syntaxe bash est respectée.Le champ de la licence est intégré petit à petit sur le dépôt officiel et il doit être utilisé dans vos paquetages. Vous pouvez l’utiliser comme ceci :
/usr/share/licenses/common comme /usr/share/licenses/common/GPL. Si le paquetage est sous l’une de ces licences, la variables license devras indiquer le nom du répertoire c.-à-d. license=('GPL')/usr/share/licenses/$pkgname/ ex : /usr/share/licenses/dibfoo/COPYING./usr/share/licenses/$pkgname/ de manière unique.
Vous pouvez vous reporter à la page man de PKGBUILD(5) pour savoir comment rédiger correctement cette variable.
Il est assez tentant lors de la rédaction d'un PKGBUILD de mettre toutes les dépendances imaginables afin de résoudre sans soucis les dépendances, malheureusement en procédant de cette manière, vous faites de la mauvaise manière.
En effet ArchLinux gère les niveaux de dépendances, c'est à dire que seul les dépendances indispensables sont écrites dans le PKGBUILD.
Faisont l'expérience avec gvim et regardons ce que me donne un simple ldd :
$ ldd /usr/bin/gvim
linux-gate.so.1 => (0xb7f9e000)
libgtk-x11-2.0.so.0 => /usr/lib/libgtk-x11-2.0.so.0 (0xb7c1f000)
libgdk-x11-2.0.so.0 => /usr/lib/libgdk-x11-2.0.so.0 (0xb7b99000)
libatk-1.0.so.0 => /usr/lib/libatk-1.0.so.0 (0xb7b7f000)
libgdk_pixbuf-2.0.so.0 => /usr/lib/libgdk_pixbuf-2.0.so.0 (0xb7b65000)
libpangocairo-1.0.so.0 => /usr/lib/libpangocairo-1.0.so.0 (0xb7b5c000)
libpango-1.0.so.0 => /usr/lib/libpango-1.0.so.0 (0xb7b1d000)
libcairo.so.2 => /usr/lib/libcairo.so.2 (0xb7aa7000)
libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0xb7a6e000)
libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0xb7a6b000)
libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xb79b9000)
libXt.so.6 => /usr/lib/libXt.so.6 (0xb796a000)
libncurses.so.5 => /usr/lib/libncurses.so.5 (0xb7926000)
libacl.so.1 => /lib/libacl.so.1 (0xb7900000)
libutil.so.1 => /lib/libutil.so.1 (0xb78fc000)
libc.so.6 => /lib/libc.so.6 (0xb77bc000)
libruby.so.1.8 => /usr/lib/libruby.so.1.8 (0xb76ed000)
libm.so.6 => /lib/libm.so.6 (0xb76c7000)
libX11.so.6 => /usr/lib/libX11.so.6 (0xb75dd000)
libdl.so.2 => /lib/libdl.so.2 (0xb75d9000)
libSM.so.6 => /usr/lib/libSM.so.6 (0xb75d1000)
libICE.so.6 => /usr/lib/libICE.so.6 (0xb75ba000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb75a2000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0xb7570000)
libXcomposite.so.1 => /usr/lib/libXcomposite.so.1 (0xb756c000)
libXdamage.so.1 => /usr/lib/libXdamage.so.1 (0xb7569000)
libXfixes.so.3 => /usr/lib/libXfixes.so.3 (0xb7564000)
libpng12.so.0 => /usr/lib/libpng12.so.0 (0xb753e000)
libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0xb7515000)
libXext.so.6 => /usr/lib/libXext.so.6 (0xb7506000)
libXrender.so.1 => /usr/lib/libXrender.so.1 (0xb74fe000)
libXinerama.so.1 => /usr/lib/libXinerama.so.1 (0xb74fb000)
libXi.so.6 => /usr/lib/libXi.so.6 (0xb74f3000)
libXrandr.so.2 => /usr/lib/libXrandr.so.2 (0xb74ed000)
libXcursor.so.1 => /usr/lib/libXcursor.so.1 (0xb74e4000)
libpangoft2-1.0.so.0 => /usr/lib/libpangoft2-1.0.so.0 (0xb74bc000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0xb7441000)
libz.so.1 => /lib/libz.so.1 (0xb742f000)
libpcre.so.0 => /lib/libpcre.so.0 (0xb7408000)
libattr.so.1 => /lib/libattr.so.1 (0xb7403000)
/lib/ld-linux.so.2 (0xb7f9f000)
libxcb-xlib.so.0 => /usr/lib/libxcb-xlib.so.0 (0xb7401000)
libxcb.so.1 => /usr/lib/libxcb.so.1 (0xb73e9000)
libexpat.so.1 => /usr/lib/libexpat.so.1 (0xb73c9000)
libXau.so.6 => /usr/lib/libXau.so.6 (0xb73c6000)
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xb73c0000)
On y trouve une grande quantité de dépendances tel que glibc, gtk, pango, libcairo, freetype, libpng, …
Mais en étudiant le PKGBUILD, on constate que seules quelques dépendances évidentes sont listées :
…
depends=("vim>=${pkgver}" 'perl' 'python' 'ruby' 'acl' 'libxt' 'gtk2' 'desktop-file-utils')
…
Si on prends la cas de cairo qui fourni la libcairo, ce dernier est une dépendance de pango qui dépends de gtk2 et notre PKGBUILD ne contient que la dépendance à gtk2, car pacman sait gérer les niveaux de dépendances.
Un très bon outil pour savoir si vous avez des dépendances en surplus ou en manque, est namcap. C'est un outil relativement fiable avec lequel tout bon empaqueteur doit travailler.
Suivez ce qui suit avant de soumettre un paquetage :
pkgname doit être différent pour rendre cette différence explicite. Ex : un PKGBUILD soumis pour GNU screen contenant le patch sidebar peut être nommé screen-sidebar etc. En plus de ça, le champ du PKGBUILD provides=('screen') doit être utilisé afin d’éviter les conflits avec le paquetage officiel. md5sum. Le md5sum peut être obtenu avec la commande makepkg -g.# Contributor: Your Name <your.email>
ldd sur les exécutables, valider les outils demandés par les scripts, …). l'équipe des TU recommande fortement l’utilisation de namcap écrit par Jason Chu (jason.at.archlinux.org), pour analyser la qualité de votre paquetage. namcap vous avertira pour les mauvaises permissions, les dépendances manquantes, les dépendances inutiles et autres fautes courantes. Vous pouvez installer namcap avec pacman. Souvenez vous que namcap peut être utilisé pour valider les .pkg.tar.gz et les PKGBUILDs.namcap peut vous aider à les détecter mais il peut aussi se tromper. Vérifiez les dépendances en regardant dans la documentation et sur le site web du programme.replaces dans votre PKGBUILD à moins de souhaiter le renommer, par exemple Ethereal devient Wireshark. Si vous diffusez seulement une version alternative à un paquetage existant, utilisez conflicts (et provides si ce paquetage est utile à d’autres). La principale différence est : après la synchro (-Sy) pacman veut immédiatement remplacer le paquetage installé, le paquetage « remplaçant » va chercher le paquetage correspondant à replaces n’importe où dans les dépôts. conflicts est évalué uniquement lors de l’installation du paquetage, ceci est le comportement le plus apprécié car vous ne chassez pas le paquetage initial et vous laissez le choix. foo/PKGBUILD
foo/foo.install
foo/foo_bar.diff
foo/foo.rc.conf__
L’archive doit avoir le nom du paquetage, ex : foo.pkg.tar.gz.
Vous pouvez facilement construire un tarball contenant tous les fichiers requis en utilisant makepkg –source. Cela fait un tarball nommé $pkgname-$pkgver-$pkgrel.src.tar.gz que vous pouvez « uploader » sur AUR.
Le tarball ne doit pas contenir le binaire compressé créé par makepkg ni contenir le fichier filelist.
makepkg --source
Page originale : http://wiki.archlinux.org/index.php/Arch_Packaging_Standards