2012-06-21 2 views
1

Я работаю над проектом на 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] 

ответ

2

Вам нужно настроить nrlibdir немного иначе:

плагинов/defaultReport/configure.ac

Удалить эту строку:

AC_SUBST([nrlibdir], ["${libdir}/net-responsibility"]) 

плагины/defaultReport/Makefile.am

Добавить эту строку перед nrlib_LTLIBRARIES:

nrlibdir=$(libdir)/net-responsibility 

Это должно помочь automake получить make install правильно.

EDIT: На этот раз я действительно попробовал. В дополнение к вышеуказанным изменениям удалите install и uninstall целей в Makefile.am. Вы должны быть крепления postinst, prerm и postrm цели на некоторые другие установки крюков, возможно, что-то вроде:

install-data-hook: 
     $(top_srcdir)/scripts/postinst $(pkgdatadir) $(initdir) 

uninstall-local: 
     $(top_srcdir)/scripts/prerm $(pkgdatadir) $(initdir) 

uninstall-hook: 
     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 

будет работать вместо этих целей.

+0

благодарит за ввод! Я удалил макрос AC_SUBST и назначил nrlibdir в Makefile.am. 'autoreconf' жаловался на переменную, не установленную (в пределах области). При назначении его в плагинах/defaultReport/Makefile.am он работал почти так же, как раньше. Плагины скомпилированы, как ожидалось, но они просто не будут установлены. – roggan87

+0

Спасибо тонну! Теперь он работает как шарм. Проблема заключалась в переопределении целей 'install' и' uninstall'. Однако мне кажется, что макрос AC_SUBST не имеет отношения, поскольку он работает в любом случае. – roggan87

+0

Я не уверен, что AC_SUBST всегда будет работать именно так, особенно на пути к autoconf 2.58, и любой соответствующий автомат может быть установлен. Я раньше не пытался настраивать каталог установки. – ldav1s

Смежные вопросы