Compilation

De Diablotins.org.

(Redirigé depuis Ccache)


Améliorer les performances de compilation
Image:brush.png


Sommaire

cache de compilation

Afin de réduire la durée des compilations et surtout des re-compilations, utilisez un cache qui va mémoriser les compilations. installez le port devel/ccache.

cet outil peut être appelé directement par certain ports comme, OpenOffice.org, par la commande “WITH_CCACHE”:

make WITH_CCACHE=yes package package-rename

Vous pouvez aussi le définir par défaut, dans /etc/make.conf:

.if (!empty(.CURDIR:M/usr/src*) || !empty(.CURDIR:M/usr/obj*))
.if !defined(NOCCACHE)
CC:=${CC:C,^cc,/usr/local/libexec/ccache/world/cc,1}
CXX:=${CXX:C,^c\+\+,/usr/local/libexec/ccache/world/c++,1}
.endif
.endif

Comme indiqué dans /usr/local/share/doc/ccache/ccache-howto-freebsd.txt.


Certains ports ne se compileront pas avec CCache, dont CCache lui-même; définissez pour ceux là l'option NOCCACHE

make -DNOCCACHE install

Par contre, pour éviter que CCache ne créé son cache dans l'espace root, où il n'y a généralement pas de place, redéfinissez les variables d'environnement suivantes dans votre shell, ici /etc/csh.cshrc:

setenv PATH /usr/local/libexec/ccache:$PATH
setenv CCACHE_PATH /usr/bin:/usr/local/bin
setenv CCACHE_DIR /var/tmp/ccache         # !
setenv CCACHE_LOGFILE /var/log/ccache.log

ou dans /etc/login.conf pour que tous les interpréteurs le comprennent.


Vous pouvez analyser l'activité de CCache par:

ccache -s

puis

david:~>tail -f /var/log/ccache.log

GCC4

GCC4.4 n'est pas disponible dans la base, mais pour profiter des optimisations de GCC 4.4 (dont le SSSE3, et plus ), vous pouvez l'installer.

Prenez bien note que le jeu SSSE3 n'est disponible que pour les processeurs Intel, Xéon et Core2.

Comme indiqué ici, installez les ports devel/binutils et lang/gcc44, puis configurez make.conf:

.if !empty(.CURDIR:M/usr/ports/*) && exists(/usr/local/bin/gcc44)
 CC=gcc44
 CXX=g++44
 CPP=cpp44
.endif

et adaptez libmap.conf:

libgcc_s.so.1   gcc44/libgcc_s.so.1
libgomp.so.1    gcc44/libgomp.so.1
libobjc.so.3    gcc44/libobjc.so.2
libssp.so.0     gcc44/libssp.so.0
libstdc++.so.6  gcc44/libstdc++.so.6

Attention, certains ports ne fonctionneront pas, ainsi, précisez les dans make.conf

.if !empty(.CURDIR:M/usr/ports/*) && exists(/usr/local/bin/gcc44)
 .if empty(.CURDIR:M/usr/ports/xxx/port1*) && empty(.CURDIR:M/usr/ports/yyy/port2*) 
  CC=gcc44
  CXX=g++44
  CPP=cpp44
  CFLAGS+=-mssse3
 .endif
.endif

Ou, si vous utilisez votre architecture de base, remplacez le CFLAGS par

CPUTYPE?=native

Ou plus précisément, certains refusent seulement l'option SSSE3, précisez le:

.if !empty(.CURDIR:M/usr/ports/*) && exists(/usr/local/bin/gcc44)
 CC=gcc44
 CXX=g++44
 CPP=cpp44
 .if  empty(.CURDIR:M/usr/ports/xxx/port3*)
   CFLAGS+=-mssse3
 .endif
.endif

Suivez ce lien pour découvrir une liste de ports à exclure de GCC 4.4.

Et finalement?

Quel est donc le résultat de tous ces réglages ?
Que va faire le compilateur, avec par exemple, l'option CPUTYPE à native sur mon AMD Athlon x2 ?
Pour GCC4.4:

david:~>gcc44 -march=native -E -v - < /dev/null | & fgrep cc1
/usr/local/libexec/gcc44/gcc/x86_64-portbld-freebsd8.0/4.4.3/cc1 -E -quiet -v - -march=amdfam10 -mcx16 -msahf -mpopcnt --param l1-cache-size=64  
--param l1-cache-line-size=64 --param l2-cache-size=512 -mtune=amdfam10


Pour le monde, avec le compilateur livré de base:

david:~>cc -march=native -E -v - < /dev/null | & fgrep cc1
/usr/libexec/cc1 -E -quiet -v -D_LONGLONG - -march=k8 -mtune=k8

On peut noter que GCC44.3 est plus pointilleux.

LLVM/CLANG

Ce nouveau compilateur est disponible depuis FreeBSD 8 ( 7, en fait, mais ce n'était pas très au point).
Pour l'activer, définissez le dans make.conf:

#<---   CLANG --->
.if  (!empty(.CURDIR:M/usr/src*) || defined(WITHCLANG)) && !defined(NOCLANG) 
.if !defined(CC) || ${CC} == "cc"
CC=clang
.endif
.if !defined(CXX) || ${CXX} == "c++"
CXX=clang++
.endif
.if !defined(CPP) || ${CPP} == "cpp"
CPP=clang -E
.endif
# Don't die on warnings
NO_WERROR=
WERROR=
# Don't forget this when using Jails!
#NO_FSCHG=
.endif

Dont le comportement donne:

  1. De base, autorise la compilation pour CLANG pour le monde et le noyau uniquement.
cd /usr/src && make buildworld && make kernel
  1. À moins que vous ne déclariez la variable WITHCLANG.
make -DWITHCLANG
Joueur:
cd /usr/ports/x11/kde4/ && make install -DWITHCLANG
  1. Retour à la case GCC si la variable NOCLANG est définie.
make -DNOCLANG

Malgré tout cela, certains ports continueront à utiliser GCC, quoique vous fassiez;tout simplement parce qu'il est clairement défini dans les makefiles.

Outils personnels
Projets :