mageekblog - Mot-clé - optimisationLe blog personnel de Frédéric Hardy. Au menu, PHP, agilité, FreeBSD, cuisine et photographies.2021-12-02T08:20:54+01:00Frédéric Hardyurn:md5:26874ca5b8cd4cac8d08b0e68e64f63aDotclearAccélérer la compilation sous freeBSDurn:md5:acf2ac79bb0af6184a51aa97372f76f62009-06-22T16:04:00+02:002009-06-22T16:04:00+02:00mageekguyTipscompilationFreeBSDoptimisation<p>Sous <a href="http://www.freebsd.org">freeBSD</a>, la compilation est <del>un mal</del> une étape nécessaire.</p>
<p>En effet, même s'il est possible de passer par des packages binaires pour installer les applications, il est de bon ton de compiler ces dernières à des fins d'optimisation, et de tout façon, la mise à jour du système passe obligatoirement par une étape de compilation.</p>
<p>Or, une compilation peut prendre du temps, beaucoup de temps, trop de temps.</p>
<p>Heureusement, il existe plusieurs méthodes pour accélérer la chose de manière significative.</p> <p>La plus simple et la plus rapide à mettre en oeuvre consiste à rajouter la variable <code>MAKE_JOBS_NUMBER</code> dans <code>/etc/make.conf</code>, afin de profiter de la parallélisation de <code>make</code> sur les processeurs multi-coeurs pour la compilation des <code>ports</code> qui sont capable de le faire:</p>
<p>echo 'MAKE_JOBS_NUMBER=6' >> /etc/make.conf</p>
<p>Il est à noter que l'ajout de cette ligne n'est pas obligatoire pour profiter de cette fonctionnalité, puisque le niveau de parallélisation est défini par défaut au nombre de cœurs dont dispose votre micro-processeur.</p>
<p>Si vous êtes téméraire, vous pouvez forcer l'utilisation de la parallélisation pour tous les ports, indépendament du fait qu'il l'a supporte :
</p>
<pre><code>echo 'DISABLE_MAKE_JOBS=yes' >> /etc/make.conf</code></pre>
<p>Il est également possible de la désactiver, même si cela n'a strictement aucun intêret :
</p>
<pre><code>echo 'DISABLE_MAKE_JOBS=yes' >> /etc/make.conf</code></pre>
<p>La mise en œuvre de l'utilitaire <code>ccache</code> est une autre méthode, parfaitement compatible avec la première, pour accélérer la compilation.</p>
<p>Le principe de cet utilitaire est simple puisqu'il met tout simplement en cache le résultat de chaque compilation pour le réutiliser lors des prochaines compilations, s'il y a lieu.</p>
<p>Son installation est simple :
</p>
<pre><code>cd /usr/ports/deve/ccache && make install clean</code></pre>
<p>Il suffit ensuite de rajouter les directives adéquates dans le fichier /etc/make.conf à l'aide de votre éditeur favori :
</p>
<pre><code>.if !defined(NO_CACHE)<br /> CC= /usr/local/libexec/ccache/world-cc<br /> CCX= /usr/local/libexec/ccache/world-c++<br />.endif<br /><br />.if ${.CURDIR:M*/ports/devel/ccache}<br /> NO_CCACHE= yes<br />.endif</code></pre>
<p>Il faut également ajouter les lignes suivantes dans votre fichier ~/.bashrc, si vous utilsez <code>bash</code> et <code>sudo</code> :
</p>
<pre><code>export PATH=/usr/local/libexec/ccache:$PATH<br />export CCACHE_PATH=/usr/bin:/usr/local/bin<br />export CCACHE_DIR=/var/tmp/ccache<br />export CCACHE_LOGFILE=/var/log/ccache.log<br /><br />if [[ -x /usr/local/bin/ccache ]];<br />then<br /> /usr/local/bin/ccache -M 4GB > /dev/null<br />fi</code></pre>
<p>Une fois votre fichier <code>~/.bashrc</code> rechargé, vous disposerez d'un cache de compilation de 4GB dans <code>/var/tmp/ccache</code>.
</p>
<p>Vous pourrez consulter l'état de votre cache avec la commande suivante :
</p>
<pre><code>ccache -s</code></pre>
<p>Vous pourrez également connaître l'activité de votre cache et notamment son contenu avec la commande suivante :
</p>
<pre><code>tail -f /var/log/ccache.log</code></pre>
<p>Enfin, vous pouvez utilisez le script <code>buildflags</code> des <code>bsdadminscripts</code> pour rendre vos compilations plus conviviales en définissant un certain nombre de directives de compilation une fois pour toute.</p>
<p>Encore une fois, l'installation se fait de la façon la plus traditionnelle qui soit :
</p>
<pre><code>cd /usr/ports/sysutils/bsdadminscripts && make install clean</code></pre>
<p>Une fois l'installation terminée, il faut rajouter les lignes suivantes dans votre fichier <code>/etc/make.conf</code> :
</p>
<pre><code>BUILDFLAGS=/usr/local/share/bsdadminscripts/buildflags.mk<br />.if exists(${BUILDFLAGS})<br />.include "${BUILDFLAGS}"<br />.endif</code></pre>
<p>Il ne vous reste plus qu'à renommer le fichier <code>/usr/local/etc/buildflags.conf.sample</code> en <code>/usr/local/etc/buildflags.conf</code> et à en modifier le contenu en fonction de vos besoins, comme par exemple définir la directive <code>FORCE_MAKE_JOBS</code> en fonction du ports que vous voulez compiler, ou bien pour définir des arguments de compilation une bonne fois pour toute.</p>
<p>Si par hasard vous avez des difficultés à comprendre le format du fichier, la commande <code>man buildflags.conf</code> est votre amie.</p>
<p>Enfin, pour encore accélérer la compilation, il est possible d'utiliser <code>distcc</code> mais sa mise en oeuvre fera l'objet d'un autre billet.</p>http://blog.mageekbox.net/?post/2009/06/22/Acc%C3%A9l%C3%A9rer-la-compilation#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/55