# [EMERGE]régler les CFLAGS par paquet \o/

## fabienZ

C'est avec une joie indescriptible que j'ai découvert dans les recoins d'une ml, comment configurer proprement mes CFLAGS par paquet.

Et c'est avec la même joie que je vais tacher de vous l'expliquer au mieux.

Rien ne vaut un exemple.

Prennons une appli rapide à compiler : app-office/grisbi

il faut tout d'abord créer un dossier :

```
mkdir -p /etc/portage/env/app-office
```

ensuite créer un fichier "/etc/portage/env/app-office/grisbi" qui contient :

```
CFLAGS=-march="ce-que-vous-voulez -pipe"
```

et voilà, c'est tout !

NOTE: Au On peut aussi préciser le no de version et même le no de révision (qui doit être précisé dans le nom de fichier).

NOTE BIS : Ca marche avec n'importe qulle variable (CXXFLAGS, LDFLAGS etc ...)

Ceci fonctione grâce à /usr/portage/profiles/base/profile.bashrc qui est executé par emerge.

Bon je vous laisse, j'ai plein de trucs à configurer du coup  :Smile: 

----------

## Enlight

 :Shocked:  pitain je savais pas!!!!!!!!!!!!

----------

## Darkael

Intéressant. Pour les CFLAGS je préfère toujours la solution du script dans /etc/portage/bashrc qui permet un réglage plus fin (juste ajouter ou retirer un cflag), mais pour régler d'autres variables d'environnement cette solution est beaucoup plus simple!

----------

## yoyo

 *KarnEvil wrote:*   

> Intéressant. Pour les CFLAGS je préfère toujours la solution du script dans /etc/portage/bashrc qui permet un réglage plus fin (juste ajouter ou retirer un cflag), mais pour régler d'autres variables d'environnement cette solution est beaucoup plus simple!

 Un réglage plus fin ? D'après ce que j'ai saisi de cette feature, il est possible de choisir des CFLAGS spécifiques pour chaque paquet, voir pour chaque version de paquet. J'ai du mal à comprendre comment on peut faire plus fin.

Mais d'un autre côté, je ne connais pas non plus la solution du script dans /etc/portage/bashrc.   :Rolling Eyes:  Tu peux nous en dire plus KarnEvil ?

----------

## Darkael

 *yoyo wrote:*   

>  *KarnEvil wrote:*   Intéressant. Pour les CFLAGS je préfère toujours la solution du script dans /etc/portage/bashrc qui permet un réglage plus fin (juste ajouter ou retirer un cflag), mais pour régler d'autres variables d'environnement cette solution est beaucoup plus simple! Un réglage plus fin ? D'après ce que j'ai saisi de cette feature, il est possible de choisir des CFLAGS spécifiques pour chaque paquet, voir pour chaque version de paquet. J'ai du mal à comprendre comment on peut faire plus fin.
> 
> Mais d'un autre côté, je ne connais pas non plus la solution du script dans /etc/portage/bashrc.   Tu peux nous en dire plus KarnEvil ?

 

Oui désolé ce que j'ai dit étais un peu vague parce que j'étais pressé d'aller manger  :Smile: 

Bref, pour le /etc/portage/bashrc:

http://gentoo-wiki.com/TIP_The_/etc/portage/bashrc_file

En gros, c'est un fichier qui est sourcé avant chaque emerge et qui permet de paramétrer l'environnement. Avec ce fichier on peut faire plein de choses, dont les CFLAGS par package, avec un /etc/portage/package.cflags qui s'utilise comme les /etc/portage/packages.use et compagnie (y'a quelques exemples écrits par les devs dans le wiki). 

En creusant un peu et en utilisant les fonctions de portage on peu faire du versioning (=,>,etc.)  et aussi modifier les CFLAGS de façon plus subtile, i.e. on peut non seulement les remplacer, mais aussi juste en ajouter ou retirer certains (je sais pas si c'est possible avec le /etc/portage/env ?), du coup on se retrouve avec un /etc/portage/package.cflags comme ça:

```

sys-apps/sed append -ftree-vectorize

>sys-libs/glibc-2.6.1 remove -ffast-math -ftrace

=sys-devel/gcc-4.0.1 replace -02 -03

...

```

J'avais écrit un bashrc qui fait ça, basé sur celui qu'on trouve ici http://thiefofslippers.livejournal.com/, mais modifié pour gcc et qui supporte le versioning. Je peux le poster plus tard si ça intéresse des gens (pas maintenant vu que je suis pas chez moi  :Smile:  )

----------

## fabienZ

 *KarnEvil wrote:*   

> 
> 
> Bref, pour le /etc/portage/bashrc:
> 
> http://gentoo-wiki.com/TIP_The_/etc/portage/bashrc_file
> ...

 

Je ne connaissais pas pas du tout cette fonctionalité, c'est vraiment bien pratique.

En effet ça permet beaucoup plus de choses, par exemple de pouvoir changer des flags pour toute une catégorie, c'est génial  :Smile: .

Juste un peu plus contraignant à mettre en place (bon, copier un script dans /etc/portage c'est pas la mort, sauf que vu que c'est de l'expérimental j'aurais tendance à vouloir refaire tout ce qui ne me plait pas à ma façon  :Laughing: ).

Je te rejoins quand même là dessus, je préfére aussi la solution avec /etc/portage/bashrc (et pas seulement pour les cflags d'ailleurs).

Sinon, oui on peut ajouter ou retirer certains flags /etc/portage/env en jouant avec les variables, mais c'est moins joli :

- append :

```
CFLAGS="${CFLAGS} -ftree-vectorize"
```

- remove : (là c'est moins bien ^^)

```

CFLAGS="${CFLAGS/-ffast-math }"

CFLAGS="${CFLAGS/-ftrace }"

```

- replace :

```
CFLAGS="${CFLAGS/-O2/-O3}"
```

----------

## titoucha

Merci aux deux j'avais justement quelques petits soucis qui vont pouvoir être solutionnés avec l'une ou l'autre des méthodes je vais de ce pas me plonger dedans mais de prime abord j'ai une petite préférence pour le fichier package.cflags.

Edit: je suis intéressé par ton bashrc.Last edited by titoucha on Tue Jul 11, 2006 2:10 pm; edited 1 time in total

----------

## truc

Je suppose donc que ça peut marcher avec la variable EXTRA_CONF normalement disponible pour les package?! parce que, c'est vite pénible de devoir lancer des merge manuellement, tout ça pour modifier cette variable.. :/

merci  :Smile: 

----------

## titoucha

J'ai pas essayé pour cette variable mais par contre je viens de tester pour la variable FEATURES et sa fonctionne bien avec la méthode décrite en premier, le fichier dans /etc/portage/env/....

----------

## Trevoke

C'est pas plutot une astuce, ca?  :Wink: 

----------

## titoucha

Oui et même une bonne   :Very Happy: 

----------

## yoyo

 *titoucha wrote:*   

> Edit: je suis intéressé par ton bashrc.

 ++

@Trevoke et titoucha : on a eu une conversation avec l'auteur pour déplacer ce thread dans le sous-forum. J'ai voulu le laisser ici quelques temps car certains ne vont qu'occasionnellement dans le sous-forum et auraient pu rater celà.

Mais je vais le déplacer de ce pas et laisser un pointeur ici.

Enjoy !

EDIT : done

----------

## truc

Ca marche avec EXTRA_ECONF , c'est de la balle ce truc, je suis fan (de moi?  :Laughing:  )

----------

## Darkael

Désolé pour le retard, voila mon /etc/portage/bashrc.

En fait je me suis souvenu que je l'avais perdu (je crois même que je l'ai dit dans un autre thread  :Embarassed: ), et donc je l'ai réécrit en catastrophe.

```

replace-all-flags() {

    CFLAGS=$*

    CXXFLAGS=${CFLAGS}

}

override-env() {

    inherit versionator flag-o-matic

    [[ -r ${ROOT}/etc/portage/package.cflags ]] || return 0

    while read -a target ; do

        package_string=${target}

        action=${target[1]}

        flags=${target[@]:2}

        match=0

        comp=$(expr "$package_string" : "\([<>=]\)")

        package_string=${package_string##"$comp"}

        package=$(expr "$package_string" : "\(${CATEGORY}/${PN}\)")

        if [[ ! "$package" == "" ]]; then

            package_string=${package_string##"$package"}

            if [[ $package_string == "" ]]; then

                match=1

            else

                if [[ ${package_string:0:1} == "-" ]]; then

                    version=${package_string##"-"}

                    if (($(expr "$version" : [0-9]) > 0 )); then

                        version_compare "$version" "$PV"

                        comp_result=$?

                        case "$comp_result" in

                            1) [[ $comp == ">" || $comp == ">=" ]] && match=1 ;;

                            2) [[ $comp == "=" ]] && match=1 ;;

                            3) [[ $comp == "<" || $comp == "<=" ]] && match=1 ;;

                            *) match=0;;

                        esac

                    fi

                fi

            fi

        fi

        if [[ $match == "1" ]]; then

            einfo "Flags will be modified with the following action: $action $flags"

            case "${action}" in

                a|append) append-flags $flags ;;

                r|replace) replace-flags $flags ;;

                o|override) replace-all-flags $flags ;;

                s|strip) filter-flags $flags ;;

                *) : ;;

            esac

            export CFLAGS CXXFLAGS

            einfo CFLAGS=$CFLAGS

            einfo CXXFLAGS=$CXXFLAGS

        fi

    done < ${ROOT}/etc/portage/package.cflags

    export ALLOWED_FLAGS=${CFLAGS} #update our flags if they changed

}

case "$*" in

    depend) : ;;

    *)

        [[ "$*" = "compile" ]] && override-env

    ;;

esac

```

Donc ça s'utilise avec un /etc/portage/package.cflags dans ce genre là:

```

>x11-wm/fvwm-2.15.5 append -ftree-vectorize

sys-devel/bc replace -O2 -O3

sys-devel/bc strip -ffast-math

<=sys-devel/glibc-2.3.5 override -march=k8 -02 -pipe

```

(c'est juste des exemples hein, c'est à vous seul de voir ce que voulez faire)

Les actions possibles sont:

-append: ajouter des flags

-strip: retirer des flags

-replace: remplacer un flag par un autre

-override: remplacer tout les flags

Ça supporte le versioning comme vous pouvez le voir (sauf les ~), et il est possible de mettre plusieurs lignes pour combiner les actions.

J'ai testé avec quelques exemples et ça a l'air de marcher, mais il est possible qu'il y ait des bugs dûs soit à mes pauvres compétences en bash, soit à l'eclass versionator qui ne marche pas tout le temps.

Si quelqu'un a des suggestions d'amélioration, qu'il n'hésite pas  :Smile:  .

----------

## titoucha

Il fonctionne très bien.

Au rayon suggestions ce serait bien qu'il supporte la  gestion des flags par groupe, par exemple si je veux modifier les CFLAGS pour tous les ebuilds dans sys-devel en même temps.

----------

## Darkael

 *titoucha wrote:*   

> Il fonctionne très bien.
> 
> Au rayon suggestions ce serait bien qu'il supporte la  gestion des flags par groupe, par exemple si je veux modifier les CFLAGS pour tous les ebuilds dans sys-devel en même temps.

 

Perso, je vois pas trop l'utilité, mais pourquoi pas  :Smile:  Le script légèrement modifié.

On peut maintenant utiliser un truc du genre:

```

sys-devel remove -ftree-vectorize

```

----------

## titoucha

Je vais tester, j'y vois l'utiliter surtout pour modifier le flag -Ox pour tout un groupe de programme par exemple j'essaye d'optimiser la vitesse au maximum pour tout ce qui est dans media-video.

PS: encore merci pour le script.

----------

## GentooUser@Clubic

Up pour ce topic très intéressant

Le script de KarnEvil est très interessant, cependant depuis que je l'ai installé j'ai ces messages a chaque emerge 

 *Quote:*   

> QA Notice: ECLASS 'versionator' inherited illegally in sys-devel/m4-1.4.6
> 
> QA Notice: ECLASS 'flag-o-matic' inherited illegally in sys-devel/m4-1.4.6
> 
> QA Notice: ECLASS 'eutils' inherited illegally in sys-devel/m4-1.4.6
> ...

 

Je pense qu'il ne sont pas important, mais y'a moyen de corriger ?

Sinon si j'ai dans mon package.cflags

```
media-video append -ffast-math

media-video/kaffeine strip -ffast-math
```

Ça donne bien le résultat escompté (soit l'ajout de -ffast-math pour tous le paquets de media-video sauf kaffeine) ?

J'aurais bien testé moi-même mais comme je suis en plein emerge -e world

----------

## Max.Lelubre

up antédiluvien ^^

Ça marche toujours ! 

Par contre depuis le temps portage a-t-il intégré une autre fonctionnalité équivalente ?

Merci  :Smile: 

----------

## RaX

Très sympa comme astuce.

Merci.

----------

