Des paquets pour FreeBSD avec pkgsrc

Pkgsrc est le gestionnaire de paquets de NetBSD. Mais il est portable. On peut donc l'utiliser avec d'autres systèmes d'exploitation. Comme FreeBSD...

Plutôt que d'utiliser les ports de FreeBSD (qui sont vraiment très biens), nous préférons utiliser le gestionnaire de paquets que nous connaissons bien : https://pkgsrc.org/.

Bootstrap en mode privilégié

Dans un premier temps, nous allons créer des paquets pour venir alimenter notre système en logiciels. Ces paquets seront installés dans l'arborescence /usr/pkg de notre système. Il faudra donc ajouter le chemin /usr/pkg/bin à la variable PATH de notre utilisateur pour pouvoir lancer ces logiciels de manière transparente depuis l'invite de commande. Nous allons tout d'abord récupérer l'arborescence de pkgsrc en utilisant la commande cvs.

$ cvs -d triaxx@cvs.NetBSD.org:/cvsroot checkout pkgsrc

Nous faisons l'hypothèse que notre utilisateur se trouve à la racine de son répertoire personnel. Nous déplaçons alors l'arborescence (qui appartient à cet utilisateur) vers le répertoire /usr (qui appartient à l'utilisateur root). C'est l'utilisateur non privilégié qui construira les paquets et qui maintiendra l'arborescence à jour.

$ su -
# mv ~triaxx/pkgsrc /usr

Le bootstrap consiste en l'ensemble minimum d'outils nécessaires pour gérer les paquets avec pkgsrc. En mode privilégié, c'est l'utilisateur root qui doit le créer. Mais par la suite, c'est un bien l'utilisateur non privilégié qui construira les paquets.

$ su -
# /usr/pkgsrc/bootstrap/bootstrap --make-jobs 2 --pkgdbdir /var/db/pkg --workdir /var/cache/pkgsrc/work

Nous spécifions que la base de données des paquets sera stockée dans le répertoire /var/db/pkg et non à l'emplacement par défaut /usr/pkg/pkgdb.

Une fois le boostrap terminé et les premiers outils installés dans le répertoire /usr/pkg, il est préférable d'éditer le fichier /usr/pkg/etc/mk.conf pour aller paramétrer finement comment nos paquets seront construits.

#            _                      __ 
#  _ __ ___ | | __  ___ ___  _ __  / _|
# | '_ ` _ \| |/ / / __/ _ \| '_ \| |_ 
# | | | | | |   < | (_| (_) | | | |  _|
# |_| |_| |_|_|\_(_)___\___/|_| |_|_|  
#                                     

.ifdef BSD_PKG_MK              # begin pkgsrc settings

ABI=                           64
PKGSRC_COMPILER=               clang
CC=                            clang
CXX=                           clang++
CPP=                           ${CC} -E
CLANGBASE=                     /usr

PKG_DBDIR=                     /var/db/pkg
LOCALBASE=                     /usr/pkg
VARBASE=                       /var
PKG_TOOLS_BIN=                 /usr/pkg/sbin
PKGINFODIR=                    info
PKGMANDIR=                     man
DISTDIR=                       /var/cache/pkgsrc/distfiles
PACKAGES=                      /var/cache/pkgsrc/packages
WRKOBJDIR=                     /var/cache/pkgsrc/work

MAKE_JOBS=                     2
PKG_DEVELOPER=                 yes
X11_TYPE=                      modular

.  if exists(${LOCALBASE}/bin/sudo)
SU_CMD=                        ${LOCALBASE}/bin/sudo /bin/sh -c
.  endif

ALLOW_VULNERABLE_PACKAGES=     yes

.endif                         # end pkgsrc settings

En définissant les varibles DISTDIR, PACKAGES et WRKOBJDIR, nous spécifions que, respectivement, les fichiers distants, les paquets produits et les fichiers de compilation seront stockés dans les sous-répertoires distfiles, packages et work de l'arborescence /var/cache/pkgsrc.

Nous spécifions que nous voulons 2 processus de compilation en parallèle en définissant la variables MAKE_JOBS. La variable PKG_DEVELOPER permet de procéder à des vérifications supplémentaires. Définir X11_TYPE à modular indique que c'est le serveur graphique Xorg de pkgsrc qui sera utilisé plutôt que celui fourni par le système d'exploitation.

$ su -
# chown triaxx:triaxx /var/cache/pkgsrc

Dernier petit détail, nous donnons à l'utilisateur non privilégié la propriété du répertoire /var/cache/pkgsrc pour qu'il puisse y écrire les fichiers téléchargés, les paquets construits et les fichiers utilisés lors du processus de construction.

Bootstrap en mode non privilégié

Maintenant que notre système dispose des paquets nécessaires à l'utilisation que l'où voulons en faire, nous allons mettre en place une arborescence non privilégiée destinée au développement. Par défaut, un bootstrap non privilégié est installé dans le sous-répertoire pkg du répertoire personnel de l'utilisateur non privilégié qui lance sa construction. Mais pkgsrc ne gère pas les chemins d'accès contenant des liens symboliques. FreeBSD installe par défaut les répertoires des utilisateurs dans le répertoire /usr/home et ajoute un lien symbolique /home vers usr/home. Nous pouvons soit installer le bootstrap dans un répertoire autre que $HOME/pkg, soit supprimer le lien symbolique et déplacer /usr/home en /home. Nous privilégierons la deux solutions.

$ su -
# rm /home
# mv /usr/home /home

Nous pouvons maintenant lancer la construction du bootstrap avec la commande suivante.

$ /usr/pkgsrc/bootstrap/bootstrap --make-jobs 2 --workdir /home/triaxx/.pkgsrc/work --unprivileged

Les paquets de ce bootstrap sont installés par défaut dans le sous-répertoire pkg du répertoire personnel de l'utilisateur non privilégié.

#            _                      __ 
#  _ __ ___ | | __  ___ ___  _ __  / _|
# | '_ ` _ \| |/ / / __/ _ \| '_ \| |_ 
# | | | | | |   < | (_| (_) | | | |  _|
# |_| |_| |_|_|\_(_)___\___/|_| |_|_|  
#                                      

.ifdef BSD_PKG_MK              # begin pkgsrc settings

ABI=                           64
PKGSRC_COMPILER=               clang
CC=                            clang
CXX=                           clang++
CPP=                           ${CC} -E
CLANGBASE=                     /usr

UNPRIVILEGED=                  yes
PKG_DBDIR=                     /home/triaxx/pkg/pkgdb
LOCALBASE=                     /home/triaxx/pkg
VARBASE=                       /home/triaxx/pkg/var
PKG_TOOLS_BIN=                 /home/triaxx/pkg/sbin
PKGINFODIR=                    info
PKGMANDIR=                     man
DISTDIR=                       /var/cache/pkgsrc/distfiles
PACKAGES=                      /home/triaxx/.pkgsrc/packages
WRKOBJDIR=                     /home/triaxx/.pkgsrc/work

MAKE_JOBS=                     2
PKG_DEVELOPER=                 yes
X11_TYPE=                      modular

ALLOW_VULNERABLE_PACKAGES=     yes

.endif                         # end pkgsrc settings

Beaucoup de paramétrages de ce fichier de configuration ~/pkg/etc/mk.conf sont communs avec ceux du fichier de configuration /usr/pkg/etc/mk.conf. Les paquets produits et les fichiers de constructions seront cette fois stockés dans des sous-répertoire du répertoire /home/triaxx/.pkgsrc. Par contre, les fichiers distants n'ont pas besoin d'être distingués de ceux récupérés pour construire des paquets en mode privilégié. C'est pourquoi la variable DISTDIR est là aussi définie à /var/cache/pkgsrc/distfiles.

Quelques finitions

Afin d'avoir les sous-répertoires bin et sbin des arborescences privilégiées et non privilégiées dans notre variable PATH, nous ajoutons ces quelques lignes dans le fichier de configuration de bash .bashrc.

pkgsrc_localbase=/usr/pkg
pkgsrc_path=${pkgsrc_localbase}/sbin:${pkgsrc_localbase}/bin
upkgsrc_localbase=~/pkg
upkgsrc_path=${upkgsrc_localbase}/sbin:${upkgsrc_localbase}/bin
[[ -n "${PATH/*${pkgsrc_path}*/}" ]] && export PATH="${pkgsrc_path}:$PATH"
[[ -n "${PATH/*${upkgsrc_path}*/}" ]] && export PATH="$PATH:${upkgsrc_path}"

Pour distinguer les deux versions installées de la commande bmake (/usr/pkg/bin/bmake et /home/triaxx/pkg/bin/bmake), nous créons une commande alias que nous ajoutons également dans le fichier .bashrc.

alias ubmake='~/pkg/bin/bmake'

Page top