构建嵌套的Autotools包而不安装

时间:2014-07-31 17:28:46

标签: c linux gcc autotools autoconf

我想要的是使用嵌套的autotools包构建我的autotools包。它是一个静态库,如果您输入$prefix/lib

,通常此软件包会在您的make && make install文件夹中安装lib

子包档案

configure.ac

AC_INIT([testlib],[1.0],[bugs@anonym.net])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_PROG_CC()
AC_PROG_RANLIB()
AC_CHECK_HEADERS()
AC_LANG([C])
AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT

Makefile.am

SUBDIRS = src

的src / Makefile.am

lib_LIBRARIES = libtestlib.a
libtestlib_a_SOURCES = testlib.c
include_HEADERS = testlib.h

但是我想在我的autotools包中将它用作嵌套包,并且只需要在构建时间时进行链接。

那么我如何实现我的软件包是build&安装,但子/嵌套包只是构建而不修改 configure.ac或子包中的Makefile.am?

3 个答案:

答案 0 :(得分:1)

使用AC_CONFIG_SUBDIRS([testlib])。有关代码示例,请在the documentation中详细了解它。

修改

如果您想在不触及子包的情况下构建便捷库(例如,如果您将其存储为主Git存储库中的Git子模块),那么您可以:

  • 将相关支票从子包装configure.ac复制到您的包裹configure.ac
  • 让您的包configure.ac包括AC_OUTPUT([subpackage/Makefile])
  • subpackage
  • SUBDIRS退出Makefile.am
  • 让您的软件包Makefile.am按照您希望的方式构建子包的相关部分,例如

    noinst_LIBRARIES = subpackage/libsubpackage.a
    subpackage_libsubpackage_a_SOURCES = subpackage/source.c etc.
    

这可能不是您想要的,因为它涉及复制大量子包的构建系统,但它确实允许您将子包丢弃到包中。

答案 1 :(得分:1)

我不确定这是不是太过于hackish,但是给SUBDIRS变量一个特定于目标的值似乎工作并且看起来相对优雅:

SUBDIRS = src

install installdirs: SUBDIRS =

或更常见的

SUBDIRS := foo bar libgazonk

install installdirs: SUBDIRS := $(filter-out libgazonk, $(SUBDIRS))

(避免无限递归所需的简单扩展。)

答案 2 :(得分:1)

  

那么我如何实现我的软件包已构建并安装,但   /嵌套包仅在无需修改的情况下构建即可。   子软件包中的Makefile.am?

您最好的选择是在顶层AC_CONFIG_SUBDIRS中使用configure.ac将子软件包的 configuration 与顶层软件包链接,但避免使用{顶级SUBDIRS中的{1}}触发Makefile.am递归到子包中。代替后者,将手动规则添加到顶层make中,以通过递归Makefile.am构建所需的库。

在顶级程序包中,看起来像这样:

configure.ac

make

Makefile.am

# ...
AC_CONFIG_SUBDIRS([testlib-1.0])
# ...

然后,请确保在需要的地方表达对# ... testlib-1.0 *not* present in SUBDIRS ... testlib-1.0/src/libtestlib.a: $(MAKE) -C testlib-1.0 的适当依赖,并在顶层使用适当的链接选项。