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.
'maps'
sont
mises à contribution.
Par conséquent, la mauvaise écriture peut rester longtemps inaperçue
avant de causer du désagrément.
motif_source
est un motif Perl sans délimiteurs. Il est fortement recommandé de l'entourer de délimiteurs de chemin pour éviter une correspondance intempestive avec une partie du nom d'un répertoire au lieu du nom entier (à moins, bien sûr, que ce soit l'effet escompté).
remplacement
fournit la chaîne de remplacement pour le motif correspondant.
Elle peut proposer une substitution par le contenu de variables
en y insérant $nom_var
.
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):
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:
Notes
Vous ne connaissez pas le contexte d'emploi du motif par LXR; pour éviter diverses erreurs de syntaxe, protégez systématiquement tous les caractères spéciaux littéraux.
'maps'
ci-dessus
a un domaine de capture plus vaste que celui
requis par l'énoncé
Le motif capture n'importe quel nom de répertoire
commençant par asm
(tel que asm
, asm.backup
, etc.)
et le remplace par asm-xxx
.
Si vous voulez vraiment ne transformer qu'un chemin
strictement défini par l'énoncé,
utilisez le motif \/include\/asm\/
.
Rappelez-vous que les valeurs des variables sont affichées dans l'en-tête de la page comme un ensemble de "boutons". Cliquez sur l'un (ou sélectionnez un article de menu et appuyez sur le bouton Change) et les hyperliens sont recalculés.
Autre exemple (avec la syntaxe []
):
#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.h
où xxx
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:
%=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.