构建嵌套的Autotools软件包而无需安装

3
我希望能够将我的autotools包与一个嵌套的autotools包一起构建。这是一个静态库,通常情况下,如果您输入"make && make install",此包会在您的$prefix/lib文件夹中安装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的情况下构建呢?


看起来你想要做的完全颠覆了库的目的,也不是受到良好支持的工作流程。如果你想使用其他包作为便利库,请将其源代码提取出来并在自己的包中使用。或者让用户将其他包安装到临时位置,并构建静态链接可执行文件。但是,真正更好的选择是让用户安装依赖项。 - William Pursell
1
为什么?如果库已经作为automake包发货,为什么不使用它,当automake已经有包含子包的设施?我想让用户的安装变得简单。所以我不希望他们自己安装依赖项。我不想在系统中安装此库,因为用户不需要它。这是一个静态库,只需要用于此构建!如果用户决定在自己的项目中更频繁地使用此库;此时安装库是有意义的,但不仅仅是为了一个构建! - Sebi2020
由于Autotools不是一个软件包管理系统,因此不应将其用作此类功能。如果您的目标是为用户提供简单的安装过程,则应该给他们一个rpm、deb或pkg文件,或者任何您喜欢的软件包格式。 - William Pursell
不是一个包管理工具,但具有依赖跟踪和包含子包的能力... 然而,我从未谈论过包管理,并且包含在程序中的库并不意味着要使用 autotools 作为包管理器... 我不知道你是怎么想到这个想法的... - Sebi2020
“我想让用户的安装尽可能简单”这句话意味着“软件包管理系统”。 - William Pursell
显示剩余2条评论
3个回答

2
那么如何才能使我的软件包建立并安装,但子/嵌套软件包仅建立,而不修改子软件包的configure.ac或Makefile.am呢?您最好的选择可能是在顶层configure.ac中使用AC_CONFIG_SUBDIRS将子软件包的配置与顶层软件包链接起来,但避免在顶层Makefile.am中使用SUBDIRS来触发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 的依赖,并在顶层使用适当的链接选项。


1

我不确定这是否过于"hackish",但给SUBDIRS变量赋一个特定目标的值似乎可以起作用并相对优雅:

SUBDIRS = src

install installdirs: SUBDIRS =

或者,更普遍地说
SUBDIRS := foo bar libgazonk

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

(需要进行简单的扩展以避免无限递归。)

1
使用 AC_CONFIG_SUBDIRS([testlib])。有关代码示例,请在文档中了解更多。 编辑 如果您想构建方便的库而不触及子包(例如,如果您将其存储为主Git存储库中的Git子模块),则可以:
  • 将子包的configure.ac中相关的检查复制到您的包的configure.ac
  • 让您的包的configure.ac包括AC_OUTPUT([subpackage/Makefile])
  • Makefile.am中的SUBDIRS中省略subpackage
  • 让您的包的Makefile.am按您想要的方式构建子包的相关部分,例如:

    noinst_LIBRARIES = subpackage/libsubpackage.a
    subpackage_libsubpackage_a_SOURCES = subpackage/source.c 等等。
    
这可能不是您想要的,因为它涉及复制许多子软件包的构建系统,但它确实允许您将子软件包不变地放入您的软件包中。

你误解了我的问题。我不是在问如何包含子包。我是在问如何在不安装它的情况下包含它。如果您使用AC_CONFIG_SUBDIRS,它也会在运行make install时安装嵌套包,如果您在上层包中运行。 - Sebi2020
1
我不明白你如何满足不修改子包的 configure.acMakefile.am 的要求。 - ptomato
嗯,所以我必须修改子包configure.ac和/或Makefile.am。我知道的唯一方法是用noinst_lib_LIBRARIES替换lib_LIBRARIES定义(如果这也适用于库)。但这必须在每个子目录中完成...我希望AC / AM有某种方法可以通过子包实现这一点...嗯...“不要碰一个正常运行的系统”... - Sebi2020
最好不要触碰正在运行的系统,但这意味着需要用户单独安装依赖项或使用AC_CONFIG_SUBDIRS!我还有另一个建议,我会在答案中添加。 - ptomato
由于操作者的需求不明确,因此它们是两个不同的建议。 - ptomato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接