我在autotools build-system上有一个可执行项目string
。该程序链接prog
,这也是一个autotools项目。
我想让我的用户(希望编译libfoo
)自由选择链接以前安装的prog
,还是配置,编译(静态链接)并链接到{ {1}}源包(在libfoo
目录中)
libfoo
会使用libtool和pkg-config
理想情况下,这可以通过一些autoconf参数来完成:
third-party
VS
libfoo
问题是如何告诉构建系统在./configure --with-local-libfoo
之前编译./configure --with-system-libfoo
(在第二种情况下)以及如何提供正确的链接标记?
答案 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 conditionals和conditional subdirectories。您可以使用条件,条件由--with-system-libfoo
或其他任何内容控制,以选择正确的链接选项集,并确定make
是否将递归到libfoo包中。当您构建自己的libfoo副本时,在主程序的链接标记中包含-static-libtool-libs
选项可能会有所帮助。
最后一点围绕防止本地libfoo构建时,从主程序旁边的系统上安装。我没有想出一个不涉及调整libfoo构建系统的好解决方案。切换libfoo.la
是一个便利库(在noinst_LTLIBRARIES
而不是lib_LTLIBRARIES
中命名),实际上通常会将libfoo子包中的构建目标从已安装的目标切换到{{1} }那些。