Autotools:包括预建的第三方库

时间:2011-12-15 20:19:26

标签: c++ autotools oci

我目前正在努力升级一组c ++二进制文件,每个二进制文件都使用自己的一组Makefile,使其更加基于Autotools。但是,我无法弄清楚如何将第三方库(例如Oracle Instant Client)纳入构建/打包过程。

我错过了这件事真的很简单吗?

修改以添加更多详细信息

我当前的构建环境如下所示:

/src
    /lib
        /libfoo
            ... source and header files
            Makefile
        /oci #Oracle Instant Client
            ... header and shared libraries
            Makefile
    /bin
        /bar
            ... source and header files
            Makefile
    Makefile
/build
    /bin
    /lib

build.sh

今天,顶级build.sh执行以下步骤:

  1. 运行每个lib的Makefile并将输出复制到/ build / lib
  2. 运行每个二进制文件的Makefile并将输出复制到/ build / bin
  3. 每个Makefile都有一组指向各种兄弟目录的硬编码路径。毋庸置疑,这已成为维持的噩梦。我已经开始测试自动工具了,但我遇到的问题就是找出相当于将/src/lib/oci/*.so复制到/ build / lib以便编译链接和捆绑到分发中。

2 个答案:

答案 0 :(得分:2)

我想出了如何实现这一目标。

首先,我切换到非递归制作。

接下来,我根据此页http://www.openismus.com/documents/linux/using_libraries/using_libraries

对configure.am进行了以下更改
AC_ARG_WITH([oci-include-path],
    [AS_HELP_STRING([--with-oci-include-path],
        [location of the oci headers, defaults to lib/oci])],
    [OCI_CFLAGS="-$withval"],
    [OCI_CFLAGS="-Ilib/oci"])
AC_SUBST([OCI_CFLAGS])
AC_ARG_WITH([oci-lib-path],
    [AS_HELP_STRING([--with-oci-lib-path],
        [location of the oci libraries, defaults to lib/oci])],
    [OCI_LIBS="-L$withval -lclntsh -lnnz11"],
    [OCI_LIBS='-L./lib/oci -lclntsh -lnnz11'])
AC_SUBST([OCI_LIBS])

在Makefile.am中,然后使用以下行(假设名为foo的二进制文件)

foo_CPPFLAGS = $(OCI_CFLAGS)
foo_LDADD = libnavycommon.la $(OCI_LIBS)

ocidir = $(libdir)
oci_DATA = lib/oci/libclntsh.so.11.1 \
    lib/oci/libnnz11.so \
    lib/oci/libocci.so.11.1 \
    lib/oci/libociicus.so \
    lib/oci/libocijdbc11.so

答案 1 :(得分:0)

autotools不是包管理系统,并且试图将这种类型的功能放入其中是一个坏主意。您可以简单地让配置脚本检查其存在,并在所需的库不可用时中止,而不是将第三方库合并到您的发行版中。用户有责任满足依赖性。然后,您可以发布一个二进制包,允许用户使用包管理系统来简化依赖性解析。