Dans cet article, nous allons parler de la configuration en général de Gentoo, ses fichiers, les variables pouvant être configurées, etc.
Configuration
Les fichiers de configuration se trouvent dans /etc/portage/
. Voici une
arborescence possible pour le dossier de configuration:
/etc/portage/
+---make.conf
+---package.license
+---package.mask
+---package.unmask
+---package.use
| +---package
| \---zz-autounmask
+---patches
| \---www-client
| \---surf-2.1
| \---patch.diff
\---savedconfig
\---www-client
\---surf-2.1
Je vais m'appliquer à expliquer chaque dossier de cette arborescence.
Mais tout d'abord, il faut savoir comment marche la configuration de Portage.
Elle se fait via des variables globales qui sont définies dans le fichier
make.conf
. Elle contient la variable la plus important : USE
. Comme Portage
compile les logiciels, il est possible d'ajouter ou retirer des
fonctionnalités. Cela va influencer sur la vitesse et la taille du logiciel.
Par exemple, Emacs a une interface graphique. On peut aussi l'utiliser dans un
terminal. Cependant, je n'ai pas besoin d'interface graphique quand j'utilise
Emacs, car je le préfère dans le cli, je peux donc compiler Emacs sans GUI. Ces
mots clés permettant de définir la compilation des logiciels sont appelés
flags.
Il va aussi contenir des arguments qui seront passés aux compilateurs.
Une fois le fichier make.conf
bien écrit, il est possible de le déplacer sur
une autre machine pour avoir une installation en tout point identique.
Make.conf
La pierre angulaire de Portage est donc le fichier make.conf
qui contient
toutes les informations nécessaires pour la compilation des programmes, les
différents flags des compilateurs, le type de carte graphique, le processeur,
les licences acceptées...
Exemple de make.conf
:
# flags de compilations C, march=native -> pour l'architecture détectée
COMMON_FLAGS="-march=native -O2 -pipe"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"
# configuration de la parallélisation. Cela doit être égale ou plus petit que
# RAM/2GB ou le nombre de CPUs logiques
MAKEOPTS="-j4"
# configuration des dépots locaux
PORTDIR="/var/db/repos/gentoo"
DISTDIR="/var/cache/distfiles"
PKGDIR="/var/cache/binpkgs"
ACCEPT_LICENSE="*" # défini les licences acceptées
# le miroir pour l'overlay principal
GENTOO_MIRRORS="http://gentoo.mirrors.ovh.net/gentoo-distfiles/"
GRUB_PLATFORMS="efi-64"
ACCEPT_KEYWORDS="~amd64"
JAVA_PKG_FORCE_VM=openjdk-8 # forcer la compilation en java 8 au lieu de
# prendre la VM par défaut du système
USE="X doc alsa ffmpeg elogind savedconfig xinerama jumbo-build -systemd"
VIDEO_CARDS="intel" # la carte graphique
INPUT_DEVICES="libinput"
Je vous conseille fortement de lire la page wiki pour voir les différentes personnalisations possibles. Faites-le à la fin de l'article !
ACCEPT_LICENSE ou choisir le type de logiciel
Il existe plein de licences de logiciels. Cette variable permet de choisir exactement le type de logiciels que l'on souhaite installer. On peut ne demander à installer que des logiciels libres, propriétaire, etc. Si la licence d'un paquet ne correspond pas à la variable, le paquet sera masqué et ne pourra pas être installé.
Exemples :
ACCEPT_LICENSE="-* @FREE" # on accepte uniquement les licences libres et on
# interdit les autres types de licences
ACCEPT_LICENSE="*" # on accepte tous les types de licences
Vous pouvez retrouver la liste complète des licences sur la page du wiki. Nous verrons un peu plus tard comment autoriser certaines licences uniquement sur certains logiciels.
La variable USE
La configuration des différents paquets sur Gentoo se fait de manière globale avec la variable USE. Elle va contenir différentes informations sur ce que doit supporter tout programme installé, par exemple X11 ou Wayland, Alsa ou pulseaudio, si l'on souhaite avoir la documentation, etc.
Voici un exemple de USE :
USE="X alsa doc xinerama -systemd"
Je précise que j'utilise XOrg (X) et alsa, que je souhaite avoir la documentation générée (doc), le support du multi-écran (xinerama) mais que je n'utilise pas systemd (-systemd). Cela permet d'avoir une configuration commune sur tous les paquets. Il existe plein d'autres flags et chacun a une signification différente (support d'une fonctionnalité, génération de fichiers...).
Mais comment modifier sa variable USE sans tout casser ? Eh bien je vais être
simple dans ma réponse : en lisant le wiki et y aller progressivement. Vous
souhaitez utiliser une interface ? Il vaut mieux rajouter le flag pour wayland
ou XOrg. Vous souhaitez avoir du son ? Choisissez entre pulseaudio et alsa. Ça
ne sert à rien de se presser, votre USE s'étoffera au cours du temps et de vos
besoins. N'ayez pas peur de rajouter des choses inutiles aussi ! Une fois la
variable modifiée, vous pouvez taper emerge -aN @world
, ce qui recompilera
tous les programmes ayant été impactés par ce changement. Vous pourrez donc
retirer, ajouter, modifier des flags n'importe quand.
Je vous recommande de vous référez à la page du wiki de Gentoo de chaque programme pour en savoir plus sur les flags dont il dispose et à quoi ils servent. Vous pouvez aussi utiliser le site regroupant les informations sur les paquets dont les valeurs de USE qui vont les affecter. Je vous recommande fortement de le mettre en favoris. Il sera bien utile pour chercher les différents flags possibles pour les paquets de l'overlay officiel. Pour les paquets des overlays communautaires, il va falloir lire la documentation ou le fichier ebuild pour le comprendre.
Nous verrons à nouveau un peu plus loin comment configurer la variable USE uniquement pour certains paquets.
Automatisation de la configuration
Certains paquets ont besoins d'avoir des flags bien précis. Entrer tous ces flags à la main serait fastidieux. Heureusement, Portage dispose d'un outil pour ce faire !
Il faut rajouter l'option -a
dans la commande emerge pour vérifier s'il est
possible de faire cette configuration automatique du USE.
Si oui, il faut l'accepter et taper etc-update
afin de mettre à jour
les fichiers de configurations. N'oubliez pas de lire les informations lorsque
vous faites cette commande. En règle générale, il faut faire -3
pour
appliquer ces changements et les fusionner dans un fichier commun.
Si vous souhaitez vérifier les changements, tapez le numéro du fichier (souvent le 1) puis regardez les changements affichés sous forme de diff. Il suffit de sélectionner la façon dont les modifications seront apportées au fichier de configuration.
etc-update
permet aussi de modifier d'autres fichiers de configuration bien
que cela reste marginal.
package.license, les exceptions à ACCEPT_LICENSE
Si votre variable ACCEPT_LICENSE est trop restrictive, cela peut engendrer des
problèmes sur certains paquets. Par exemple, si vous ne souhaitez avoir que des
logiciels libres mais que vous devez utiliser Android Studio pour les cours, un
projet perso, etc., il est possible d'accorder une exception pour un paquet. Il
suffit de rajouter dans le fichier package.license
la ligne suivante :
categorie/nom licence
# exemple, on autorise la licence android pour installer Android Studio
dev-util/android-studio android
package.mask ou comment masquer des paquets
Il est possible de cacher des paquets afin de les ignorer lors de mise à jour ou d'une installation. J'utilise personnellement cela pour pouvoir mettre à jour mon système tout en évitant certains paquets qui nécessitent une configuration particulière (une certaine version de Java par ex.) ou qui sont trop long à compiler (qtwebengine...).
Il faut pour ça juste rajouter une entrée dans le fichier package.mask
:
>=categorie/paquet-version
Il est tout à fait possible de bloquer une certaine version (=), toutes les versions ultérieures (>=) ou précédentes (<=) d'un paquet. Il suffit de changer le signe en début de ligne.
package.unmask
Si on peut masquer des paquets et certaines de leurs versions, il est aussi
possible de les démasquer. En effet, il existe des fichiers qui sont masqués
automatiquement par le système. On peut alors les démasquer en les mettant dans
le fichier package.unmask
avec la même syntaxe que pour package.mask
.
Personnalisation des paquets
package.use ou une variable USE personnelle
Il est possible de préciser des ajouts à la variable USE pour un paquet
spécifique. Cela se fait dans un fichier se trouvant dans le dossier
package.use
. J'ai personnellement fait un fichier myuse
dans lequel je mets
tous mes changements de USE et un autre pour mettre ceux générés par Portage.
Il est aussi possible d'enlever des flags globaux. Par exemple si un flag pose un souci juste pour un logiciel, on peut le retirer en ajoutant un - devant.
Voici la forme de ce fichier:
categorie/nom doc -systemd
categorie/nom alsa
Configuration sauvegardée
Certains logiciels vont être configurés à la compilation pour gagner du temps
lors de son exécution. C'est le cas des logiciels de Suckless. On peut alors
rajouter le fichier de configuration personnalisé dans le dossier
savedconfig/categorie/paquet
. Il est aussi possible de rajouter un numéro de
version après le nom du paquet pour pouvoir l'appliquer uniquement à cette
version.
Patchs
Je vais faire un rapide rappel sur ce qu'est un patch. Vous pouvez passer au paragraphe suivant si vous le savez déjà. Un patch est un fichier contenant du code permettant de rajouter une fonctionnalité, fixer un bug, etc. C'est un peu une sorte de commit qu'on rajoute au code de base.
Avec Portage, comme on compile le code source, il est très simple de rajouter
des patchs. Il suffit de déposer les fichiers de patchs dans
patches/categorie/paquet/
. Là aussi, il est possible de préciser la version
du paquet pour éviter des soucis lors de mises à jour qui peuvent casser les
patchs.
On peut avoir des conflits lorsqu'on applique de multiples patchs. Vous devrez alors les réécrire pour pouvoir les utiliser. Certains patchs vont aussi modifier le fichier de configuration par défaut. Lisez bien leur contenu pour pouvoir changer votre fichier de configuration en les prenant en compte !
Nous avons donc vu à peu près l'ensemble des fichiers de configurations
utilisés dans Portage. N'essayez pas de tout modifier à la fois ! Allez-y
touche par touche, en rajoutant en premier les flags globaux les plus basiques
(son, système d'initialisation...) puis quand vous voulez rajouter une
fonctionnalité, lisez bien la page wiki et compléter le fichier package.use
.
Cela peut prendre du temps avant de bien maîtriser la configuration globale de
votre système.
Dans le prochain article, nous verrons comment accélérer la compilation des fichiers C et C++ avec un outil bien pratique !