如何使用cmake依赖项处理autotools项目?

时间:2019-07-11 22:31:06

标签: cmake autotools

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

1 个答案:

答案 0 :(得分:1)

我认为您要配置和构建基于CMake的项目,这是配置和构建基于Autotools的宿主项目的一部分。这是可行的,并且有几种可行的方法可以实现,但是我不知道像AC_CONFIG_SUBDIRS这样的完全预打包的东西是基于Autotools的子项目的。

用于配置

选项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生成。可以想象,您可以在子项目目录中编写一个名为“ configure”的自定义包装脚本,以使父configure运行,但该脚本本身会对cmake进行适当的调用。然后,顶级配置中的AC_CONFIG_SUBDIRS应该在正确的时间运行该脚本。

选项3-自定义代码

我认为Autoconf已经为您想要的内容提供了足够的支持,但是如果您认为不是这样,那么您始终可以选择通过configure将所需的任何shell代码写入configure.ac中。您可能会发现为此编写一个自定义宏是值得的,尤其是在您有多个CMake子项目的情况下,但这不是必须的。请注意,此类命令与通过AC_CONFIG_COMMANDS&co指定的命令有所区别。根据他们的执行时间。

用于建筑

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

选项1-Automake +粘贴makefile

在顶层SUBDIRS中使用Makefile.am变量来指示make递归到CMake项目的子目录,就像您进入其他任何项目一样。在此处编写一个简单的Makefile,然后将其复制到build子目录(您必须确保该子目录由configure创建和配置)。这不应与子项目冲突,因为它假定使用了单独的构建目录。胶水makefile可以使目标和make变量适应子项目的构建系统的期望。

Automake文档描述了all the recursive targets,即顶级Autotools makefile可能会尝试递归生成,gluk makefile应该提供所有这些文件-尽管可能有许多只需要一个虚拟文件(但不能为空) )食谱。

选项2-手动滚动的顶级Makefile.in

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