我有一个autotools C项目,需要使用另一个使用CMake构建的库。它们等同于将与CMake一起使用的AC_CONFIG_SUBDIRS吗?
答案 0 :(得分:1)
我认为您要配置和构建基于CMake的项目,这是配置和构建基于Autotools的宿主项目的一部分。这是可行的,并且有几种可行的方法可以实现,但是我不知道像AC_CONFIG_SUBDIRS
这样的完全预打包的东西是基于Autotools的子项目的。
Autoconf提供了a group of macros,您可以通过它们为configure
或运行的生成的config.status
脚本指定自定义命令。您可以使用其中之一(可能是AC_CONFIG_COMMANDS
,但也许是AC_CONFIG_COMMANDS_POST
)在子项目中运行cmake
(以及任何需要的准备步骤)。我个人最喜欢这个选项。
AC_CONFIG_SUBDIRS
指示configure
在指定子目录中运行configure
脚本,但是其他configure
脚本不需要由Autotools生成。可以想象,您可以在子项目目录中编写一个名为“ configure
”的自定义包装脚本,以使父configure
运行,但该脚本本身会对cmake
进行适当的调用。然后,顶级配置中的AC_CONFIG_SUBDIRS
应该在正确的时间运行该脚本。
我认为Autoconf已经为您想要的内容提供了足够的支持,但是如果您认为不是这样,那么您始终可以选择通过configure
将所需的任何shell代码写入configure.ac
中。您可能会发现为此编写一个自定义宏是值得的,尤其是在您有多个CMake子项目的情况下,但这不是必须的。请注意,此类命令与通过AC_CONFIG_COMMANDS
&co指定的命令有所区别。根据他们的执行时间。
大概在构建和安装步骤中将依靠递归make
。无论您使用的是基于Automake的Makefile.in
还是在顶层使用手动卷制的工具,都不难做到这一点。
在顶层SUBDIRS
中使用Makefile.am
变量来指示make
递归到CMake项目的子目录,就像您进入其他任何项目一样。在此处编写一个简单的Makefile,然后将其复制到build
子目录(您必须确保该子目录由configure
创建和配置)。这不应与子项目冲突,因为它假定使用了单独的构建目录。胶水makefile可以使目标和make
变量适应子项目的构建系统的期望。
Automake文档描述了all the recursive targets,即顶级Autotools makefile可能会尝试递归生成,gluk makefile应该提供所有这些文件-尽管可能有许多只需要一个虚拟文件(但不能为空) )食谱。
Makefile.in
另一方面,如果您使用的是手动滚动的顶级Makefile
模板,则可以完全控制递归make
的调用。在这种情况下,您仍然可以在子项目中使用胶水制作文件,但是直接适应预期的CMake生成的制作文件可能更容易,更清洁。