'maps'
.
Avec les versions antérieures, la disposition de l'en-tête des pages
sera horriblement embrouillée
et le résultat final ne sera pas garanti
(il dépend de l'ordre d'extraction des clefs
qui peut varier d'exécution en exécution selon la documentation Perl).
Le noyau Linux a été porté sur de nombreuses architectures informatiques. Toutefois, il n'existe qu'un arbre source englobant toutes les "fonctionnalités" et "machines" possibles.
Pour être gérable, l'arbre source est divisé en répertoires plus petits, contenant éventuellement des sous-répertoires pour garder les choses bien en ordre:
Le répertoire include/ lui-même possède une organisation similaire avec beaucoup de sous-répertoires nommés selon la fonctionnalité. Les définitions non rattachées à une fonctionnalité sont rangées dans le sous-répertoire linux/.
Un fichier source typique commence ainsi:
Comme on le voit, le répertoire include/ est implicite.
Son emplacement est passé au compilateur par une option.
Nous devons donc imiter cela pour permettre la construction d'hyperlien
sous les directives #include
.
C'est possible par le recours à un paramètre 'incprefix'
dans lxr.conf:
Les parties spécifiques d'une architecture sont rangées dans le répertoire arch/
dans leurs propres sous-répertoires (alpha/, arm/,
powerpc/, x86/, …).
Mais, ces parties ne sont pas directement incluses par le code
indépendant de l'architecture.
Au lieu de cela, la directive est écrite #include <asm/...>
comme dans l'exemple suivant:
Le répertoire abstrait asm/ est associé à un répertoire
d'architecture réel par le système de gestion de configuration
à travers la spécification d'une option au compilateur.
Tous les répertoires d'architecture contiennent un sous-répertoire include/asm/
où toutes les définitions .h sont stockées.
Si nous sommes intéressés par l'architecture arm,
nous pouvons compléter 'incprefix'
de ci-dessus par:
Et si nous voulons comparer avec la version x86? Reconfigurer lxr.conf pour une lecture de deux minutes n'est pas particulièrement enthousiasmant.
Par bonheur, nous pouvons utiliser une fonctionnalité très pratique de LXR:
'maps'
avec substitution de variable.
D'abord, nous créons une variable dont la valeur sera l'architecture cible
(ou plutôt, le nom du sous-répertoire pour l'architecture).
Appelons-la 'a'
pour architecture:
'range'
doit être tapé à la main.
Nous risquons d'omettre une architecture ou de taper le nom d'une inconnue.
Plus loin, une astuce est donnée pour en recueillir automatiquement la liste à jour.
Quand LXR est lancé, cette variable est affichée dans l'en-tête de la page. Sélectionnez l'architecture cible et cliquez sur le bouton Change pour modifier la variable.
Ensuite, la règle 'incprefix'
d'architecture doit être réécrite
pour faire référence à une architecture virtuelle:
Enfin, une règle de réécriture de chemin est appliquée juste avant le test d'existence du fichier avec la valeur de la variable en paramètre:
Les paramètres de configuration précédents sont suffisants pour les architectures informatiques "classiques", mais, de façon évidente, ne répondent pas à toutes les exigences des architectures embarquées, comme arm. Celles-ci offrent des variantes dans les processeurs, cartes, circuits périphériques, … qui présentent de véritables défis pour la configuration de LXR.
Prenons le cas arm comme exemple. L'implémentation Linux-arm doit prendre en compte les variantes machine et plateforme. Deux nouvelles variables sont alors créées:
'when'
est une fonctionnalité 1.0 évitant l'affichage
d'une variable en dehors d'un contexte défini.
Ici, les variables n'apparaissent à l'écran que
lorsque la variable 'a'
est égale à arm
.
Les fichiers spécifiques de machine sont référencés par
#include <mach/…>
et ils sont logés dans le répertoire arch/arm/mach-xxx/include/mach/
où xxx est l'une des valeurs définies dans
'range'
de 'arm_mach'
(respectivement 'arm_plat'
pour les fichiers spécifiques de plateforme).
En laissant de côté la question de 'incprefix'
pour l'instant,
les règles suivantes devraient faire l'affaire:
ÇA NE MARCHE PAS!
'maps'
est cumulatif:
après application de la première règle,
%=LEVEL2=%
a été remplacé et, par conséquent,
la deuxième règle n'est plus reconnue
puisque %=LEVEL2=%
a disparu.
Ceci implique que nous devons forcer deux chemins d'inclusion différents. La configuration correcte est
#include
ne reçoivent pas d'hyperlien,
vérifiez si les variables 'arm_mach'
et 'arm_plat'
décrivent bien une configuration existante.
Des règles semblables peuvent être conçues pour les autres architectures.
À partir de la version 1.0, LXR est fourni avec un script qui recueille les noms des architectures et de leurs variantes. Lancez depuis le répertoire racine de LXR:
Les options possibles sont --help
, --verbose
,
--erase
et --suffix=
s.
Le résultat du script est un ensemble de fichiers *_list.txt dans le répertoire custom.d/ adaptés à une lecture automatique dans la configuration principale.
Les paramètres suivants sont recommandés pour la navigation dans le noyau Linux:
readfile
.
L'assistant de configuration le fait à partir de la version 2.0.3.
Ceci peut être automatiquement généré par le script de configuration initiale:
Utilisez l'option --add
si vous avez déjà configuré LXR pour un autre arbre.
Si vous voulez vous servir de LXR seulement sur le source du noyau,
la procédure complète de configuration est effectuée par:
Si vous avez donné un --suffix=
s au script
kernel-grab-vars.sh,
vous devez d'abord remplacer manuellement le suffixe par défaut par votre suffixe personnalisé
dans ce fichier.
N'oubliez pas d'exécuter le script initdb.sh pour créer la base de données associée:
Copiez le fichier de configuration où LXR s'attend à le trouver:
Tout est prêt pour genxref.