PKGBUILD

De ArchwikiFR


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 fonction package_pkg1(), package_pkg2()... s'il s'agit de paquet splitté.
Note: Un PKGBUILD peut décrire un ensemble de paquets ayant la même source, mais dont les fichiers sont séparés. On parle alors de paquet «splitté». Un exemple serait libreoffice-calc et libreoffice-writer: un paquet pour le tableur et un autre paquet pour le traitement de texte, le PKGBUILD étant unique.

Les prototypes pour les différents fichiers (PKGBUILD, y compris pour un paquet splitté, .install) se situent dans /usr/share/pacman/.

Astuce: Davantage de prototypes de PKGBUILD sont disponibles en installant abs. Toutefois, ceux-ci ne sont pas à jour (FS#34485), vous pouvez donc vous reporter aux prototypes de la page Creating Packages / More detailed guidelines.

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.

Sommaire

Fichier PKGBUILD

Variables

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.

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.

pkgdir

Répertoire racine de ce qui sera installé dans le paquet. On le trouve par exemple dans make DESTDIR="$pkgdir" install.

epoch

Mis à part si vous savez ce que vous faites, vous ne devriez pas changer cette variable. Par défaut, cette variable doit valoir 0 dans les paquets.

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 n'y est pas, il faut l'inclure dans l'installation à l'emplacement $pkgdir/usr/share/licenses/$pkgname/.

groups

Définit les groupes auquels appartien(en)t ce(s) paquet(s). Par exemple, quand vous installez un groupe comme kdebase, tout les paquets contenus dans ce groupe pourront être installés.

depends

Liste des dépendances. Vous pouvez indiquer une version requise, minimum ou maximum.

depends=('diffutils' 'pacman>=3.3.3' 'package-query>=0.3')

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.

Important: Le groupe base-devel est supposé installé lorsque makepkg construit un paquet, il ne faut donc pas mettre d'éléments de ce groupe dans makedepends pour respecter les standards d'empaquetage d'Arch.

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

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.

conflicts

Liste des paquets en conflit avec celui-ci. Même format que depends.

provides

Liste des paquets virtuellement fournis par celui-ci. Même format que depends.

replaces

Liste des paquets remplacés par celui-ci. Même format que depends.

backup

Indique les fichiers à sauvegarder lors de suppression/mise à jour. Voir man pacman. 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 man makepkg.conf et man pkgbuild. 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
Astuce: Un prototype .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
Astuce: Un prototype est fourni dans /usr/share/pacman/ChangeLog.proto.

source

Liste des sources requises par le paquet. Tout fichier compressé sera décompressé sauf s'il est indiqué dans noextract.

Astuce: Il est possible d'indiquer un nom de fichier pour la source pour l'enregistrer sous un autre nom : source=('fichier::url'). Exemple : source=($pkgname-$pkgver.tar.xz::ftp://ftp.kernel.org/pub/linux/kernel/v3.x).

noextract

Liste des fichiers inclus dans source et ne devant pas être extraits. Par exemple, pour la source suivante source=("http://ftp.archlinux.org/other/grub2/grub2_extras_lua_r20.tar.xz"), on écrira :

noextract=("grub2_extras_lua_r20.tar.xz")

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:

makepkg -g

Pour mettre à jour le fichier :

makepkg -g >> PKGBUILD
Astuce: Vous pouvez également utiliser updpkgsums. Ce script peut ne pas fonctionner en cas de sommes différentes suivant l'architecture.

sha1sums / sha256sums / sha384sums / sha512sums

Alternatives à md5sums. Pensez à bien définir la variable INTEGRITY_CHECK dans /etc/makepkg.conf.

Variables pour 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).

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'un git mais qu'il commence par https, on utilisera : git+http://le_dépôt. Inutile donc pour les URL comme git://le_dépôt.git.
  • url est l'URL du dépôt.
  • #fragment (optionnel) est à utiliser si vous voulez utiliser une branche particulière.

Un exemple pour git :

source=('nom_du_projet::git+http://url_du_projet#branche=branche_du_projet')

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.

Les variables pouvant êtres redéfinies sont: pkgver, pkgrel, pkgdesc, arch, license, groups, depends, optdepends, provides, conflicts, replaces, backup, options, install, changelog.

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"
}
Outils personnels
Autres langues