Retrouvez cet article dans : Linux Magazine 81
Nos exemples
Comme le mois dernier, nous allons partir sur deux projets. Le premier est une bibliothèque, libmytoolkit, dans laquelle vous pourrez trouver une fonctionlibmytoolkit
Nous commençons par la bibliothèque#include <stdlib.h>
#include <stdio.h>
#include <glib.h>
int afficher(char*msg) {
g_printf("%s\n", msg);
}
src/libmytoolkit.h
#ifndef LIBMYTOOLKIT_H #define LIBMYTOOLKIT_H int afficher(char*msg); #endifconfigure.ac
AC_PREREQ(2.59) AC_INIT(libmytoolkit, 0.1, ymettier@libertysurf.fr) AC_CONFIG_SRCDIR([src/afficher.c]) AC_CONFIG_HEADER([config.h]) AM_INIT_AUTOMAKE LIBMYTOOLKIT_AC=1 LIBMYTOOLKIT_REV=0 LIBMYTOOLKIT_ANC=0 AC_SUBST(LIBMYTOOLKIT_AC) AC_SUBST(LIBMYTOOLKIT_REV) AC_SUBST(LIBMYTOOLKIT_ANC) # Checks for programs. AC_PROG_CC AC_PROG_MAKE_SET AC_PROG_LIBTOOL # Checks for libraries. # Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([stdlib.h]) # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AM_PATH_GLIB_2_0( 2.0.0, [], [AC_MSG_FAILURE([Glib not found])]) AC_CONFIG_FILES([ Makefile src/Makefile ]) AC_OUTPUTMakefile.am
SUBDIRS=srcsrc/Makefile.am
lib_LTLIBRARIES=libmytoolkit.la
libmytoolkit_la_SOURCES=afficher.c
libmytoolkit_la_CPPFLAGS=@GLIB_CFLAGS@
libmytoolkit_la_LIBADD=@GLIB_LIBS@
libmytoolkit_la_LDFLAGS=-version-info ${LIBMYTOOLKIT_AC}:${LIBMYTOOLKIT_REV}:${LIBMYTOOLKIT_ANC}
libmytoolkit.pc
C’est ici que nous faisons connaissance avec pkg-config. Cet outil est utilisé pour obtenir des informations sur les bibliothèques installées sur le système. Ceux qui ont déjà programmé avec glib savent qu’il faut ajouter `$ pkg-config libxml-2.0 --modversion 2.6.17Ce qui nous intéresse néanmoins le plus souvent sont ce qu’indiquent ces deux options :
# Variables
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${exec_prefix}/include
# Definitions
Name: libmytoolkit
Description: Il faudrait penser à une meilleure description ici
Version: 0.1
Requires: glib-2.0 >= 2.0.0
Libs: -L${libdir} -lmytoolkit
Cflags: -I${includedir}
La syntaxe de ce fichier est très simple. Deux types de lignes cohabitent. Celles qui définissent des variables commencent par un nom de variable, sont suivies du signe =, et terminent par le contenu de la variable. Nous avons ici une syntaxe habituelle, aussi habituelle que l’utilisation des variables avec le signe $ et les accolades.
L’autre type de ligne consiste en des définitions, composées d’un mot-clé, d’un double point et d’un contenu. Les mots-clés sont indiqués dans le tableau 1 :

prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: libmytoolkit
Description: Il faudrait vraiment penser à une meilleure description ici
Version: @VERSION@
Requires: glib-2.0 >= 2.0.0
Libs: -L${libdir} -lmytoolkit
Cflags: -I${includedir}
Nous avons presque fini avec notre bibliothèque. Il ne nous reste plus d’une part qu’à demander à autoconf de générer notre fichier, ce que vous pouvez faire simplement en ajoutantpkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libmytoolkit.pcNous avons ainsi ajouté le support de pkg-config dans notre bibliothèque. Il ne vous reste plus qu’à en créer une archive avec la suite habituelle
pkg-config libmytoolkit --modversion
Essayez maintenant ce que nous avons vu plus haut pour d’autres bibliothèques :$ pkg-config --list-all | grep libmytoolkit libmytoolkit libmytoolkit - Il faudrait vraiment penser à une meilleure description ici $ pkg-config libmytoolkit --modversion 0.1 $ pkg-config libmytoolkit --cflags -I/usr/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include $ pkg-config libmytoolkit --libs -L/usr/lib -L/usr/lib -lmytoolkit -lglib-2.0 -lintl -liconvAvez-vous remarqué la présence de glib ici ? La raison en est simple : nous avons défini glib comme une dépendance. Notre outil pkg-config prend donc les mesures qui s’imposent. Si vous avez installé libmytoolkit.pc dans un répertoire autre que celui où pkg-config va chercher ses définitions, vous devez indiquer votre répertoire à l’aide de la variable
PKG_CONFIG_PATH=/tmp/libmytoolkit/lib/pkgconfig pkg-config --list-allEn dehors des tests, nous vous déconseillons de définir une variable d’environnement (
bonjour_le_mondeLe programme
#include <stdio.h>
#include <stdlib.h>
#include <libmytoolkit.h>
int main(int argc, char**argv) {
afficher(“Bonjour le monde”);
exit(EXIT_SUCCESS);
}
Ce programme nécessite notre bin_PROGRAMS=bonjour_le_monde bonjour_le_monde_SOURCES=main.c bonjour_le_monde_CPPFLAGS=@LIBMYTOOLKIT_CFLAGS@ bonjour_le_monde_LDFLAGS=@LIBMYTOOLKIT_LIBS@Ce fichier suppose que les variables autoconf
LIBMYTOOLKIT_CFLAGS=`pkg-config libmytoolkit --cflags` LIBMYTOOLKIT_LIBS=`pkg-config libmytoolkit --libs`Cependant, il existe une macro M4 qui évite un peu la redondance de ces deux lignes.
- Un identifiant qui sert de préfixe de variable. Il sert à définir les deux variables qui nous intéressent en y accolant les suffixes
_CFLAGSet_LIBS. - La liste des bibliothèques relatives à cet identifiant. Il est possible d’indiquer des contraintes de version.
- Une action à réaliser si les bibliothèques sont dispo-nibles.
- Une action à réaliser si une bibliothèque manque à l’appel.
AC_PREREQ(2.59) AC_INIT(bonjour_le_monde, 0.1, ymettier@libertysurf.fr) AC_CONFIG_SRCDIR([src/main.c]) AC_CONFIG_HEADER([config.h]) AM_INIT_AUTOMAKE # Checks for programs. AC_PROG_CC AC_PROG_MAKE_SET # Checks for libraries. PKG_CHECK_MODULES(LIBMYTOOLKIT, libmytoolkit >= 0.1, [], [AC_MSG_FAILURE([libmytoolkit not found])] ) # Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([stdlib.h]) # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_CONFIG_FILES([ Makefile src/Makefile ]) AC_OUTPUTVous lisez ici que, ayant besoin de définir les variables
Conclusion
Pkg-config est aux bibliothèques ce qu’apt-get ou urpmi sont aux logiciels. Contrairement à ces derniers, pkg-config a l’avantage d’être le seul de ce genre à être à la fois aussi avancé et aussi utilisé. Mais il souffre de quelques inconvénients majeurs. D’abord, il n’est pas installé partout. Lorsque votre système n’en dispose pas, vous devez, en tant que développeur, proposer une autre solution. En tant qu’utilisateur, si vous cherchez à compiler un logiciel y faisant appel, vous n’avez d’autre choix que de l’installer. Dans ce cas, un autre inconvénient apparaît de manière flagrante : peu, voire pas du tout, de bibliothèques y seront déclarées. Par exemple, si glib a été installé auparavant, vous ne disposez pas forcément de ses définitions pour les indiquer au pkg-config que vous venez d’installer. De manière moins flagrante, si pkg-config est installé avec le système, tel que les distributions GNU/Linux récentes, vous pouvez compter sur un grand nombre de bibliothèques définies. Cependant, elles ne le seront pas toutes, les développeurs n’ayant pas fait la démarche de les y intégrer. En tant que développeurs de bibliothèques, si vous pouvez, ajoutez un fichier de définitions pour pkg-config à vos projets. Utilisateurs de bibliothèques, considérez que pkg-config n’est pas utilisable partout, et proposez, dans la mesure du possible, une solution de secours aux pauvres dinosaures de l’informatique ! Liens :- Le manuel d’autoconf : http://www.gnu.org/manual/autoconf/index.html
- Le manuel d’automake : http://www.gnu.org/manual/automake/index.html
- Le manuel de libtool : http://www.gnu.org/software/libtool/manual/
- La page de manuel de pkg-config.
- C en action, O’Reilly, Chapitre 20.
Retrouvez cet article dans : Linux Magazine 81





Laissez une réponse
Vous devez avoir ouvert une session pour écrire un commentaire.