如何处理具有 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 生成文件可能更容易和更清晰。
我有一个 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 生成文件可能更容易和更清晰。