2012-06-21 38 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"]) 

plugins/defaultReport/Makefile.am

nrlib_LTLIBRARIES前加入这一行:

nrlibdir=$(libdir)/net-responsibility 

这应该有助于automake得到make install权。

编辑:我其实这次尝试过。除上述更改外,请删除Makefile.am中的 installuninstall目标。你应该安装在postinstprermpostrm目标,以一些其他的安装挂钩,也许是这样的:

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宏,并在Makefile.am中分配了nrlibdir。 'autoreconf'抱怨变量未设置(在范围内)。当在plugins/defaultReport/Makefile.am中分配它时,它的工作方式与之前非常相似。插件按预期进行编译,但它们不会安装。 – roggan87

+0

谢谢!现在它像一个魅力。问题是被覆盖的'install'和'uninstall'目标。然而,在我看来,像AC_SUBST宏是无关的,因为它可以工作。 – roggan87

+0

我不确定AC_SUBST会一直以这种方式工作,尤其是回到autoconf 2.58以及可能安装的任何相应的automake。我还没有尝试过设置安装目录。 – ldav1s