====== Qu'est-ce que c'est ? ======
Les GNU Autotools, appelé également le GNU build system, est un ensemble de logiciels permettant la construction d'un //package// qui se compile aisément et peut théoriquement s'adapter à toutes les plateformes UNIX. La compilation d'un paquet utilisant les Autotools se fait en 3 étapes :
* ./configure : Crée un Makefile adapté au système hôte.
* make : Compilation du paquet.
* make install (doit souvent être lancé en root afin d'avoir les permissions nécessaires à la création des fichiers) : Installe les fichiers binaires dans /usr/local/bin et les médias (images, sons etc...) dans /usr/share.
Cepandant la mise en place d'un tel paquet est très longue et très fastidieuse, c'est pourquoi je vous le déconseille pour les plus petits projets, ou un [[:makefile|Makefile]] suffit (si vous avez peu de dépendances notamment).
====== Comment on fait ? ======
Vous avez à votre disposition différents outils pour ça : //automake//, //autoconf//, //aclocal//, //autoheader//. Cependant il existe un outil qui les réunit tous : **autoreconf**.
===== Les fichiers créés par les Autotools =====
Dans un paquet vous devez avoir les fichiers suivants :
* Le script configure.
* Un makefile.in, le Makefile que l'on veut obtenir, il servira au script configure pour la génération des Makefiles.
* Un fichier config.in qui contient tous les defines relatifs au projet (version, est-ce que telle lib est présente, etc...).
===== Création d'un paquet simple =====
* Créez un sous-dossier src, dans lequel vous mettez un fichier-source quelconque (un simple hello world suffit).
* Créez les fichier : INSTALL, NEWS, README, COPYING, AUTHORS, ChangeLog.
Voila, la base de votre paquet est prêt. Maintenant, il faut créer deux fichiers qui permettront aux autotools de générer le script configure :
* configure.ac : Ce fichier sert à générer Makefile.in & configure. Il contient des simples macros du type :
AC_INITAC_PROG_CC etc...
* Makefile.am : Ce fichier sert à générer Makefile.in, il définit juste la liste des fichiers-sources, la cible, etc...
==== Création de notre configure.ac ====
Un configure.ac basique ressemble à ça :
AC_INIT([exemple],[1.0],[bug-report@adress.com])
AM_INIT_AUTOMAKE([-Wall foreign])
AC_PROG_CCAM_CONFIG_HEADER(config.h)
AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT
Les crochets symbolisent les guillemets.
* La première macro initialise Autoconf avec le nom du paquet, la version, l'adresse de report de bug.
* La seconde, AUTOMAKE : -Wall est une option de compilation, et foreign demande à Automake de ne pas se préoccuper d'éventuels fichiers manquants (par exemple : NEWS)
* AC_PROG_CC : Ajout de la vérification de la présence d'un compilateur C, dans le script configure
* AM_CONFIG_HEADER (macro pour automake) : Indique le header de configuration : config.h
* AC_CONFIG_FILES : Liste des Makefile à générer par configure : on a en a deux, un à la racine et un dans le sous dossier src/
* AC_OUTPUT : Macro de fin.
==== Création des deux Makefile.am ====
Le premier Makefile.am doit indiquer de lancer make dans src/ ( make -C src/) ce qui se fait par la variable :
SUBDIRS = src
Et celui dans src/ doit indiquer le binaire à créer, les sources à compiler :
bin_PROGRAMS = hello
Indique que hello est de type //bin//, en gros hello ira dans le dossier /usr/local/bin après installation, on peut très bien remplacer par :
lib_PROGRAMS = hello.so
Et là hello.so ira dans /usr/local/lib après installation Ensuite on indique les sources à compiler :
hello_SOURCES = hello.c
Et voilà :-)
Votre paquet doit ressembler à ça :
.:
AUTHORS ChangeLog configure.ac NEWS COPYING INSTALL Makefile.am README
src
./src:
hello main.c Makefile.am
On lance autoreconf -i (-i sert à installer les fichiers manquants) :
$ autoreconf -i
automake: configure.ac: installing `./install-sh'
automake: configure.ac: installing `./mkinstalldirs'
automake: configure.ac: installing `./missing'
automake: configure.ac: installing `./config.guess'
automake: configure.ac: installing `./config.sub'
Ensuite on le test en compilant :
./configure
make
sudo make install
Et voilà votre premier paquet :-)
====== Et maintenant ? ======
// To be continued //