Refaire votre monde (avec ``make world'')
Précédent |  | Suivant

# 6. Recompilez les sources et installez le nouveau système

## 6.1. Toutes versions

Vous devez être dans le répertoire `/usr/src`, donc:

    # cd /usr/src

(à moins, bien sûr, que votre code source soit ailleurs, auquel cas vous devez aller dans le répertoire correspondant).

Pour recompiler le système, vous utilisez la commande make(1). Cette commande lit ses instructions dans le fichier `Makefile`, qui décrit comment reconstruire les modules qui constituent FreeBSD, dans quel ordre, et ainsi de suite.

Le format général de la commande que vous taperez sera:

    # make -x -DVARIABLE cible

Dans cet exemple, `-`x`` est une option que vous donnez à make(1). Reportez-vous aux pages de manuel pour connaître les options disponibles.

`-D`VARIABLE`` transmet une variable au fichier `Makefile`. Le comportement de `Makefile` est défini par ces variables. Ce sont les mêmes variables que l'on trouve dans `/etc/make.conf`, et c'est un autre moyen de les positionner.

Par exemple:

    # make -DNOPROFILE=true cible

est une autre manière de dire qu'il ne faut pas compiler les bibliothèques profilées et correspond aux lignes:

    NOPROFILE=    true
    #   Avoid compiling profiled librairies
    #   Ne pas compiler les bibliothèques profilées

du fichier `/etc/make.conf`.

`cible` dit à make(1) ce que vous voulez faire. Chaque `Makefile` définit un certains nombre de ``cibles'' différentes, et votre choix de cibles détermine ce qui se passe.

Il y a des cibles définies dans le fichier `Makefile` que vous n'avez pas à employer. Ce sont des étapes intermédiaires utilisées par le processus de recompilation pour décomposer les étapes en sous-étapes.

La plupart du temps, vous n'aurez pas besoin de donner d'options à make(1), et votre commande sera simplement:

    # make cible

## 6.2. Enregistrez le résultat

C'est une bonne idée d'enregistrer le résultat de make(1) dans un ficher. Si quelque chose se passe mal, vous aurez une trace des messages d'erreur, et la liste complète de ce qui a été fait. Même si cela ne vous aide pas à diagnostiquer ce qui n'a pas marché, cela peut aider les autres si vous soumettez votre problème sur une des listes de diffusion de FreeBSD.

La meilleure façon de faire cela est d'utiliser la commande script(1), avec en paramètre le nom du fichier où enregistrer les résultats. Vous devez faire cela juste avant de recompiler le système, et taper `exit` une fois que c'est terminé.

    # script /var/tmp/mw.out
    Script started, output file is /var/tmp/mw.out
    # make world
    ... compile, compile, compile ...
    # exit
    Script done, ...

Si vous le faites, n'enregistrez pas les résultats dans `/tmp`. Ce répertoire peut être vidé au prochain redémarrage du sytème. Il vaut mieux les mettre dans `/var/tmp` (comme dans l'exemple précédent) ou dans le répertoire utilisateur de root.

## 6.3. Version 2.2.2 et antérieure

`/usr/src/Makefile` contient la cible ``world'', qui recompile tout le système et l'installe.

Utilisez donc:

    # make world

## 6.4. Version 2.2.5 et ultérieure

A partir de la version 2.2.5 de FreeBSD (de fait, c'est la première version à avoir été créée sur la branche -current, puis rapatriée dans la branche -stable entre les versions 2.2.2 et 2.2.5) la cible ``world'' a été décomposée en deux: ``buildworld'' et ``installworld''.

Comme leurs noms l'indiquent, ``buildworld'' reconstruit la nouvelle arborescence dans `/usr/obj`, et ``installworld'' l'installe sur la machine.

C'est très utile pour deux raisons. Tout d'abord, vous pouvez recompiler en toute sûreté, sans toucher aux composants du système actuel. Le processus est ``autonome''. Vous pouvez donc exécuter ``buildworld'' sur une machine en mode multi-utilisateurs sans redouter d'effets fâcheux. Je vous recommande néanmoins de toujours exécuter l'étape ``installworld'' en mode mono-utilisateur.

En second lieu, cela vous permet d'utiliser des systèmes de fichiers montés par NFS pour mettre à jour les autres machines de votre réseau. Si vous avez trois machines, A, B, et C que vous voulez mettre à jour, exécutez `make buildworld` et `make installworld` sur A. B et C doivent alors monter par NFS `/usr/src` et `/usr/obj` depuis A, et vous pouvez alors exécuter `make installworld` pour installer le système recompilé sur B et C.

La cible ``world'' existe toujours et vous pouvez l'utiliser exactement comme avec la version 2.2.2. `make world` exécute `make buildworld` suivi de `make installworld`.

> Note : Si vous utilisez séparement `make buildworld` et `make installworld`, vous devez donner à chaque fois les mêmes paramètres à make(1).

> Par exemple, si vous exécutez:

>     # make -DNOPROFILE=true buildworld

> vous devrez ensuite installer les résultats avec:

>     # make -DNOPROFILE=true installworld

> sinon il essayera d'installer les bibliothèques profilées qui n'ont pas été recompilées à l'étape `make buildworld`.

## 6.5. -current et ultérieure

Si vous êtes sur la branche -current, vous pouvez aussi donner l'option `-j` à `make`. Cela permet à `make` d'exécuter plusieurs programmes simultanément.

C'est particulièrement utile sur une machine avec plusieurs processeurs. Néanmoins, comme la compilation est plus gourmande en Entrées/Sorties qu'en CPU, c'est aussi utile sur une machine mono-processeur.

Typiquement, sur une machine mono-processeur, vous exécuteriez:

    # make -j4 cible

pour autoriser make(1) à exécuter 4 programmes simultanément. Les constatations empiriques postées sur les listes de diffusion montrent que c'est en général ce qui apporte le plus de gain en performances.

Si vous avez une machine multi-processeurs et que vous avez configuré un noyau SMP, essayez des valeurs entre 6 et 10 et voyez quel bénéfice vous en tirez.

N'oubliez pas que c'est toujours expérimental (au moment où j'écris ceci), et que des modifications de l'arborescence des sources rendent parfois cette possibilité inutilisable. Si vous n'arrivez pas à recompiler avec ce paramètre, essayez sans avant de signaler votre problème.

## 6.6. Durée

En supposant que tout ce passe bien, il vous faudra attendre entre une heure et demie et une demi-journée.

En règle générale, un P6 200MHz avec plus de 32MB de RAM et des disques SCSI corrects exécutera `make world` en environ une heure et demie. Un P133 32MB prendra 5 à 6 heures. Revoyez ces chiffres à la baisse si vos machines sont plus lentes...

Précédent | Sommaire | Suivant
Effacez `/usr/obj` |  | Mettez à jour `/etc`

Ce document, ainsi que d'autres peut être téléchargé sur ftp.FreeBSD.org/pub/FreeBSD/doc/.

Pour toutes questions à propos de FreeBSD, lisez la documentation avant de contacter <questions@FreeBSD.org>.
Pour les questions sur cette documentation, contactez <doc@FreeBSD.org>.