Autotools pour faire ses Makefiles

Portrait de trax

Introduction

Vous avez surement installé à la main un paquet de source (sinon vous auriez dû :), avec le fameux ./configure && make && make install

Ou juste que vous en avez marre de faire vos Makefile à la main, pour un projet basique ça passe encore, mais ça atteint vite ses limites.

Autant de raisons pour adopter la suite Autotools

Préparation

Toutes sources seront mises dans un dossier src (tradition oblige)

Automake demande quelques fichiers :

  • AUTHORS
  • ChangeLog
  • NEWS
  • README

Par la suite nous utiliserons deux type de fichier : configure.ac, et Makefile.am
Le configure.ac permet de créer le script qui vérifiera la présence des différents éléments nécessaires (headers, librairies, ...). Les Makefile.am permettront de construire les Makefiles.

Les noms sont assez explicites.

Initialisation

Nous allons utiliser un petit projet comme base d'exemple
autotools

Executer autoscan
Il va parcourir vos fichiers pour créer des fichiers de configurations de base. Celui qui nous intéresse est nommé configure.scan qu'il faut renommer en configure.ac

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
 
AC_PREREQ(2.61)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([src/rs232.c])
AC_CONFIG_HEADER([config.h])
 
# Checks for programs.
AC_PROG_CC
 
# Checks for libraries.
 
# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([stdlib.h])
 
# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
 
# Checks for library functions.
AC_CHECK_FUNCS([strtol])
 
AC_CONFIG_FILES([src/Makefile])
AC_OUTPUT

Bon pour l'instant il a remarqué nous utilisions la stdlib.h pas de quoi se relever la nuit.

Configuration

Nous allons maintenant configurer tout cela pour que ça fonctionne.

Drapeaux

Il faut configurer variables de drapeaux pour la compilation et pour la liaison :

CFLAGS="-Wall -std=gnu99"
LIBS="-lm"

(Nous n'utiliserons pas la librairie math dans notre exemple)

pkg-config

PKG_CHECK_MODULES(NIX, [gtk+-2.0 libglage-2.0])

Cette ligne va créer les variables NIX_CFLAGS qui correspond aux drapeaux pour gtk et libglade (et respectivement NIX_LDFLAGS avec les drapeaux de liaison). En plus elle les exporte automatiquement vers les Makefile.

Condition

La compilation conditionnelle peut être très intéressante pour ajouter des options de compilations ou drapeaux.

Voici un petit exemple qui permet d'activer un drapeau de debug.

Par défaut mis à l'état bas, pour l'activer il faudra mettre --enable-debug lors du configure.

AC_ARG_ENABLE([debug],AS_HELP_STRING([--enable-debug],[Debug flags]),[enable_debug=$enableval],[enable_debug="no"])
 
AC_MSG_CHECKING(debug)
AC_MSG_RESULT($enable_debug)
 
if test "x$enable_debug" = "xyes"
then
	DEBUG_CFLAGS="-g -Wall -DDEBUG"
fi
AC_SUBST([DEBUG_CFLAGS])

Mais ce n'est pas tout, cette partie permet uniquement de placer dans la variable DEBUG_CFLAGS les options qui vont bien. Il faudra par la suite utiliser cette variable dans notre Makefile.am