首页 > 解决方案 > 如何处理具有 cmake 依赖关系的 autotools 项目?

问题描述

我有一个需要使用另一个用 CMake 构建的库的 autotools C 项目。它们是否等同于适用于 CMake 的 AC_CONFIG_SUBDIRS?

标签: cmakeautotools

解决方案


我认为您想要配置和构建基于 CMake 的项目作为配置和构建基于 Autotools 的宿主项目的一部分。这是可能的,并且有几种可行的方法可以做到这一点,但我不知道任何完全预先打包的东西,比如AC_CONFIG_SUBDIRS基于 Autotools 的子项目。

用于配置

选项 1 - 配置命令

Autoconf 提供了一组宏,您可以通过它们指定自定义命令configure或生成的config.status脚本来运行。您可以使用其中之一——可能AC_CONFIG_COMMANDS,但可能——在子项目AC_CONFIG_COMMANDS_POST中运行(以及任何想要的准备步骤)。cmake就个人而言,我最喜欢这个选项。

选项 2 - 粘合脚本

AC_CONFIG_SUBDIRS指示在指定的子目录configure中运行configure脚本,但那些其他configure脚本不需要是 Autotools 生成的。您可以想象configure在子项目目录中编写一个名为“”的自定义包装器脚本供父级configure运行,但它本身会执行对cmake. AC_CONFIG_SUBDIRS然后在顶级配置中应该在正确的时间运行该脚本。

选项 3 - 自定义代码

我认为 Autoconf 已经为您似乎想要的内容提供了足够的支持,但是如果您不这么认为,那么您始终可以选择将任何您想要的 shell 代码写入configurevia configure.ac。您可能会发现为此编写自定义宏是值得的,特别是如果您有多个 CMake 子项目,但这不是强制性的。请注意,此类命令与通过AC_CONFIG_COMMANDS& co 指定的命令不同。由他们执行的时间。

用于建筑

make大概您将在构建和安装步骤中依赖递归。Makefile.in无论您是在顶层使用基于 Automake 的还是手动滚动的,都应该不难做到这一点。

选项 1 - Automake + 胶水 makefile

使用SUBDIRS顶层中的变量Makefile.am来直接make递归到 CMake 项目的子目录,就像您在任何其他项目中所做的那样。在那里编写一个简单的 Makefile 递归到build子目录(您必须确保它是由创建和配置的configure)。这不应该与子项目冲突,因为它预先假定使用了单独的构建目录。胶水 makefile 可以使目标和make变量适应子项目构建系统的期望。

Automake 文档描述了顶级 Autotools makefile 可能尝试递归构建的所有递归目标,并且胶水 makefile 应该提供所有这些目标——尽管可能有许多只需要一个虚拟(但不是空的)配方。

选项 2 - 手卷顶层Makefile.in

另一方面,如果您使用的是手动顶级Makefile模板,那么您可以完全控制递归make调用。在这种情况下,您仍然可以在子项目中使用胶水 makefile,但直接适应预期的 CMake 生成的 makefile 可能更容易和更清晰。


推荐阅读