<!--
        The FreeBSD Documentation Project
        The FreeBSD French Documentation Project

        $FreeBSD$
        Original revision: 1.9
--> 

<chapter id="kernelopts">
  <title>Ajouter de nouvelles options de configuration du noyau</title>
  
  <para><emphasis>Contribution de &a.joerg;</emphasis></para>
  &trans.a.haby;
  
  <note>
    <para>Vous devez &ecirc;tre familiaris&eacute; avec le chapitre 
      <link linkend="kernelconfig">Configurer le noyau de FreeBSD</link> avant 
      de lire ce chapitre.</para>
  </note>
  
  <sect1>
    <title>Au fait, qu'est-ce-qu'une <emphasis>option du 
      noyau</emphasis>&nbsp;?</title>
    
    <para>L'utilisation des options du noyau est principalement d&eacute;crite
      au chapitre <link linkend="kernelconfig-options">Configurer le noyau de
      FreeBSD</link>. Il y a aussi des explications &agrave; propos des options
      &ldquo;historiques&rdquo; et &ldquo;nouveau style&rdquo;. L'objectif final
      est de remplacer toutes les options support&eacute;es du noyau par des
      options de nouveau style, de fa&ccedil;on &agrave; ce que pour ceux qui
      ont correctement ex&eacute;cut&eacute; <command>make depend</command> dans
      leur r&eacute;pertoire de compilation du noyau apr&egrave;s
      &man.config.8;, la phase de compilation retrouve automatiquement les 
      options modifi&eacute;es et ne recompile que les fichiers 
      n&eacute;cessaires. Il n'y aura alors plus besoin d'effacer tous les 
      fichiers de l'ancien r&eacute;pertoire de compilation apr&egrave;s
      chaque &man.config.8;, comme c'est encore le cas.</para>

    <para>Une option du noyau n'est essentiellement rien de plus que la 
      d&eacute;finition d'une macro-instruction du pr&eacute;processeur C pour
      la compilation du noyau. Pour que la compilation soit vraiment
      optionnelle, la partie correspondante du source du noyau (ou le fichier
      <filename>.h</filename> du noyau) doit &ecirc;tre &eacute;crit avec
      l'option &agrave; l'esprit, i.e., la valeur par d&eacute;faut doit pouvoir
      &ecirc;tre surcharg&eacute;e par l'option de configuration. C'est 
      habituellement r&eacute;alis&eacute; avec quelque chose 
      comme&nbsp;:</para>

    <programlisting>
#ifndef CETTE_OPTION
#define CETTE_OPTION (une valeur par d&eacute;faut)
#endif /* CETTE_OPTION */
    </programlisting>
	
    <para>De la sorte, un administrateur donnant une autre valeur &agrave;
      l'option dans son fichier de configuration, d&eacute;sactivera la valeur
      par d&eacute;faut et la remplacera par sa nouvelle valeur. Bien
      &eacute;videmment, la nouvelle valeur sera substitu&eacute;e dans le code
      par le pr&eacute;processeur, ce doit donc &ecirc;tre une expression C
      valide dans le contexte dans lequel &eacute;tait utilis&eacute;e la
      valeur par d&eacute;faut.</para>
	
    <para>Il est aussi possible de d&eacute;finir une option sans valeur qui
      encadre une partie donn&eacute;e du code pour la mettre en service ou
      non&nbsp;:</para>
	
    <programlisting>
#ifdef CETTE_OPTION

[votre code]

#endif
    </programlisting>
	
    <para>Simplement indiquer <literal>CETTE_OPTION</literal> dans le fichier de
      de configuration (avec ou sans valeur) mettra en service le code
      correspondant.</para>
	
    <para>Les gens qui ont l'habitude du langage C auront imm&eacute;diatement
      compris que n'importe quoi peut &ecirc;tre une option de configuration,
      d&egrave;s lors qu'il y a au moins un <literal>#ifdef</literal> qui y fait
      r&eacute;f&eacute;rence... Il y a cependant peu de chance que beaucoup
      utilisent&nbsp;:</para>
	
    <programlisting>
options		notyet,notdef</programlisting>
	
    <para>dans leur fichier de configuration, et se demandent ensuite pourquoi
      la compilation du noyau &eacute;choue. <!-- smiley -->:-)</para>
	
    <para>A l'&eacute;vidence, donner n'importe quel nom aux options rend
      tr&egrave;s difficile de retrouver o&ugrave; elles sont utilis&eacute;es
      dans l'arborescence des sources du noyau. C'est la raison d'&ecirc;tre de
      l'organisation des options de <emphasis>nouveau style</emphasis>, 
      dans laquelle chaque option est d&eacute;finie dans un
      <filename>.h</filename> distinct du r&eacute;pertoire de compilation du
      noyau, appel&eacute; par convention
      <filename>opt_<replaceable>foo</replaceable>.h</filename>. De cette
      fa&ccedil;on, les d&eacute;pendances habituelles dans le 
      <filename>Makefile</filename> s'appliquent, et <command>make</command>
      peut savoir ce qu'il faut recompiler quand une option a &eacute;t&eacute;
      modifi&eacute;e.</para>
	
    <para>Le m&eacute;canisme d'option de style ancien a un avantage dans le cas
      des options locales ou &eacute;ventuellement exp&eacute;rimentales dont
      la dur&eacute;e de vie pr&eacute;vue est courte&nbsp;: comme il est
      simple d'ajouter un <literal>#ifdef</literal> au source du noyau, cela
      en fait d'office une option de configuration du noyau. Dans ce cas,
      l'administrateur qui utilise une telle option doit lui-m&ecirc;me
      savoir ce que cela implique (et &eacute;ventuellement forcer la
      recompilation de parties de son noyau). Une fois que toutes les options
      support&eacute;es auront &eacute;t&eacute; converties, &man.config.8; 
      &eacute;mettra un message d'avertissement toutes les fois qu'une option
      non support&eacute;e sera d&eacute;tect&eacute;e, mais il l'incluera
      malgr&eacute; tout dans le <filename>Makefile</filename> du 
      noyau.</para>
  </sect1>
  
  <sect1>
    <title>Que faut-il donc faire maintenant&nbsp;?</title>
    
    <para>Editez d'abord <filename>sys/conf/options</filename> (ou
      <filename>sys/i386/conf/options.<replaceable>&lt;arch&gt;</replaceable></filename>,
      e. g., <filename>sys/i386/conf/options.i386</filename>), et 
      s&eacute;lectionnez le fichier
      <filename>opt_<replaceable>foo</replaceable>.h</filename> o&ugrave; votre
      option ira le mieux.</para>
	
    <para>S'il y a d&eacute;j&agrave; quelque chose qui se rapproche de
      l'objectif de la nouvelle option, utilisez-le. Par exemple, les options
      qui modifient le comportement g&eacute;n&eacute;ral du sous-syst&egrave;me
      SCSI vont dans <filename>opt_scsi.h</filename>. Par d&eacute;faut, le fait
      d'indiquer une option dans le fichier d'option appropri&eacute;, disons
      <literal>FOO</literal>, implique que sa valeur sera d&eacute;finie dans le
      fichier <filename>opt_foo.h</filename>. Ce peut &ecirc;tre 
      surcharg&eacute; dans la partie droite de la r&egrave;gle en indiquant un
      autre nom de fichier.</para>
	
    <para>S'il n'y a pas encore de fichier
      <filename>opt_<replaceable>foo</replaceable>.h</filename> pour la nouvelle
      option envisag&eacute;e, inventez un nouveau nom. Faites en sorte qu'il
      soit significatif, et ajoutez des commentaires &agrave; la nouvelle 
      section du fichier
      <filename>options[<replaceable>.&lt;arch&gt;</replaceable>]</filename>.
      &man.config.8; s'apercevra automagiquement de la modification et 
      cr&eacute;era ce fichier la prochaine fois qu'il sera utilis&eacute;. La
      plupart des options vont normalement dans un fichier d'en-t&ecirc;te qui
      leur est propre.</para>
	
    <para>Incorporer trop d'options &agrave; un m&ecirc;me
      <filename>opt_<replaceable>foo</replaceable>.h</filename> entra&icirc;nera
      la recompilation de nombreux fichiers du noyau d&egrave;s qu'une des 
      options du fichier de configuration aura &eacute;t&eacute; 
      modifi&eacute;e.</para>
	
    <para>Pour finir, d&eacute;terminez quels fichiers du noyau d&eacute;pendent
      de la nouvelle option. A moins que vous veniez de l'inventer, et qu'elle
      n'existe encore nulle part&nbsp;:</para>
 <screen>&prompt.user; <userinput>find /usr/src/sys -name type f | xargs fgrep NEW_OPTION</userinput></screen> 
    <para>vous aidera &agrave; les trouver. Editez ces fichiers et 
      ajoutez-y&nbsp;:</para>
    <programlisting>
#include "opt_foo.h"
    </programlisting> 
    <para><emphasis>au d&eacute;but</emphasis>, avant tout autre
      <literal>#include &lt;xxx.h&gt;</literal>. Cet ordre est tr&egrave;s
      important, parce que les options peuvent surcharger les valeurs par
      d&eacute;faut des fichiers inclus habituels, si les valeurs par 
      d&eacute;faut sont donn&eacute;es sous forme&nbsp;:</para>
    <programlisting> 
#ifndef NOUVELLE_OPTION 
#define NOUVELLE_OPTION (quelque chose)
#endif
    </programlisting>   
    <para>dans l'en-t&ecirc;te habituelle.</para>
	
    <para>Ajouter une option qui red&eacute;finisse quelque chose dans un 
      fichier d'en-t&ecirc;te du syst&egrave;me (i.e., un fichier dans
      <filename>/usr/include/sys/</filename>) est presque toujours une erreur.
      <filename>opt_<replaceable>foo</replaceable>.h</filename> ne peut pas
      &ecirc;tre inclus dans ces fichiers parce que cela d&eacute;graderait plus
      s&eacute;rieusement les en-t&ecirc;tes, et s'il n'est pas inclus, il peut
      alors y avoir des valeurs inconsistantes pour l'option l&agrave; 
      o&ugrave; il est inclus. Oui, il y a d&eacute;j&agrave; des 
      pr&eacute;c&eacute;dents, mais cela ne rend pas l'op&eacute;ration plus
      correcte.</para>
  </sect1>
</chapter>

<!-- 
     Local Variables:
     mode: sgml
     sgml-declaration: "../chapter.decl"
     sgml-indent-data: t
     sgml-omittag: nil
     sgml-always-quote-attributes: t
     sgml-parent-document: ("../handbook.sgml" "part" "chapter")
     End:
-->

