Autotools:可选择编译和链接第三方库

时间:2017-12-08 16:27:36

标签: autotools autoconf automake libtool build-system

我在autotools build-system上有一个可执行项目string。该程序链接prog,这也是一个autotools项目。

我想让我的用户(希望编译libfoo)自由选择链接以前安装的prog,还是配置,编译(静态链接)并链接到{ {1}}源包(在libfoo目录中)

中提供的源代码树 如果重要的话,

libfoo会使用libtoolpkg-config

理想情况下,这可以通过一些autoconf参数来完成:

third-party

VS

libfoo

问题是如何告诉构建系统在./configure --with-local-libfoo 之前编译./configure --with-system-libfoo (在第二种情况下)以及如何提供正确的链接标记?

1 个答案:

答案 0 :(得分:1)

由于libfoo也是一个Autotools项目,其副本分布在主项目中,因此将其设置为子项目是很自然的。这里的关键Autoconf宏是AC_CONFIG_SUBDIRS。因此,如果libfoo包位于包含顶级libfoo/脚本的目录的子目录configure中,则顶级configure.ac将使用

AC_CONFIG_SUBDIRS([libfoo])

在这种情况下,顶级配置脚本将自动运行libfoo的configure脚本,并将其收到的所有相同选项(包括仅对libfoo有意义的任何选项)传递给它。此外,顶级脚本的--help选项将打印自己的libfoo选项。你可以在--with-*参数上设置条件(但只有一个,不要使用两个不同的参数)。

在Automake一侧,查看Automake conditionalsconditional subdirectories。您可以使用条件,条件由--with-system-libfoo或其他任何内容控制,以选择正确的链接选项集,并确定make是否将递归到libfoo包中。当您构建自己的libfoo副本时,在主程序的链接标记中包含-static-libtool-libs选项可能会有所帮助。

最后一点围绕防止本地libfoo构建时,从主程序旁边的系统上安装。我没有想出一个不涉及调整libfoo构建系统的好解决方案。切换libfoo.la是一个便利库(在noinst_LTLIBRARIES而不是lib_LTLIBRARIES中命名),实际上通常会将libfoo子包中的构建目标从已安装的目标切换到{{1} }那些。