如何处理具有 cmake 依赖性的 autotools 项目?

How to handle autotools project with cmake dependency?

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

我认为您想配置和构建 CMake-based 项目作为配置和构建 Autotools-based 宿主项目的一部分。这是可能的,并且有几种可行的方法可以做到这一点,但我完全不知道 pre-packaged 像 AC_CONFIG_SUBDIRS 是针对 Autotools-based 子项目的任何事情。

配置

选项 1 - 配置命令

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

选项 2 - 粘合脚本

AC_CONFIG_SUBDIRS 指示指定子目录中的 configure 到 运行 configure 脚本,但其他 configure 脚本不需要 Autotools-generated。您可以想象在子项目目录中为 configure 到 运行 编写一个名为“configure”的自定义包装脚本,但它本身会执行对 cmake 的适当调用。 AC_CONFIG_SUBDIRS 在 top-level 配置中应该 运行 该脚本在正确的时间。

选项 3 - 自定义代码

我认为 Autoconf 已经为您似乎想要的东西提供了足够的支持,但是如果您不这么认为,那么您总是可以选择通过 [= 将您想要的任何 shell 代码写入 configure 25=]。您可能会发现为此编写一个自定义宏是值得的,尤其是当您有多个 CMake 子项目时,但这不是强制性的。请注意,此类命令与通过 AC_CONFIG_COMMANDS & co 指定的命令不同。按执行时间。

建筑用

大概您将在构建和安装步骤中依赖递归 make。无论您是在顶层使用 Automake-based Makefile.in 还是 hand-rolled,完成这项工作都不难。

选项 1 - Automake + 胶水 makefile

在您的 top-level Makefile.am 中使用 SUBDIRS 变量来指示 make 递归到 CMake 项目的子目录,就像您对任何其他项目的子目录所做的那样。在那里编写一个简单的 Makefile,递归到 build 子目录(您必须确保它是由 configure 创建和配置的)。这不应与子项目冲突,因为它假定使用了单独的构建目录。 glue makefile 可以调整目标和 make 变量以满足子项目构建系统的期望。

Automake 文档描述 all the recursive targets top-level Autotools makefile 可能会尝试递归构建,而 glue makefile 应该提供所有这些 - 虽然可能有很多只需要一个虚拟(但不是空的)食谱。

选项 2 - hand-rolled top-level Makefile.in

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