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_
个。
我在 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_
个。