我在Autotools build-System上具有可执行的项目prog
。此程序链接针对libfoo
,这也是一个Autotools项目。
我想为我的用户(希望编译prog
)在链接到以前安装的libfoo
或配置,编译(静态链接)和链接到libfoo
源树(链接)之间的自由(在third-party
目录中)
libfoo
如果很重要,请使用libtool和pkg-config ...
理想情况下,这将通过一些AutoConf参数来完成:
./configure --with-local-libfoo
vs
./configure --with-system-libfoo
问题是如何告诉构建系统在prog
之前编译libfoo
(在第二种情况下)以及如何提供正确的链接标志?
由于libfoo也是一个自动工具项目,其副本是在主项目中分发的,因此将其设置为子项目是很自然的。密钥AutoConf宏此处是AC_CONFIG_SUBDIRS
。因此,如果libfoo软件包在包含顶级configure
脚本的目录的子目录libfoo/
中,则顶级configure.ac
将使用
AC_CONFIG_SUBDIRS([libfoo])
在这种情况下,顶级配置脚本将自动运行libfoo的配置脚本,将其传递给所有相同的选项(包括仅对libfoo有意义的所有选项)。此外,顶级脚本的--help
选项将同时打印其自己和libfoo
的选项。您可以在--with-*
参数(但是只有一个,不要使用两个不同的参数)上。
在汽车侧,查看自动制度条件和有条件的子目录。您可以使用条件性,其中包括由--with-system-libfoo
或其他任何条件控制的条件,以选择正确的链接选项集,并确定make
是否会重复出现在Libfoo软件包中。当您构建自己的libfoo副本时,在主程序的链接标志中包括-static-libtool-libs
选项可能会有所帮助。
最后一个位围绕着防止本地libfoo构建时,将其安装在系统侧面的系统上。我没有想出一个不涉及调整Libfoo的构建系统的好解决方案。请切换libfoo.la
作为便利库(在noinst_LTLIBRARIES
而不是在lib_LTLIBRARIES
或类似的情况下命名),实际上通常在Libfoo Subpakage中将构建目标从安装的构建目标切换到noinst_
。