【问题标题】:Building nested Autotools Package without Installing在不安装的情况下构建嵌套的 Autotools 包
【发布时间】:2014-09-23 18:40:27
【问题描述】:

我想要的是将我的 autotools 包与嵌套的 autotools 包一起构建。它是一个静态库,如果你输入 make && make install,通常这个包会在你的 $prefix/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 包中的嵌套包,并且只需要在构建时进行链接。

那么我如何实现我的包已构建和安装但子/嵌套包仅构建而不修改子包中的 configure.ac 或 Makefile.am?

【问题讨论】:

  • 看起来你想做的事情完全颠覆了库的目的,并且不是一个很好的工作流。如果您想使用其他包作为便利库,则将源代码从中提取并在您自己的包中使用。或者让用户在临时位置安装其他包并构建静态链接的可执行文件。但是,实际上,更好的选择是让用户安装依赖项。
  • 为什么?如果该库已经作为 automake 包提供,为什么不使用它,当 automake 已经具备包含子包的便利时?我想让用户的安装简单。所以我不希望他们自己安装依赖项。我不想在系统中安装这个库,因为用户不需要它。这是一个静态库,仅在此构建中需要!如果用户决定在自己的项目中更频繁地使用这个库;此时安装库是有意义的,但不仅仅是一个版本!
  • 因为 autotools 不是包管理系统,所以不应该这样使用。如果你的目标是让用户的安装简单,那么就给他们一个 rpm、一个 deb、一个 pkg,或者任何你喜欢的包。
  • 是的,不是包管理,而是依赖跟踪和包含子包的能力......但是我从未谈到包管理并包含作为程序一部分的库并不意味着使用 autotools 作为包管理器...我不知道您是怎么想到的...
  • 短语“我想让用户的安装简单”尖叫“包管理系统”。

标签: c linux gcc autotools autoconf


【解决方案1】:

那么我如何实现我的包是构建和安装的,但是子- / 嵌套包仅构建不修改 configure.ac 或 子包中的 Makefile.am?

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

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

configure.ac

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

Makefile.am

# ... testlib-1.0 *not* present in SUBDIRS ...

testlib-1.0/src/libtestlib.a:
    $(MAKE) -C testlib-1.0

然后,请确保在需要时表达对testlib-1.0/src/libtestlib.a 的适当依赖,并在顶层使用适当的链接选项。

【讨论】:

    【解决方案2】:

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

    SUBDIRS = src
    
    install installdirs: SUBDIRS =
    

    或者,更一般地

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

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

    【讨论】:

      【解决方案3】:

      使用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.
        

      这可能不是您想要的,因为它涉及复制大量子包的构建系统,但它确实允许您将子包原封不动地放入您的包中。

      【讨论】:

      • 你误解了我的问题。我不是在问如何包含子包。我在问如何在不安装的情况下包含它。如果你使用 AC_CONFIG_SUBDIRS,它也会安装嵌套包,如果你在上层包运行 make install。
      • 我不明白您将如何与不修改子包的configure.acMakefile.am 的要求相协调。
      • 嗯,所以我必须修改子包configure.ac 和/或Makefile.am。我知道的唯一方法是用noinst_lib_LIBRARIES 替换lib_LIBRARIES 定义(如果库也可以这样做)。但这必须在每个子目录中完成...我希望 AC / AM 有一些方法可以通过子包实现这一点... mm... 不要触摸正在运行的系统...
      • 确实,最好不要触摸正在运行的系统,但这意味着需要用户单独安装依赖项,否则使用AC_CONFIG_SUBDIRS!我还有另一个建议,我会添加到答案中。
      • 他们是两个不同的建议,因为操作人员的需求不明确。
      猜你喜欢
      • 2011-10-29
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      • 2012-03-19
      • 2018-12-07
      • 2011-04-25
      相关资源
      最近更新 更多