Autotools:可选择针对第三方库进行编译和 link

Autotools: Optionally compile and link against a third-party library

我在 autotools 构建系统上有一个可执行项目 prog。这个程序 links 反对 libfoo 这也是一个 autotools 项目。

我想给我的用户(希望编译 prog)自由选择 link 与以前安装的 libfoo 或配置、编译(静态linkage) 和 link 到 libfoo 源代码树,它在包中(在 third-party 目录中)

libfoo 如果重要的话使用 libtool and pkg-config...

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

./configure --with-local-libfoo

./configure --with-system-libfoo

问题是如何告诉构建系统在 prog 之前编译 libfoo(在第二种情况下)以及如何提供正确的 link 标志?

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

AC_CONFIG_SUBDIRS([libfoo])

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

在 Automake 方面,查看 Automake conditionals and conditional subdirectories。您可以使用条件,条件由 --with-system-libfoo 或其他任何东西控制,select 正确的 link 选项集,并确定 make 是否会递归到 libfoo 包中.当您构建自己的 libfoo 副本时,在主程序的 link 标志中包含 -static-libtool-libs 选项可能会有所帮助。

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