Manuel du porteur : autoconf
Autoconf est un outil gnu supposé faciliter l'écriture de programmes
portables. Il est souvent utilisé avec automake (makefiles portables) et
libtool (bibliothèques partagées portables).
Ces outils ne fonctionnent pas toujours très bien et le portage d'un
logiciel sur OpenBSD peut relever de l'exploit.
Détection de l'utilisation d'autoconf dans une partie de logiciel
Un certain nombre de projets logiciel possèdent des scripts "configure"
et dans de nombreux cas, ceux-ci ont été générés par autoconf. Ces
scripts possèdent une ligne dans le haut du fichier semblable à :
# Generated automatically using autoconf version 2.13
ou quelque chose de ce genre.
La procédure de génération est abordée dans la section suivante. Le plus
souvent, les ports autoconf sont fournis avec les scripts générés, et
avec les scripts source qui les ont généré. La section suivante couvre
le cas simple dans lequel vous voulez simplement lancer le script
généré, et non le modifier.
Assurez vous d'avoir lu correctement la section sur les Chevaux de
Troie.
Lancement d'un script autoconf configure
Ce script est habituellement lancé lors de l'étape de configuration de
la compilation des ports.
Pour invoquer le script configure, un seul doit fixer
CONFIGURE_STYLE= gnu
qui invoquera automatiquement ${WRKSRC}/configure.
Si votre script configure ment à un quelconque endroit, fixez simplement
CONFIGURE_SCRIPT à la bonne valeur.
Les scripts configure prennent souvent un grand nombre d'arguments. Le
traitement par défaut de l'arbre des ports est de ne leurs passer que
--prefix et --sysconfdir.
Les scripts configure très anciens ne comprennent pas --sysconfdir; vous
pouvez fixer CONFIGURE_STYLE=gnu old dans de tels cas.
De même, certains ports ignorent DESTDIR. De tels ports accepteront
souvent le réglage
prefix=${DESTDIR}/usr/local
sans problème, qui peut être appliqué avec
CONFIGURE_STYLE=gnu dest.
Les ports utilisant autoconf et automake auront des Makefiles au format
spécifique commençant par quelques emplacements standards :
- bindir : emplacement des binaires
- sysconfdir : emplacement de la configuration
- includedir : emplacement des répertoires include
Si le script configure ne vous autorise pas à les écraser, vous devriez
cependant pouvoir le faire plus tard lors des étapes de création ou de
simulation. Ceci signifie, bien évidemment, que la seule référence à un
tel répertoire se situe au sein du Makefile.
Par exemple, une astuce élégante consiste à positionner sysconfdir à
${LOCALBASE}/share/example/pkgname lors de l'étape de simulation, afin
d'avoir les fichiers de configuration par défaut dans le paquetage
(puisque les paquetages ne stockent normalement rien dans /etc).
Les ports utilisant pleinement autoconf et automake devraient supporter
la compilation dans un répertoire différent : essayez le réglage
SEPARATE_BUILD=flavored
et regardez si cela fonctionne. Ceci devrait vous permettre de traiter
l'arbre de compilation sans traiter l'arbre des sources, en vous
fournissant des emplacements ${WRKSRC} et ${WRKBUILD} séparés. Dans
quelques cas, les compilations séparées pourraient nécessiter
l'utilisation de gmake, là ou le reste du port est heureux avec bsd-
make, auquel cas il n'est en fait pas utile.
automake génèrera quelques règles pour reconstruire tous les scripts
générés si rien ne change. Ceci est souvent le cas des patches
spécifiques à OpenBSD. Pour cette raison, tant que CONFIGURE_STYLE
correspond à l'utilisation de autoconf, un patch postérieur traitera des
fichiers variés dans un ordre spécifique, de façon à ce qu'aucune
dépendance automake ne soit délenchée par la suite.
La liste des dépendances est donné dans l'ordre de tsort(1) pour un
fichier mentionné dans REORDER_DEPENDENCIES (par défaut,
${PORTSDIR}/infrastructure/mk/automake.dep).
Les mécanismes de vérification de configure
Le script configure lance tout d'abord un script appelé config.guess,
qui déterminera quel système configure est utilisé. config.guess ne
varie pas d'un port à l'autre et est fixe, l'arbre des ports d'OpenBSD
le remplace de ce fait avec une version fixe qui est renseignée sur les
architectures OpenBSD spécifiques. Puisque la plupart des paquetages
logiciel sont fournis avec un config.guess, et puisque un bon nombre
d'entre eux sont relativement anciens, c'est une étape nécessaire. Si un
paquetage logiciel contient plus d'un config.guess, vous pouvez tous les
écraser en fixant MODGNU_CONFIG_GUESS_DIRS avec la liste complète des
répertoires à traiter.
Le script configure généré par autoconf vérifie alors simplement toutes
les fonctionnalités du système existant, en cherchant un compilateur, et
en lançant de simples programmes de test avec celui-ci. Puisque certains
de ces tests sont relativement conséquents, l'arbre des ports préfère
un configure avec un fichier CONFIG_SITE=config.site.
configure regardera le contenu de ce fichier avant de lancer les tests.
Quelques scripts configure pourraient avoir des bogues les empêchant de
fonctionner correctement en la présence de config.site. Le fait de fixer
CONFIG_SITE à une valeur vide devrait éviter ce genre de problèmes.
La plupart des configure détecteront d'eux-mêmes une bonne partie des
conditions. Il est très important de regarder les options du configure,
grâce à la sortie de configure, et du fichier de log config.log :
ceux-ci vous renseigneront sur les options trouvées, et sur celles qui
ne le sont pas. Ceci vous permettra de savoir quand configure a trouvé
un paquetage qui était installé.
Ceci vous dira aussi quels paquetages optionnels configure devrait
trouver. Dans l'arbre des ports, ceux-ci sont appelés dépendances
cachées. C'est une mauvaise chose : une dépendance cachée représente
quelques paquetages supplémentaires qui seront pris par configure lors
de l'installation. La prochaine étape devrait être la compilation d'un
paquetage mutant. Dans certains cas, la compilation échouera à cause
des particularités d'OpenBSD. Dans certains cas, la création du
paquetage échouera, car certains fichiers ont des noms différents. Dans
certains cas, le paquetage résultant sera incorrect, l'enregistrement
des dépendances du paquetage optionnel ayant échoué. Bien regarder la
sortie de configure est donc l'un des principaux devoirs des mainteneurs
de ports. Surveillez les tests en cascade : la détection d'une
fonctionnalité donnée pourrait ammener un script configure à essayer de
trouver des fonctionnalités dépendantes, vous ne verrez ainsi pas la
deuxième fonctionnalité dans la sortie de configure, sauf si la première
fonctionnalité est déclenchée.
Dans le cas ou des dépendances cachées sont trouvées, des actions
devraient être faites. L'action la plus simple est d'installer le
paquetage optionnel, et de regarder ce que configure fera. Si le
paquetage est détecté, on peut soit désactiver la détection (en
utilisant les options configure, ou les variables d'environnement, ou en
patchant le script configure), soit vérifier que la compilation se passe
bien et ajouter la dépendance à la liste des paquetages dépendants. Un
meilleur choix est de mettre au point une liste raisonnable de
paquetages par défaut, et d'ajouter des saveurs afin de couvrir d'autres
fonctionnalités communes.
Re-géneration des scripts configure
Les scripts configure sont normalement générés grâce à un fichier
configure.in (les versions récentes d'autoconf utilisent plutôt un
fichier configure.ac). Une bibliothèque standard de définitions est souvent
disponible dans une aclocal.m4.
Dans la plupart des cas, la modification directe de configure est une
mauvaise idée. Il est préférable de patcher le fichier configure.in et
de faire en sorte que l'arbre des ports appelle autoconf. Les bons
porteurs essaieront d'écrire des changements de configure.in qu'ils
pourront fournir aux auteurs du logiciel.
Les différentes versions d'autoconf produiront des scripts configure
distincts. autoconf-2.13 est spécial : il fut utilisé pendant une longue
période, et il y eut des versions mutantes de autoconf-2.13 (de vrais
betas d'un autoconf plus récent) largement utilisées. De ce fait,
l'utilisation d'autoconf-2.13 produira souvent des scripts configure
différents.
Puisque le fait d'avoir plusieurs versions d'autoconf à disposition est
utile, le script autoconf actuellement disponible dans l'arbre des ports
est une partie du port appelé metaauto. Ce script autoconf actuellement
appelé est controllé via la variable d'environement AUTOCONF_VERSION.
L'appel d'autoconf a lieu si vous fixez CONFIGURE_STYLE=autoconf, ainsi
que AUTOCONF_VERSION. Les versions actuellement disponibles sont 2.13,
2.52, 2.54, 2.56, 2.57, 2.58, 2.59, 2.60, 2.61 et 2.62.
Ceci couvre 99% des scripts configure que vous pouvez trouver.
autoconf compte sur le préprocesseur unix standard m4(1). Normalement,
autoconf compte sur des fonctionnalités présentes dans la version GNU de
m4, gm4. Heureusement, les m4 OpenBSD ont assez de fonctionnalités pour
utiliser correctement autoconf, il faut juste l'invoquer avec -g pour
gérer autoconf. Très rarement, l'utilisation d'autoconf avec les m4
OpenBSD peut ammener à des scripts configure bogués. Les développeurs
OpenBSD corrigeront un tel problème.
Chevaux de Troie
Les scripts configure sont des fichiers générés conséquents. Ce sont des
lieux idéaux pour cacher des Chevaux de Troie, et ceci s'est bien
évidemment produit par le passé. C'est la principale raison pour
laquelle plusieurs versions d'autoconf sont disponibles dans l'arbre :
un bon porteur doit normalement vérifier qu'un script configure généré
correspond à ce que les autoconf de l'arbre des ports produisent.
Interaction avec les autres programmes
autoheader est un autre programme lié à autoconf qui est habituellement
utilisé pour créer le fichier config.h. Fixer CONFIGURE_STYLE=autoconf
lancera également autoheader. Quelques ports n'utilisent pas autoheader.
L'utilisation de CONFIGURE_STYLE=autoconf no-autoheader règlera ce
problème.
libtool possède quelques crochets dans configure.in. Il y a souvent un
script libtool.m4 qui va avec. L'obtention de libtool faisant un bon
travail va au-delà de cette documentation.
KDE utilise un niveau additionnel au dessus d'autoconf. Celui-ci
assemble un fichier configure.in depuis un jeu de fichiers configure.in,
et est également capable d'optimiser ces configure.in pour des résultats
plus rapides, et Makefile.in afin de permettre davantage d'options pour
la compilation, et pour insérer automatiquement DESTDIR aux bons
endroits.
La variable AUTOCONF peut être utilisée afin d'optimiser le script
autoconf présent, et KDE prévoit que /bin/sh ${WRKDIST}/admin/cvs.sh
marche correctement.
www@openbsd.org
$OpenBSD: autoconf.html,v 1.8 2008/12/01 07:52:54 tobias Exp $