Skip to content

Les autotools #4 - Libtool

Nous avons vu précédemment que « autotools » est un terme générique utilisé pour désigner l'ensemble des outils de build du projet GNU, le « GNU build system ».

Dans ce billet, nous allons faire un focus sur l'outil libtool, qui est un outil permettant de produire des librairies de manière portable et de gérer correctement l'édition des liens quelque-soit la plateforme cible.

Cet outil aide à la création de bibliothèques statiques et dynamiques en proposant une interface totalement abstraite par rapport à la plate-forme visée, masquant ainsi les différences de comportement et d'implémentation (Linux, BSD, Solaris, AIX, ...). Cet outil s'interface avec « automake ».

Exemple minimal complet

L'usage de « libtool » est en fait totalement transparent, ce qui donne un petit côté « magiciel » à tout ça. La seule contrainte étant de l'initialiser dans le fichier « configure.ac » à l'aide de la macro « LT_INIT ». Tout le reste se passera dans les fichier « Makefile.am » en déclanrant les librairies à l'aide de la variable « lib_LTLIBRARIES ». Pour le reste, tout sera automatique ... Magique !

Plutôt de longs discours, je vais donner un exemple permettant de construire un projet « myproject » fournissant :

  • Une bibliothèque « mylibrary ».
  • Un programme « myprogram » qui sera lié à la bibliothèque « mylibrary ».
  • Une suite de tests unitaires « testsuite ».

Arborescence

myproject
  |
  |`-> configure.ac
  |`-> Makefile.am
  |`-> AUTHORS
  |`-> COPYING
  |`-> NEWS
  |`-> README
  |`-> ChangeLog
  |
  |`-> mylibrary
  |      |
  |      |`-> Makefile.am
  |      |`-> mylibrary.pc.in
  |      |`-> sources/headers
  |      `--> ...
  |
  |`-> myprogram
  |      |
  |      |`-> Makefile.am
  |      |`-> sources/headers
  |      `--> ...
  |
  `--> testsuite
         |
         |`-> Makefile.am
         |`-> sources/headers
         `--> ...

Fichier configure.ac

# configure.ac
AC_INIT([myproject], [1.0.0], [nobody@nohost.nodomain])
AM_INIT_AUTOMAKE
LT_INIT
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
	Makefile
	mylibrary/Makefile
	mylibrary/mylibrary.pc
	myprogram/Makefile
	testsuite/Makefile
])
AC_OUTPUT

Fichier Makefile.am

# Makefile.am
SUBDIRS = \
	mylibrary \
	myprogram \
	testsuite \
	$(NULL)

Fichier mylibrary/Makefile.am

# mylibrary/Makefile.am
lib_LTLIBRARIES = \
	libmylibrary.la \
	$(NULL)

libmylibrary_la_includedir = $(includedir)/mylibrary

libmylibrary_la_SOURCES = \
	mylibrary-priv.h \
	mylibrary.c \
	$(NULL)

libmylibrary_la_include_HEADERS = \
	mylibrary.h \
	$(NULL)

libmylibrary_la_CPPFLAGS = \
	-I$(top_srcdir) \
	$(NULL)

libmylibrary_la_LDFLAGS = \
	-L$(top_builddir) \
	-version-info 0:0:0 \
	$(NULL)

libmylibrary_la_LIBADD = \
	-lX11 -lXext \
	$(NULL)

pkgconfigdir = $(libdir)/pkgconfig

pkgconfig_DATA = \
	mylibrary.pc \
	$(NULL)

EXTRA_DIST = \
	mylibrary.pc.in \
	$(NULL)

Fichier mylibrary/mylibrary.pc.in

# mylibrary/mylibrary.pc.in
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@

Name: mylibrary
Description: my super useful library
Version: @PACKAGE_VERSION@
Requires:
Cflags: -I${includedir}
Libs: -L${libdir} -lmylibrary

Fichier myprogram/Makefile.am

# myprogram/Makefile.am
bin_PROGRAMS = \
	myprogram \
	$(NULL)

myprogram_SOURCES = \
	myprogram.c \
	myprogram.h \
	$(NULL)

myprogram_CPPFLAGS = \
	-I$(top_srcdir) \
	$(NULL)

myprogram_LDFLAGS = \
	-L$(top_builddir) \
	$(NULL)

myprogram_LDADD = \
	$(top_builddir)/mylibrary/libmylibrary.la \
	$(NULL)

Fichier testsuite/Makefile.am

# testsuite/Makefile.am
check_SCRIPTS = \
	testsuite.sh \
	$(NULL)

check_PROGRAMS = \
	testsuite \
	$(NULL)

testsuite_SOURCES = \
	testsuite.c \
	testsuite.h \
	$(NULL)

testsuite_CPPFLAGS = \
	-I$(top_srcdir) \
	-I$(top_srcdir)/mylibrary \
	$(NULL)

testsuite_LDFLAGS = \
	-L$(top_builddir) \
	$(NULL)

testsuite_LDADD = \
	$(top_builddir)/mylibrary/libmylibrary.la \
	$(NULL)

TESTS = \
	testsuite.sh \
	$(NULL)

EXTRA_DIST = \
	testsuite.sh \
	$(NULL)

MOSTLYCLEANFILES = \
	testsuite.log \
	$(NULL)

What else ?

Finalement, l'usage de « libtool » se révèle plutôt aisé. J'ai volontairement passé plein de détails techniques, mais j'y reviendrai une prochaine fois, promis.

Une coquille, une faute ?

Vous constatez une coquille, une faute d'orthographe ou de grammaire ? Dites-le moi par mail !

Rétroliens

Pas de rétroliens

Commentaires

Afficher les commentaires en Vue non groupée | Vue groupée

Pas de commentaires

L'auteur n'a pas autorisé l'ajout de commentaires pour ce billet.

Ajouter un commentaire


Pour éviter le spam par des robits automatisés (spambots), merci d'entrer les caractères que vous voyez dans l'image ci-dessous dans le champ de fomulaire prévu à cet effet. Assurez-vous que votre navigateur gère et accepte les cookies, sinon votre commentaire ne pourra pas être enregistré.
CAPTCHA

Form options

Les commentaires postés doivent être approuvés avant d'être affichés dans le blog.