====== 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 //