# [doc] Les options de la variable USE

## kopp

Ce guide n'a pour but que de regrouper les diverses informations trouvées sur le forum afin d'en faciliter la recherche. Les deux ressources principales sont ces deux fils de discussion :

https://forums.gentoo.org/viewtopic-t-427711.html

https://forums.gentoo.org/viewtopic-t-399739.html

Objectif :

Présenter les options de la variable USE (USE-flags en anglais), comment les chercher et comment les gérer.

I - INTRODUCTION

À quoi servent les options de la variable USE ?

Ces options ont pour but de configurer les paramètres de compilation des programmes lors de l'utilisation de la commande emerge. Cela correspond donc aux paramètres qui seront passés lors du ./configure pour ceux qui sont habitués à compiler manuellement. Elles permettent donc à l'utilisateur de choisir les fonctionnalités dont ils ont besoin : support d'une interface graphique, de tel matériel, etc. Exemple : l'option X : Adds support for X11.

Ce sont ces options qui font, en grande partie, la puissance de Portage : elles permettent une liberté de choix totale sur ce que veut l'utilisateur et permet de différencier le compilé du pré-compilé : ici, on n'a que ce qu'on veut contrairement aux paquets précompilés où on a, par défaut, un maximum d'options incluses.

Par contre, il est important de noter que la variable USE n'empêche pas l'installation de paquets. Avoir l'option -X n'empêchera pas de taper emerge x11-base/xorg-x11 et d'installer Xorg. Pas plus que si on veut installer un paquet qui dépend directement de gtk, l'option -gtk n'empêchera pas d'installer gtk. Les options ne sont là que pour les supports optionnels, par exemple d'un paquet étant fait soit pour Qt, soit pour gtk, les options -qt gtk permettront de ne compiler que l'interface gtk et ne nécessitera donc pas l'installation de Qt

Il y a deux types d'options :

globales : ce sont des options de types génériques, qui peuvent affecter tous les paquets avec sensiblement le même effet.

locales : ces options affectent en général un seul paquet, ou plusieurs de manières différentes.

II - EN PRATIQUE

1 - Listes des options

Comme il y a deux types d'options, il y a logiquement deux listes. La manière la plus simple d'y accéder, c'est d'utiliser celles contenues dans le répertoire /usr/portage/profile. Les deux fichiers sont : 

use.desc pour les options globales. Les options sont listées de la manière suivante : nom - description.

Exemple :ipv6 - Adds support for IP version 6

use.local.desc pour les options locales. Elles sont listées sous la forme suivante : paquet_affecté:nom - description.

Exemple : media-video/mplayer:nvidia - Enables support for the nvidia xvmc video driver

La liste des options globales est aussi disponible sur le site de Gentoo :

http://www.gentoo.org/dyn/use-index.xml

2 - Définition d'une option

Pour obtenir la définition d'une option, il y a plusieurs méthodes :

https://forums.gentoo.org/viewtopic-t-428121-highlight-.htmlla simple : 

```
cat /usr/portage/profiles/use.* | grep nom_de_l_option
```

la plus geek : ajouter ceci à votre fichier ~/.bash_rc : 

```
usedesc () {

    local portdir=$(sed -n 's:^PORTDIR=::p' /etc/make.conf);

    [ -z "$portdir" ] && portdir=/usr/portage;

    grep -h "$1.*\ -\ " ${portdir}/profiles/use.* | gawk -F ' - ' ' { print (" \033[32;01m* \033[31;01m%s \033[0;01m- \033[36;01m%s\033[0;0m\n", $1, $2) }'

}
```

 Il suffit ensuite de taper usedesc nom_de_l_option. Merci à TGL pour ce script.

l'utilisation d'outils : par exemple, euse qui est fourni par le paquet app-portage/gentoolkit. 

```
euse -i nom_de_l_option
```

 vous donne une description. Il y a d'autres paquets comme app-portage/euses qui en font autant, voire plus.

3 - Utilisation

a - savoir quelles options affectent un paquet

Rien de plus simple, il suffit d'utiliser l'option --verbose de emerge

```
emerge --pretend --verbose nomdupaquet
```

Exemple :

```
emerge -pv media-video/mplayer

(...)

media-video/mplayer-1.0_pre7-r1  USE="X alsa directfb dvd dvdread encode gif gtk ipv6 jpeg mad mmx nls opengl oss png real sdl sse svga truetype vorbis win32codecs xmms xv xvid -3dfx -3dnow -3dnowext -aac -aalib -arts -bidi -bindist -bl -cdparanoia -cpudetection -custom-cflags -debug -dga -doc -dts -dv -dvb -edl -esd -fbcon -ggi -i8x0 -jack -joystick -libcaca -lirc -live -livecd -lzo -matroska -matrox -mmxext -mythtv -nas -nvidia -rtc -samba -sse2 -tga -theora -v4l -v4l2 -xanim -xinerama -xvmc"
```

Ici, la liste est particulièrement longue, cela fait donc un bon exemple. (« Plus y en a, mieux c'est », pour ne pas dire « plus c'est long... »  :Wink: )

Pour savoir quels effets ont ces options, reportez-vous au paragraphe précédent.

Il est aussi possible d'utiliser l'utilitaire equery, lui aussi fourni par le paquet app-portage/gentoolkit :

```
equery uses nom_du_paquet
```

Ceci donne aussi directement la définition des options.

Pour l'effet pratique, i.e. les paquets qui seront installés en dépendance selon les options choisies, utilisez la méthode suivante : 

```
USE="nomdesoptions" emerge --pretend nomdupaquet
```

Attention : l'utilisation de USE=" " comme ceci est à proscrire pour passer l'option définitivement lors de la compilation. Pour savoir comment configurer les options pour qu'elles aient effet, voyez le paragraphe suivant.

Remarque : sur l'architecture AMD64, il est possible de voir apparaître des options entre parenthèses dans la liste : il s'agit

des options mmx, 3dnow, sse et sse2

En voici un exemple : 

```
emerge transcode --pretend --verbose

[ebuild R ] media-video/transcode-0.6.14-r3 (-3dnow) +X +a52 (-altivec) -dv +dvdread +encode -fame +gtk +imagemagick +jpeg -lzo -mjpeg (-mmx) +mpeg +network +ogg -quicktime +sdl (-sse) (-sse2) +theora +truetype -v4l +vorbis +xml2 +xvid 0 kB 
```

Ceci est dû au fait que ces options sont ignorées pour l'achitecture AMD64 car elles activent sur certains paquets l'utilisation de code 32bits pour l'optimisation. Ceci est mentionné dans le manuel AMD64. C'est donc aux mainteneurs des paquets de faire le choix dans l'ebuild d'activer ces optimisations lorsqu'elles sont disponibles. On en voit un exemple dans l'ebuild de transcode 1.0 :  

```
if use amd64; then

                myconf="${myconf} --enable-mmx --enable-3dnow \

                                --enable-sse --enable-sse2"
```

b - configurer les options

Il y a plusieurs façons de spécifier les options : les fichiers /etc/make.conf et /etc/portage/package.use.

Le fichier /etc/make.conf est utile pour activer ou désactiver des options globales sur tout le système. Par exemple, si vous ne voulez pas d'interface graphique via X, il faut mettre USE="-X" dans ce fichier. Par contre, si vous utilisez Gnome, il faut y ajouter les options gnome gtk. Bref, vous avez compris l'idée.

Par contre, si vous voulez activer/désactiver une option globale pour un seul paquet uniquement, il vous faut alors utiliser le fichier /etc/portage/package.use en le remplissant de la manière suivante : catégorie/paquet option.

Exemple, désactiver le support des langues pour les pages man, afin de ne pas avoir les manpages-fr en dépendance :

```
 echo "sys-apps/man-pages -nls" >> /etc/portage/package.use
```

Le fichier package.use est aussi utilisé pour les options locales. Les effets étant divers selon les paquets, il est donc recommandé d'utiliser ce fichier plutôt que le make.conf. Par exemple, l'option nvidia est beaucoup de significations différentes, et l'effet n'est pas forcément celui désiré.

Remarques :

il existe de nombreux outils permettant d'éditer la variable USE, comme euse cité plus haut, app-portage/profuse, app-portage/ufed,  app-portage/flagedit, etc avec plus ou moins de possibilités (l'ajout dans package.use n'est pas disponible pour tous)

la méthode USE="..." emerge blabla n'est pas valide car elle ne conserve pas l'option passée à la compilation, et lors d'une recompilation ou d'une mise à jour, le paramètre sera perdu et cela peut causer des problèmes lors de l'utilisation.

lorsque vous modifier la variable USE, n'oubliez pas de lancer 

```
emerge --ask --update --deep --verbose --newuse world
```

 pour que ces changements prennent effet.

c - la fonction auto-use de Portage

Portage a été affecté d'un comportement très sujet à controverse : l'auto-use, c'est-à-dire l'ajout automatique d'options à la variable USE lors de l'installation de certains paquets. La liste des paquets et options associées est disponible dans le fichier /usr/portage/profiles/base/use.defaults. Le problème de cette fonction est que lorsqu'un paquet est désinstallé, l'option associée est retirée à moins qu'elle n'ait été explicitement déclarée dans /etc/make.conf ou /etc/portage/package.use et cela peut poser des problèmes. Le sujet a été longuement débattu, et cette fonction a été retirée dans portage 2.1_pre4.

Si pour le moment, vous voulez la contourner, il y a bien entendu une astuce, c'est de modifier l'ordre de priorité des définitions de la variable USE qui vaut par défaut : "env:pkg:conf:auto:defaults".

Pour la modifier, il suffit de rajouter USE_ORDER="env:pkg:conf:defaults" (c'est-à dire enlever auto de la liste) au fichier /etc/make.conf : 

```
echo "USE_ORDER=\"env:pkg:conf:defaults\"" >> /etc/make.conf
```

Modifier autrement l'ordre de cette variable n'a pas vraiment de sens. Vous pouvez quand même retirer defaults si vous avez une bonne raison de le faire.

d - le comportement de --newuse depuis Portage 2.1

Le comportement de l'option --newuse a été modifié à partir de Portage 2.1. En effet, lorsqu'une option USE est retirée ou ajoutée à IUSE dans l'ebuild d'un paquet, emerge --newuse --ask --verbose --deep world va vous proposer de recompiler ce paquet, que l'option ait été activée ou désactivée. Cela s'explique par le fait que le retrait d'une option ne précise pas quelle option est maintenant choisie par défaut, il faut donc recompiler pour être certain que le comportement considéré n'ait pas changé.

Ces options seront affichées en jaune dans la sortir d'emerge avec l'option --verbose.

Voilà, je pense en avoir suffisament dit sur le sujet pour que vous puissiez vous débrouiller. Je tiens à rajouter aussi qu'il existe un article sur la variable USE dans le manuel de Gentoo, traduit en français, donc pas d'excuse pour ne pas le lire. La lecture des deux discussions citées au début est aussi intéressante pour voir des exemples de configurations intéressants.

Mise à jour 22/11/06 : ajout d'un passage sur le comportement de Portage 2.1

Mise à jour 17/02/06 : ajout d'une remarque sur les options ignorées pour AMD64Last edited by kopp on Wed Nov 22, 2006 10:31 pm; edited 4 times in total

----------

## kernelsensei

Beau 1 000eme post !!  :Wink:  Te voilà vétéran avec une belle contribution  :Very Happy: 

c'est bon, on a compris, tu peux arrêter de faire du postcount++ maintenant que t'es vétéran ^^; 

----------

## ghoti

Difficile de faire plus clair et plus complet !

Bravo !  :Smile: 

PS : cette histoire de 1000ème post c'est tout de même suspect !  :Laughing: 

----------

## geekounet

Bravo aussi ! Ca sera utile à beaucoup de gens, cette question étant trop souvent reposée.

Je voudrais juste ajouter que l'auto-use est désactivé depuis portage 2.1_pre4  :Smile: 

----------

## kopp

Ah, au temps pour moi, je n'ai pas vérifié s'il y avait une version plus récente que la mienne et c'était toujours actif chez moi. Je corrige ça de suite.

Faudra aussi que je pense à faire une mise à jour tiens, je commence à avoir pas mal de paquets de retard.

Merci

----------

## anigel

Je l'avais zappé cette doc. C'est clair, superbement présenté, rien à redire !

Merci beaucoup !

----------

## yoyo

excellente_contribution++

Par contre, la "méthode simple" pour obtenir la définition d'une option me paraît compliquée :

```
grep nom_de_l_option /usr/portage/profiles/use.*
```

est largement suffisant.   :Wink: 

Ça n'est pas la première fois que je vois ça ("cat blabla | grep blibli") et je n'en vois toujours pas l'intérêt. Une âme charitable pourraît-elle éclairer ma lanterne ??

----------

## TGL

 *yoyo wrote:*   

> Par contre, la "méthode simple" pour obtenir la définition d'une option me paraît compliquée :
> 
> ```
> grep nom_de_l_option /usr/portage/profiles/use.*
> ```
> ...

 

Quand on passe plusieurs fichiers à grep, du coup il les nomme dans les résultats. Je suppose que c'est pour éviter ce bruit supplémentaire que kopp passe par un cat. Mais le plus simple, ça serait d'utiliser ta méthode, avec l'option "-h": 

```
% grep -h flag /usr/portage/profiles/use*.desc
```

 Ou bien si on veut chercher vraiment just le flag nommé "flag", mais éviter les descriptions ou "flag" apparait, ou encore le flag "flagplop", on peut utiliser: 

```
% egrep -h '(^|:)flag -' /usr/portage/profiles/use*.desc
```

 Bon, ouais, ça se complique...

----------

## TGL

 *kopp wrote:*   

> c - la fonction auto-use de Portage
> 
> ...
> 
> Si pour le moment, vous voulez la contourner, il y a bien entendu une astuce, c'est de modifier l'ordre de priorité des définitions de la variable USE qui vaut par défaut : "env:pkg:conf:auto:defaults".
> ...

  Peut-être qu'ici il faudrait préciser que si ce qu'on veut c'est supprimer les auto-USE, alors il faut supprimer le ":auto" dans la liste. Donc plutôt: 

```
# echo "USE_ORDER=\"env:pkg:conf:defaults\"" >> /etc/make.conf 
```

 Et puis éventuellement préciser qu'en dehors de cette modification là, il n'y a rien d'autre qu'il soit raisonnable de changer. Enfin, c'est subjectif, mais bon, mettre par exemple les flags globaux comme plus prioritaires que ceux locaux, ça n'aurait pas beaucoup de sens.

Y'a juste "defaults" qu'on pourrait penser à virer aussi (ça, c'est les flags globaux par défaut, qui viennent du profile utilisé), mais c'est plus propre de mettre un -* au début de son USE dans make.conf pour ça. (Attention, c'est pas un truc que je conseille particulièrement hein : autant les flags auto c'est vraiment une nuisance, autant dans les flags defaults il y en a certains qui sont vraiment indispensables à la bonne marche du système, donc ne vous lancez là dedans que si vous savez ce que vous faites...).

----------

## yoyo

 *TGL wrote:*   

> Quand on passe plusieurs fichiers à grep, du coup il les nomme dans les résultats. Je suppose que c'est pour éviter ce bruit supplémentaire que kopp passe par un cat. Mais le plus simple, ça serait d'utiliser ta méthode, avec l'option "-h": 
> 
> ```
> % grep -h flag /usr/portage/profiles/use*.desc
> ```
> ...

 OK, merci pour l'explication.

Perso je préfère avoir le nom de fichier, ça m'influence pour placer mon flag (make.conf vs packages.use).   :Rolling Eyes: 

----------

## TGL

 *yoyo wrote:*   

> Perso je préfère avoir le nom de fichier, ça m'influence pour placer mon flag (make.conf vs packages.use).  

  Ouais mais de toute façon ça tu le vois parceque le format des lignes n'est pas le même :

 - dans use.desc :  flag - La description

 - dans use.local.desc :  category/package:flag - La description

----------

## kopp

Hop, merci pour les remarques, je vais faire quelques changement. Pour l'histoire de l'auto-use, petite faute de recopie j'ai oublié d'enlever le auto dans ma phrase  :Smile: 

Sinn pour la méthode simple, je crois pas qu'il y ait de raisons particulières, j'ai juste fait comme ça sans trop réfléchir  :Smile: 

----------

