LinuxPedia

Wiki libre et indépendant dédié à GNU-Linux et BSD.

Outils pour utilisateurs

Outils du site


gent:optimisation_des_cflags_et_changement_de_chost

— page corrigée — TheShift 2009/03/27 22:54

Optimiser CFLAGS et CHOST

Voici un tuto plus complet sur les changements de CFLAGS et de CHOST pour optimiser la compilation sur votre système.

Pour illustrer mes propos, j'accompagnerai mes explications d'un exemple de la procédure pour un Athlon XP 2000+.

Pour déterminer le type de processeur, on tape la commande suivante en mode console :

cat /proc/cpuinfo

Dans mon cas, ça donne ceci :

processor : 0
vendor_id : AuthenticAMD
cpu family : 6
model : 8
model name : AMD Athlon(tm) XP 2000+
etc., etc.

Ensuite, on consulte la liste de Cflags sûrs sur le wiki de Gentoo (http://fr.gentoo-wiki.com/HOWTO_CFLAGS), et on choisit le bon processeur, dans mon cas, ceci :

Athlon-tbird XP (AMD)
vendor_id : AuthenticAMD
cpu family : 6
model : 8
model name : AMD Athlon(tm)

à changer dans /etc/make.conf

CHOST="i686-pc-linux-gnu"
CFLAGS="-march=athlon-xp -O2 -pipe -fomit-frame-pointer"
CXXFLAGS="${CFLAGS}"

En principe, il suffit de coller les codes dans les bons champs. Toutefois, dans le cas présent, le CHOST était originellement i586-pc-linux-gnu, ce qui implique un changement plus important que celui des CFLAGS. Ce genre de situation s'adresse surtout aux gens qui ont installé une distribution pré-compilée de Gentoo et à ceux qui ont compilé pour un i386 ou un i486 et qui doivent mettre à jour leur CHOST pour des raisons de compatibilité afin de pouvoir utiliser les nouvelles versions de certains paquetages.

La mauvaise nouvelle est que cela peut endommager sérieusement un système si c'est mal fait. La bonne nouvelle, c'est que la procédure n'est pas trop compliquée et les chances de réussite sont très bonnes si on suit rigoureusement la procédure.

La première chose à faire évidemment, c'est de changer la variable CHOST dans votre /etc/make.conf si vous ne l'avez pas déjà fait plus haut.

Une fois que c'est fait, il faut recompiler certains paquetages en tapant la commande suivante en mode console :

emerge -av1 binutils gcc glibc

Ensuite, il faut vérifier que tout est bien configuré :

gcc-config -l
[1] i686-pc-linux-gnu-4.1.1 *
gcc-config -c
i686-pc-linux-gnu-4.1.1
binutils-config -l
[1] i686-pc-linux-gnu-2.16.1 *
binutils-config -c
i686-pc-linux-gnu-2.16.1

Ensuite, on regarde s'il reste des traces de l'ancienne configuration dans /etc/env.d :

cd /etc/env.d/
grep 586 *
05gcc-i586-pc-linux-gnu:PATH="/usr/i586-pc-linux-gnu/gcc-bin/4.1.1"
05gcc-i586-pc-linux-gnu:ROOTPATH="/usr/i586-pc-linux-gnu/gcc-bin/4.1.1"

Nota : Les résultats peuvent varier d'un système à l'autre. Une entrée vide signifie tout simplement que tout fonctionne.

Avant d'enlever ces références, il faut vérifier la présence de leurs équivalents dans la nouvelle configuration :

grep 686 *
05binutils:MANPATH=/usr/share/binutils-data/i686-pc-linux-gnu/2.16.1/man
05binutils:INFOPATH=/usr/share/binutils-data/i686-pc-linux-gnu/2.16.1/info
05binutils:LDPATH=/usr/i686-pc-linux-gnu/lib
05gcc:PATH="/usr/i686-pc-linux-gnu/gcc-bin/4.1.1"
05gcc:ROOTPATH="/usr/i686-pc-linux-gnu/gcc-bin/4.1.1"
05gcc:MANPATH="/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/man"
05gcc:INFOPATH="/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/info"
05gcc:LDPATH="/usr/lib/gcc/i686-pc-linux-gnu/4.1.1"

Tout à l'air beau et comme il ne devrait y avoir qu'une seule instance de ces variables, il faut enlever l'ancienne variable :

rm 05gcc-i586-pc-linux-gnu

Maintenant, il faut vérifier le répertoire /etc/env.d/binutils/

cd /etc/env.d/binutils/
ls -la
total 8
-rw-r--r-- 1 root root 15 Sep 3 13:48 config-i686-pc-linux-gnu
-rw-r--r-- 1 root root 126 Sep 3 13:48 i686-pc-linux-gnu-2.16.1
cat config-i686-pc-linux-gnu
CURRENT=2.16.1

cat i686-pc-linux-gnu-2.16.1

TARGET="i686-pc-linux-gnu"
VER="2.16.1"
LIBPATH="/usr/lib/binutils/i686-pc-linux-gnu/2.16.1"
FAKE_TARGETS="i686-pc-linux-gnu"

Il faut aussi vérifier le répertoire de GCC :

cd /etc/env.d/gcc
ls -la
total 12
-rw-r--r-- 1 root root 32 Sep 3 16:43 config
-rw-r--r-- 1 root root 32 Aug 3 14:25 config-i386-pc-linux-gnu
-rw-r--r-- 1 root root 292 Sep 3 16:43 i686-pc-linux-gnu-4.1.1
cat config
CURRENT=i686-pc-linux-gnu-4.1.1
cat config-i586-pc-linux-gnu
CURRENT=i586-pc-linux-gnu-4.1.1
cat i686-pc-linux-gnu-4.1.1
PATH="/usr/i686-pc-linux-gnu/gcc-bin/4.1.1"
ROOTPATH="/usr/i686-pc-linux-gnu/gcc-bin/4.1.1"
LDPATH="/usr/lib/gcc/i686-pc-linux-gnu/4.1.1"
GCCBITS="32"
MANPATH="/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/man"
INFOPATH="/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/info"
STDCXX_INCDIR="g++-v4"

Les fichiers config et i686-pc-linux-gnu-4.1.1 sont en ordre, mais il reste un fichier à enlever : config-i586-pc-linux-gnu.

rm config-i586-pc-linux-gnu

Maintenant que tout est nettoyé, il faut mettre à jour l'environnement :

env-update && source /etc/profile

Ensuite, vérifier (encore!) que tout est en ordre :

grep -r 586 /etc/env.d/

S'il ne reste rien, tant mieux! Sinon, il faut enlever les fichiers fautifs.

Pour finir, il faut recompiler libtool et exécuter fix_libtools_files.sh. Faire bien attention d'utiliser la bonne version de GCC!

emerge -av1 libtool
fix_libtool_files.sh 4.1.1 --oldarch i586-pc-linux-gnu

Voilà, c'est fait! Enfin, presque! Il reste un choix à faire : recompiler ou ne pas recompiler. Dans le premier cas, utiliser la commande suivante :

emerge -e world

En théorie, cette opération n'est pas obligatoire. Toutefois, pour ceux qui choisissent de ne pas recompiler, il est fortement recommandé de recompiler python et les paquetages perl liés à CHOST :

emerge -av1 python
emerge -av portage-utils
emerge -av1 `qfile /usr/lib/perl* -Cq | sort -u`

Et voilà, c'est fini!

Adapté à partir de la documentation officielle de Gentoo et du wiki.

gent/optimisation_des_cflags_et_changement_de_chost.txt · Dernière modification : 2018/11/17 12:53 de 127.0.0.1