BUILDPKG ou « Chérie, j'ai rétréci les SlackBuilds »
Publié : 23 juin 2017, 19:43
Chose promise, chose due, je poste ma petite bibliothèque à construire des paquets Slackware (enfin, don't panic!, ça reste le bon vieux makepkg en fin de course).
Je l'ai conçue en constatant que ce qui changeait d'un SlackBuild à un autre se réduisait bien souvent à ce qui permet de compiler le logiciel avant de l'installer dans une racine temporaire. Autant donc ne pas s'encombrer avec le reste et gagner ainsi en clarté et en facilité.
Pour le moment, je la mets à disposition ici où il sera plus pratique d'avoir d'éventuels retours. Je ne pense pas que ça affolera la bande passante, mais si ça te gêne, Thomas, vraiment pas de soucis j'irai faire ça ailleurs.
Comment ça s'installe ?
On ne peut pas faire plus bête. Vous téléchargez le fichier attaché à ce post, puis vous le décompressez dans le répertoire de votre choix (ici /usr/local/lib/build) :
Le tout est de ne surtout pas changer le nom de la bibliothèque (du moins pas sans changer l'auto-référence qu'elle contient).
Comment ça s'utilise ?
D'abord, il faut créer l'utilisateur système "builder" (remplacez "12345" par le GID/UID libre de votre choix) :
Ensuite, le mieux est de commencer avec cette trame de script (ajustez /usr/lib64 si vous n'êtes pas en 64bits), qui indique toutes les options disponibles pour altérer le processus automatique (PKGDIR correspond à un dossier sécurisé généré à la volée) :
Tout ce qui est situé après la ligne .../BUILDPKG sera exécuté dans les sources avec l'utilisateur "builder" (c'est pour cela qu'il est déconseillé de changer le nom de la bibliothèque).
Une fois que vous avez votre script, que je vous conseille de mettre en 744 root/root afin de limiter les bêtises, vous téléchargez les sources de votre logiciel, puis vous faites :
Si celui-ci n'a pas été défini en dur dans le script, le nom du paquet sera celui du script sans son extension. De même, si le champ de version est indéfini, celui-ci sera le dernier champ du nom des sources qui soit séparé par un "-" et, si rien d'autre n'est indiqué, le numéro de construction sera déduit de ce qui est installé dans le système. Il reste cependant toujours possible de redéfinir toutes les définitions utilisées sur la ligne à la suite du dossier source :
Quatre fonctions sont également automatiquement disponibles dans le script : die, qui provoque la sortie immédiate en affichant précédé d'un marqueur rouge le message donné en argument sur stderr et retourne 1 ; warn, qui affiche un simple avertissement sur stderr précédé d'un carré jaune, say, qui affiche un message sur stdout précédé d'un carré vert ; et mkdesc, qui comme indiqué ci-dessus attend sur stdin le texte d'un slack-desc qu'il formatera automatiquement (en ajoutant notamment les « nom_du_paquet: » qui vont bien). Le but des trois première fonction est de pouvoir distinguer facilement les message envoyés depuis le script de ceux émis par la compilation des logiciel.
Et si tout ce qu'il faut pour mon logiciel ne tient pas dans un script ?
Pour les patches et autre ajouts, un chemin est automatiquement défini dans la variable AUXDIR. C'est le chemin absolu du script avec une extention ".d" au lieu de ".sh". Il suffit donc de le créer et d'y mettre tout ce dont on a besoin :
Ce qui donne dans le script associé :
Comment changer les propriétaires à l'intérieur du paquet ?
C'est effectivement une des choses qu'on doit faire en root. Pour cela, il suffit de générer ou copier à la racine du paquet un script "pre-makepkg" qui contiendra toutes les commandes devant être effectuées en root, ex (notez que les chemins sont relatifs) :
C'est en fait le même principe que le doinst.sh, mais appliqué à la racine d'un paquet. Une fois le script exécuté, celui-ci est supprimé automatiquement.
Voili, voilou. Ce n'est rien de bien miraculeux, mais c'est une interface que j'aime bien.
Je l'ai conçue en constatant que ce qui changeait d'un SlackBuild à un autre se réduisait bien souvent à ce qui permet de compiler le logiciel avant de l'installer dans une racine temporaire. Autant donc ne pas s'encombrer avec le reste et gagner ainsi en clarté et en facilité.
Pour le moment, je la mets à disposition ici où il sera plus pratique d'avoir d'éventuels retours. Je ne pense pas que ça affolera la bande passante, mais si ça te gêne, Thomas, vraiment pas de soucis j'irai faire ça ailleurs.
Comment ça s'installe ?
On ne peut pas faire plus bête. Vous téléchargez le fichier attaché à ce post, puis vous le décompressez dans le répertoire de votre choix (ici /usr/local/lib/build) :
Code : Tout sélectionner
bzip2 -dc BUILDPKG-AAMMJJ.bz2 >/usr/local/lib/build/BUILDPKG
Comment ça s'utilise ?
D'abord, il faut créer l'utilisateur système "builder" (remplacez "12345" par le GID/UID libre de votre choix) :
Code : Tout sélectionner
echo builder:x:12345:12345:User for building:/:/bin/false >>/etc/passwd
echo builder:x:12345: >>/etc/group
Code : Tout sélectionner
#!/bin/sh
##
# url: http://vers/le/site/du/projet
##
# NAME= # le nom du paquet.
# VERSION= # la version du paquet.
# ARCH= # l'architecture du paquet.
# BUILD= # le numéro de construction du paquet.
# SIGN= # la signature du paquet.
# NOFIX=X # ne pas uniformiser les permissions dans les sources.
# NOSTRIP=X # ne pas stripper les binaires.
# NOPAGE=X # ne pas compresser les manuels.
# GZIP=X # générer un paquet ".tgz".
# PREPEND=X # ajouter les liens symboliques au début du doinst.sh.
#
##
. "/usr/local/lib/build/BUILDPKG"
##
./configure --prefix=/usr \
--disable-static \
--libdir=/usr/lib64
make
make install DESTDIR="$PKGDIR"
mkdesc <<EODESC
XXX (...)
Du texte comme un pour slack-desc, sur 72 colonnes max.
EODESC
# FdF
Une fois que vous avez votre script, que je vous conseille de mettre en 744 root/root afin de limiter les bêtises, vous téléchargez les sources de votre logiciel, puis vous faites :
Code : Tout sélectionner
/usr/local/lib/build/mon-logiciel.sh /tmp/mon-logiciel-1.00
Code : Tout sélectionner
/usr/local/lib/build/mon-logiciel.sh /tmp/mon-logiciel-1.00 VERSION=1.00custom NOFIX=X
Et si tout ce qu'il faut pour mon logiciel ne tient pas dans un script ?
Pour les patches et autre ajouts, un chemin est automatiquement défini dans la variable AUXDIR. C'est le chemin absolu du script avec une extention ".d" au lieu de ".sh". Il suffit donc de le créer et d'y mettre tout ce dont on a besoin :
Code : Tout sélectionner
mkdir /usr/local/lib/build/mon-logiciel.d
mv un.patch /usr/local/lib/build/mon-logiciel.d
Code : Tout sélectionner
...
patch <"$AUXDIR/un.patch"
...
Comment changer les propriétaires à l'intérieur du paquet ?
C'est effectivement une des choses qu'on doit faire en root. Pour cela, il suffit de générer ou copier à la racine du paquet un script "pre-makepkg" qui contiendra toutes les commandes devant être effectuées en root, ex (notez que les chemins sont relatifs) :
Code : Tout sélectionner
chown service.service var/lib/service \
var/log/service.log
Voili, voilou. Ce n'est rien de bien miraculeux, mais c'est une interface que j'aime bien.