LE BLOG DE RICK Chasseurs de succès Linux Random WU

Par Rick dans Linux le 09/01/2023.


La configuration de Portage

Cet article est le numéro 2 de la série Comprendre et utiliser Portage sur Gentoo.

  1. Gentoo et emerge, introduction
  2. La configuration de Portage

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 !