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'