PKGBUILD (Français)
Un PKGBUILD est un fichier décrivant la manière de construire un paquet Arch Linux.
Il s'agit d'un fichier bash qui généralement comporte trois parties:
- Les informations sur le paquet (une liste de variables).
- La fonction build() permettant de compiler le programme.
- La fonction package() ou un ensemble de fonctions package_pkg1(), package_pkg2()... s'il s'agit d'un paquet splitté.
Les prototypes pour les différents fichiers (PKGBUILD, y compris pour un paquet splitté, .install) se situent dans /usr/share/pacman/
.
Un paquet est construit à l'aide de makepkg et devrait se conformer aux standards d'empaquetage d'Arch, particulièrement si vous comptez le partager.
Variables d'en-tête du PKGBUILD
Nom du paquet
pkgbase
Nom désignant le paquet ou le groupe de paquet en cas de PKGBUILD pour paquets splittés. Pour un PKGBUILD standard, c'est le premier élément de pkgname.
pkgname
Nom du paquet/des paquets (en cas de paquets splittés). Cette variable a les mêmes limitations que pour un nom de fichier.
Version
pkgver
Version du programme. Elle ne doit pas comporter de tiret (-).
pkgrel
Version du paquet, de même que pkgver, le tiret n'est pas permis.
epoch
Force le paquet a être vu comme plus récent que le même paquet avec une valeur d'epoch strictement inférieure. Peut être utile en cas du changement de numérotation du paquet.
Générique
pkgdesc
Description du paquet, de préférence, elle doit tenir sur une ligne, c'est-à-dire 80 caractères ou moins. Il est inutile de remettre le nom du paquet dedans. Exemple : "Nedit est un éditeur de texte pour X11" devrait être "Un éditeur de texte pour X11."
arch
Définit les architectures sur la(les)quelle(s) ce paquet peut être construit. arch=('any') indique que le paquet ne contient pas de fichier dépendant de l'architecture. Il est possible d'utiliser la variable $CARCH
pour traiter des opérations selon l'architecture cible, par exemple pour rajouter une dépendance spécifique à une architecture 64-bit:
depends=(foobar) if test "$CARCH" == x86_64; then depends+=(lib32-glibc) fi
url
Lien vers le site web du programme.
license
Liste des licences applicables. La liste des licences communes se trouve dans /usr/share/licenses/common
. Si la licence de votre programme ne se trouve pas à cet emplacement, il faut ajouter license=('custom') (ou bien license=('custom:<nom>')) et l'inclure dans l'installation à l'emplacement $pkgdir/usr/share/licenses/$pkgname/
.
sed
:
sed -n '/DEBUT_DE_LA_PREMIÈRE_LIGNE/,/FIN_DE_LA_DERNIÈRE_LIGNE/p' FICHIER_EXTRACTION | cut -c 3- > "LICENSE"
groups
Définit les groupes auquels appartien(en)t ce(s) paquet(s). Par exemple, quand vous installez un groupe comme kdebase[broken link: package not found], tout les paquets contenus dans ce groupe pourront être installés.
Dépendances
depends
Liste des dépendances. Vous pouvez indiquer une version requise, minimum ou maximum.
depends=('diffutils' 'pacman>=3.3.3' 'package-query>=0.3')
optdepends
Liste des dépendances optionnelles. Cela permet d'indiquer le nom d'un paquet supplémentaire à installer pour avoir une fonctionnalité précise.
optdepends=('aurvote: vote for favorite packages from AUR for inclusion in [community]' 'customizepkg: automatically modify PKGUILD during install/upgrade' 'rsync: retrieve PKGBUILD from official repositories')
makedepends
Liste des dépendances qui ne sont requises que lors de la construction. Il n'est pas nécessaire de remettre les paquets que vous avez mis dans depends
.
checkdepends
Liste des paquets dont va avoir besoin la fonction check(). S'il n'y a pas de fonction check(), il est inutile de définir cette variable.
Relation des paquets
provides
Liste des paquets virtuellement fournis par celui-ci. Même format que depends.
conflicts
Liste des paquets en conflit avec celui-ci. Même format que depends.
replaces
Liste des paquets remplacés par celui-ci. Même format que depends.
Autre
backup
Indique les fichiers à sauvegarder lors de suppression/mise à jour. Voir pacman(8.fr). Les fichiers sont à spécifier sans le premier /
(chemin non-absolu). Exemple, pour sauvegarder le fichier /etc/pacman.conf
, on écrira etc/pacman.conf
.
options
Liste d'options écrasant celle par défaut de makepkg, voir makepkg.conf(5.fr) et PKGBUILD(5.fr). Pour faire l'inverse du comportement par défaut, il suffit de placer un !
devant le nom de l'option. Exemple : !buildflags
, ou encore !makeflags
, ...
install
Nom d'un script d'installation de type .install
qui sera inclus dans le paquet.
Le fichier .install
permet d'effectuer certaines actions lors de l'installation, suppression ou mise à jour du paquet. Les actions à lancer sont définies par les fonctions suivantes:
- Installation: Ces fonctions reçoivent comme argument la version du paquet installé.
- pre_install: Avant installation.
- post_install: Après installation.
- Mise à jour: elles reçoivent deux arguments, la version du paquet supprimé et celle du paquet installé.
- pre_upgrade
- post_upgrade
- Suppression: un seul argument, la version du paquet supprimé.
- pre_remove
- post_remove
.install
est disponible dans /usr/share/pacman/proto.install
.changelog
Nom du fichier ChangeLog. Ce fichier permet de consigner les changements à chaque révision du paquet. S'il est présent, le ChangeLog d'un paquet peut être consulté par:
pacman -Qc nomdupaquet
/usr/share/pacman/ChangeLog.proto
.Source
source
Liste des sources requises par le paquet et l'emplacement où les trouver (le plus souvent une URL HTTP ou FTP). Les variables pkgname
et pkgver
précédemment définies peuvent être utilisées (par exemple, source=("https://exemple.com/$pkgname-$pkgver.tar.gz"
).
Notez que depuis Pacman 4.2, les sources qui dépendent d'une architecture peuvent être ajoutées dans une variable spécifique : il suffit d'ajouter après la variable le caractère underscore (_
) suivi de l'architecture, par exemple source_i686=()
pour les sources 32 bits et source_x86_64=()
pour les sources 64 bits. De même, ceci s'applique aussi aux sommes de contrôle, comme md5sums_x86_64=()
.
source=('fichier::url')
. Exemple : source=($pkgname-$pkgver.tar.xz::ftp://ftp.kernel.org/pub/linux/kernel/v3.x).
Avant tout processus de construction du paquet, les fichiers indiqués dans source sont téléchargés et vérifiés. makepkg
ne fonctionnera pas s'il en manque.
Tout fichier compressé sera décompressé sauf s'il est indiqué dans noextract
.
noextract
Liste des fichiers inclus dans source
et ne devant pas être extraits. Par exemple, pour la source suivante source=("https://ftp.archlinux.org/other/grub2/grub2_extras_lua_r20.tar.xz")
, on écrira :
noextract=("grub2_extras_lua_r20.tar.xz")
Somme de contrôle
md5sums
Liste des sommes de contrôle md5 pour chaque fichier source
. Cette liste permet de vérifier l'intégrité des fichiers utilisés. Une fois les sources renseignées, on peut obtenir automatiquement les sommes de contrôle par:
updpkgsums
En plus de générer automatiquement les sommes de contrôle, cette commande va modifier automatiquement le PKGBUILD.
makepkg -g >> PKGBUILD
, qui fonctionne tout aussi bien que la première mais qui a le désavantage de ne pas effacer les anciennes sommes de contrôle et d'ajouter les nouvelles en fin de fichier.sha256sums
Elle fait partie de la famille SHA-2, et la somme de contrôle est codée sur 256 bits. C'est une alternatives à md5sums, mais celle-ci a l'avantage de ne pas avoir de vulnérabilité connue.
Pensez à bien définir la variable INTEGRITY_CHECK
dans /etc/makepkg.conf
, puis pour générer les sommes de contrôle, utilisez la même commande que pour md5sums.
sha1sums, sha224sums, sha384sums, sha512sums
sha1sums fait partie de la famille SHA-1, alors que les autres font parties de la famille SHA-2. Le SHA-2 a été mis en place pour corriger les problèmes de sécurité du SHA-1.
sha224sums, sha384sumse et sha512sums utilisent une somme de contrôle codée sur, respectivement, 224, 384 et 512 bits.
Ces sommes de contrôles sont moins utilisées que sha256sums.
validpgpkeys
Liste des empreintes PGP. Si cette variable est utilisée, makepkg
va accepter uniquement les signatures qui sont dans cette liste et va ignorer les valeurs de confiance du trousseau. Si le fichier source a été signé avec une sous-clé, makepkg
va toujours utiliser la clé principale pour comparer.
Seulement les empreintes complètes sont acceptées. Elles doivent être écrites uniquement en majuscule et sans espace.
Variables pour les versions de développement
makepkg permet de mettre à jour la version d'un paquet ciblant une version de développement disponible dans un dépôt de système de gestion de révision. Depuis pacman 4.1, il est possible d'utiliser directement la fonction source()
pour les sources de la version de développement. makepkg va placer le dépôt dans $startdir
puis le copier dans $srcdir
(selon le type de version de développement).
Quelques règles s'imposent :
- La variable pkgname doit contenir un suffixe, tel
-cvs
,-svn
,-hd
,-darcs
,-bzr
,-git
, etc... - En cas de modifications du PKGBUILD qui rendraient le paquet résultant différent, il est obligatoire d'incrémenter la variable pkgrel.
- Modifiez correctement les variables conflicts et provides (par exemple pour fluxbox-gitAUR:
conflicts=('fluxbox')
etprovides=('fluxbox')
). - La variable replaces cause généralement des problèmes, c'est pour cela qu'il faut éviter de l'utiliser.
- Incluez le paquet du gestionnaire de version de développement dans la variable makedepends (comme cvs, subversion, git, ...).
- Mettez
'SKIP'
pour la somme de contrôle correspondante à cette source.
Le format général à utiliser pour les versions de développement est le suivant :
source=('[dossier::][vcs+]url[#fragment]')
-
dossier
(optionnel) est à utiliser pour changer le nom par défaut du dépôt, pour un autre plus pertinent. -
vcs+
est à utiliser si l'URL ne reflète pas versions de développement. Par exemple, s'il s'agit d'ungit
mais qu'il ne commence pas pargit://
, on utilisera :git+http://le_dépôt
. -
url
est l'URL du dépôt. -
#fragment
(optionnel) est à utiliser si vous voulez utiliser une branche particulière.
Un exemple simple qui utilise git
:
source=(git://url_du_projet/dépôt.git')
Un autre un peu plus compliqué git
:
source=('nom_du_projet::git+http://url_du_projet#branch=branche_du_projet')
Ou un exemple un peu plus compliqué qui utilise une révision spécifique de svn
:
source=(nom_personnalisé::svn+http://url_du_projet/dépôt/trunk/@révision
Variables propres aux fonctions
srcdir
Répertoire où sont extraites les sources. C'est à partir de ce répertoire qu'on travaille.
pkgdir
Répertoire racine de ce qui sera installé dans le paquet. On le trouve par exemple dans make DESTDIR="$pkgdir" install
.
Fonctions
pkgver()
Pacman 4.1 introduit cette commande optionnelle afin de permettre de mettre à jour pkgver au cours de l'utilisation de makepkg. pkgver() s'exécute après extraction des sources.
Cette commande est particulièrement destinée au maintien de paquets de développement (-svn, -git, -hg, -bzr...). Pour plus de détails sur la mise en œuvre, voyez le wiki anglophone.
prepare()
Pacman 4.1 introduit la commande optionnelle prepare()
. Dans cette fonction, qui s'exécute avant build()
, placez des commandes préparant les sources à la construction, comme des patchs ou autres configurations. Si l'extraction est passée (makepkg -e
ou --noextract
), alors prepare()
est ignorée.
build()
Cette fonction permet de compiler le programme, c'est une fonction bash, donc à priori, toute syntaxe bash est acceptable.
Néanmoins, toute erreur dans cette fonction provoque l'arrêt de makepkg, elle est exécutée dans l'environnement utilisateur, et ne doit en aucun cas modifier un fichier en dehors de ceux du paquet en construction. Les variables startdir
, srcdir
et pkgdir
contiennent les chemins absolus vers respectivement le répertoire du PKGBUILD, celui des sources décompressées, et enfin celui des fichiers du paquet. Ces variables sont disponibles à l'intérieur de la fonction build().
Exemple:
build() { cd "$srcdir/$pkgname-$pkgver" ./configure --localstatedir=/var --prefix=/usr \ --sysconfdir=/etc make }
check()
Cette commande optionnelle sert à effectuer des vérifications. Les utilisateurs qui n'en ont pas besoin (et les mainteneurs qui n'arrivent pas à corriger les échecs que montre cette fonction) peuvent désactiver cette fonction en utilisant !check
dans le fichier /etc/makepkg.conf
.
S'il n'est pas possible d'effectuer des vérifications au sein du paquet, il n'est pas utile de mettre cette fonction.
Exemple :
check() { cd "$srcdir/$pkgname-$pkgver" make check }
package()
Cette fonction a pour rôle d'installer le programme dans le dossier $pkgdir (pas dans /) et, lorsque l'option fakeroot
est définie, elle est exécutée dans un environnement... fakeroot
.
Exemple:
package () { cd "$srcdir/$pkgname-$pkgver" make DESTDIR="$pkgdir" install }
Paquets splittés
Le PKGBUILD d'un paquet splitté diffère du paquet non splitté par le nombre de fonction package_*() ainsi que par la possibilité de redéfinir différentes variables par paquets.
Toutes les variables peuvent être redéfinies dans les fonctions package_*(), sauf les variables makedepends, source et bien entendu les sommes de contrôle.
Exemple de fonction package()
pour paquet splitté:
pkgbase=paquetsplit pkgname=('paquet1' 'paquet2') # .... package_paquet1() { pkgdesc="Le paquet 1 du split" cd "${srcdir}/${pkgbase}-${pkgver}" make DESTDIR="${pkgdir}/ install" rm "${pkgdir}/usr/bin/binaire-paquet2" } package_paquet2() { pkgdesc="Le paquet 2 du split" cd "${srcdir}/${pkgbase}-${pkgver}" make DESTDIR="${pkgdir}/ install" rm "${pkgdir}/usr/bin/binaire-paquet1" }