Я работаю над проектом на C++, где хочу реализовать возможность добавления плагинов. Процесс компиляции обрабатывается Autotools. Мне удалось правильно настроить файловую структуру, и как основной проект, так и плагины скомпилированы, но по какой-то причине плагины опущены при запуске make install
. При компиляции и установке плагинов по отдельности он отлично работает. Я что-то упустил, или почему плагины не установлены из верхней папки?Libtool не устанавливает подпроекты
configure.ac
AC_PREREQ(2.58)
AC_INIT([Net Responsibility],[3.1r323],[[email protected]])
AC_SUBST([LIBTOOL_DEPS])
AC_CONFIG_AUX_DIR([.])
AC_CONFIG_SRCDIR([src/main.cpp])
AC_CONFIG_SUBDIRS([plugins/defaultReport])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([scripts/m4])
AC_CANONICAL_SYSTEM
AC_LANG([C++])
AC_PREFIX_PROGRAM([make])
AM_INIT_AUTOMAKE([subdir-objects])
LT_PREREQ([2.2])
LT_INIT([shared])
# Checks for programs.
AC_PROG_CXX
AC_PROG_INSTALL
# Checks for header files.
AC_HEADER_STDC
...
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
Makefile.am
# Main library
lib_LTLIBRARIES = libNetResponsibility.la
libNetResponsibility_la_SOURCES = \
@[email protected]/src/MainApplication.cpp\
...
libNetResponsibility_la_CPPFLAGS = $(cppFlags)
libNetResponsibility_la_LDFLAGS = -no-undefined $(ldFlags)
# Minimal executable
bin_PROGRAMS = net-responsibility
net_responsibility_SOURCES = @[email protected]/src/main.cpp
net_responsibility_LDADD = -lNetResponsibility
dist_pkgdata_DATA = \
$(top_srcdir)/data/txt.xml\
$(top_srcdir)/COPYING
dist_pkgdata_SCRIPTS = $(top_srcdir)/scripts/init.d
dist_noinst_SCRIPTS = $(top_srcdir)/scripts/postinst\
$(top_srcdir)/scripts/prerm
AM_LDFLAGS = -L/usr/local/lib -L/usr/lib
ACLOCAL_AMFLAGS = -I scripts/m4
incDirs = -I$(top_srcdir)/include
ldFlags = -L/usr/local/lib -L/usr/lib
cppFlags = $(incDirs)\
-DPKGDATADIR='$(pkgdatadir)'\
-DPKGLIBDIR='$(pkglibdir)'\
-DDATABASEDIR='$(databasedir)'\
-DPIDDIR='$(piddir)'\
@[email protected]
AM_CXXFLAGS = $(incDirs) @[email protected]
AM_CPPFLAGS = $(cppFlags)
EXTRA_DIST = $(top_srcdir)/lib $(top_srcdir)/include
SUBDIRS = . plugins/defaultReport
install: install-am postinst
uninstall: prerm uninstall-am postrm
postinst:
$(top_srcdir)/scripts/postinst $(pkgdatadir) $(initdir)
prerm:
$(top_srcdir)/scripts/prerm $(pkgdatadir) $(initdir)
postrm:
rm -f $(piddir)/net-responsibility.pid
rm -f $(pkgdatadir)/blacklist.xml
rm -f $(pkgdatadir)/config.xml
rm -rf $(pkgdatadir)/reports
rm -f $(databasedir)/net-responsibility.db
rm -f $(initdir)/net-responsibility
.PHONY: prerm postinst postrm
плагинов/defaultReport/configure.ac
AC_PREREQ(2.58)
AC_INIT([Net Responsibility Plugin: Default Report],[0.1],[[email protected]])
AC_SUBST([LIBTOOL_DEPS])
AC_SUBST([nrlibdir], ["${libdir}/net-responsibility"])
AC_CONFIG_AUX_DIR([.])
AC_CONFIG_SRCDIR([src/Report.cpp])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])
AC_LANG([C++])
AC_PREFIX_PROGRAM([make])
AM_INIT_AUTOMAKE([subdir-objects])
LT_PREREQ([2.2])
LT_INIT([shared])
# Checks for programs.
AC_PROG_CXX
AC_PROG_INSTALL
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
плагины/defaultReport/Makefile.am
# General settings
ACLOCAL_AMFLAGS = -I m4
ldFlags = -L/usr/local/lib -L/usr/lib
AM_CXXFLAGS = @[email protected]
# Module specific settings
nrlib_LTLIBRARIES = defaultReport.la
defaultReport_la_SOURCES = \
src/Report.cpp
defaultReport_la_LDFLAGS = -module -no-undefined $(ldFlags)
defaultReport_la_LIBADD = -lNetResponsibility
defaultReport_la_CPPFLAGS = -I../../include @[email protected]
благодарит за ввод! Я удалил макрос AC_SUBST и назначил nrlibdir в Makefile.am. 'autoreconf' жаловался на переменную, не установленную (в пределах области). При назначении его в плагинах/defaultReport/Makefile.am он работал почти так же, как раньше. Плагины скомпилированы, как ожидалось, но они просто не будут установлены. – roggan87
Спасибо тонну! Теперь он работает как шарм. Проблема заключалась в переопределении целей 'install' и' uninstall'. Однако мне кажется, что макрос AC_SUBST не имеет отношения, поскольку он работает в любом случае. – roggan87
Я не уверен, что AC_SUBST всегда будет работать именно так, особенно на пути к autoconf 2.58, и любой соответствующий автомат может быть установлен. Я раньше не пытался настраивать каталог установки. – ldav1s