Les règles de réécriture permettent une modification dynamique des chemins d'inclusion. Elles sont préférentiellement employées pour les arbres décrivant une application multi-cibles (pensez au noyau d'un OS tournant sur différentes architectures matérielles ou à un compilateur avec plusieurs générateurs de code).

Pour être vraiment utiles, les règles de réécriture utilisent la substitution de 'variables'. La valeur de la variable pointe vers un répertoire ou contient une partie du nom du répertoire.

ATTENTION! L'emploi de la syntaxe inappropriée n'est pas détecté lors de la configuration mais provoque un erreur seulement quand les règles 'maps' sont mises à contribution. Par conséquent, la mauvaise écriture peut rester longtemps inaperçue avant de causer du désagrément.

Exemple (avec la syntaxe []):

Définissons une variable target pour contenir le nom de l'architecture cible de l'application (dans la mesure où ce nom fait partie des noms de répertoire):

, 'variables' => { 'v' => ... # Liste des versions , 'target' => { 'name' => 'Architecture cible' , 'range' => [qw(intel ppc m68k)] } }

Supposant que les instructions include sont écrites comme #include "asm/file.h" et qu'il existe un ensemble de répertoires asm-xxx dans /include, nous obtiendrons le bon hyperlien avec:

, 'incprefix' => [ '/include' ] , 'maps' => [ '\/asm[^\/]*\/' => '\/asm-$target\/' ]

Notes

Autre exemple (avec la syntaxe []):

Cet exemple donne les règles de premier niveau pour résoudre les instructions #include dans les noyaux Linux 2.x et 3.x.

Les fichiers référencés résident dans les répertoires /include et /arch pour les fichiers indépendants et dépendants d'une architecture respectivement.

Le répertoire arch est lui-même structuré de façon à n'imposer aucune contrainte sur son contenu. Les fichiers #include se trouvent dans le sous-répertoire include du sous-arbre dédié à l'architecture, soit /arch/xxx/include/asm/yyy.hxxx est remplacé par le nom de l'architecture. Ils sont référencés depuis le code source comme #include "asm/yyy.h".

Traditionnellement, le noyau utilise la variable a pour l'architecture cible. Le résultat désiré sera obtenu avec les paramètres suivants dans lxr.conf:

, 'variables' => { 'v' => ... # Liste des versions , 'a' => { 'name' => 'Architecture cible' , 'range' => [qw(x86 intel ppc m68k)] # et bien d'autres } } , 'incprefix' => [ '/include', '/arch/%=ARCH=%/include' ] , 'maps' => [ '\/arch\/%=ARCH=%\/' => '\/arch\/$a\/' ] %=ARCH=% ci-dessus n'a rien de magique. Son nom a été choisi en espérant que ce ne sera jamais un nom réel de répertoire dans l'arbre du noyau. Il est de la plus grande importance d'utiliser un symbole impossible (d'où les caractères % et = dans le nom) sinon des substitutions imprévues pourraient subvenir avec des résultats surprenants.

Le noyau Linux utilise l'un des systèmes de gestion de configuration les plus complexes dans le monde de l'open source. Se mesurer aux variantes de sous-architecture demande la définition de plus de variables et de plus de règles 'incprefix' et 'maps'. Configurer LXR pour le noyau Linux mérite un chapitre à part entière.

Vous trouverez dans les trucs et astuces deux exemples non triviaux de règles de réécriture.