Comment comstackr et lier des bibliothèques tierces avec automake?
Ma structure de fichier est:
program/ | +--src/ | | | +--Makefile.am | +--main.cpp | +--lib/ | | | +--Makefile.am | +--library.cpp | +--Makefile.am +--configure.ac +--README
Le contenu des fichiers automake est assez générique:
# src/Makefile.am bin_PROGRAMS = program program_SOURCES = main.cpp
# Makefile.am SUBDIRS = src lib dist_doc_DATA = README
# configure.ac AC_INIT([program], [1.0]) AM_INIT_AUTOMAKE([-Wall]) AC_PROG_CXX AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([Makefile src/Makefile lib/Makefile]) AC_OUTPUT
Quel devrait être le contenu de lib/Makefile.am
?
(Vous ne savez pas pourquoi vous avez dit “tiers” quand vous semblez contrôler vous-même le code de la bibliothèque … Pour plus d’informations sur la création et l’utilisation de bibliothèques utilisant Automake, je vous renvoie à la section du manuel GNU Automake sur les bibliothèques )
lib / Makefile.am
lib_LIBRARIES = libYOURLIB.a libYOURLIB_a_SOURCES = library.cpp
Vous pouvez utiliser noinst_lib_LIBRARIES
si vous ne souhaitez pas installer la bibliothèque elle-même. Notez que je suppose que vous voulez créer une bibliothèque statique uniquement. Reportez-vous à la section Construction d’une bibliothèque partagée du manuel GNU Automake pour l’intégration à Libtool afin de produire une bibliothèque partagée. Vous pouvez le faire manuellement, bien sûr, mais c’est beaucoup plus facile avec Libtool, car il prend en charge diverses différences de plate-forme.
Pour lier votre bibliothèque à un program
, vous appendiez les lignes suivantes dans
src / Makefile.am :
program_DEPENDENCIES = $(top_builddir)/lib/libYOURLIB.a program_LDADD = $(top_builddir)/lib/libYOURLIB.a
La ligne _DEPENDENCIES
indique simplement à Automake que le program
repose sur lib/libYOURLIB.a
construit en premier, et la ligne _LDADD
ajoute simplement la bibliothèque à la commande de l’éditeur de liens.
Ce qui précède suppose que vous avez déjà une règle pour construire la bibliothèque. Étant donné que vous utilisez SUBDIRS
, vous avez reçu un échec de génération “aucune règle pour créer la cible XXXXXX”, ce qui indique que vous n’en avez pas (du moins du sharepoint vue du fichier Makefile dans le sous-répertoire src
). Pour remédier à cela, vous pouvez essayer ce qui suit dans src / Makefile.am (tiré de “Re: library dependency” sur les archives de la liste de diffusion GNU Automake):
FORCE: $(top_builddir)/lib/libYOURLIB.a: FORCE (cd $(top_builddir)/lib && $(MAKE) $(AM_MAKEFLAGS) libYOURLIB.a)
Vous pouvez aussi simplement faire de lib
un sous-répertoire de src
comme votre commentaire l’indique bien sûr et le rendre plus simple.
Alternativement, vous pouvez cesser d’utiliser une configuration de construction récursive et utiliser ce qui est peut-être une configuration de construction non récursive plus simple. Voir le manuel de GNU Automake §7.3: Une approche alternative aux sous – répertoires et un automake non récursif pour plus d’informations à ce sujet, mais l’idée générale serait de modifier les choses pour permettre:
configure.ac
AM_INIT_AUTOMAKE([-Wall subdir-objects]) ... AC_CONFIG_FILES([Makefile])
Makefile.am
# Instead of using the SUBDIRS variable. include src/Makefile.am.inc include lib/Makefile.am.inc dist_doc_DATA = README
lib / Makefile.am renommé lib / Makefile.am.inc
# Full path relative to the top directory. lib_LIBRARIES = lib/libYOURLIB.a lib_libYOURLIB_a_SOURCES = lib/library.cpp
src / Makefile.am renommé src / Makefile.am.inc
# Full path relative to the top directory. bin_PROGRAMS = bin/program bin_program_SOURCES = src/main.cpp bin_program_DEPENDENCIES = lib/libYOURLIB.a bin_program_LDADD = lib/libYOURLIB.a
Renommer les fichiers est facultatif (vous pouvez toujours simplement include src/Makefile.am
), mais il est utile de noter qu’il ne s’agit pas d’un fichier source Automake autonome.
En outre, en supposant que lib/library.cpp
et src/main.cpp
tous les deux #include "library.hpp"
et qu’ils se src/main.cpp
dans un autre répertoire, vous pouvez également utiliser AM_CPPFLAGS = -I $(top_srcdir)/include
pour tous les fichiers ou obj_program_CPPFLAGS = -I include
pour tous les fichiers source utilisés dans la construction de bin/program
, en supposant que library.hpp
est dans program/include
. Je ne suis pas sûr que $(top_srcdir)
soit correct lorsqu’un autre projet inclut l’intégralité du répertoire source du program
dans sa propre variable SUBDIRS
, mais $(srcdir)
fera toujours référence au répertoire de program
niveau program
dans le cas d’une valeur non récursive. automake, ce qui le rend peut-être plus utile dans les grands projets incluant ce paquet en tant que composant.