【发布时间】:2019-07-11 22:31:06
【问题描述】:
我有一个 autotools C 项目,需要使用另一个用 CMake 构建的库。它们是否等同于适用于 CMake 的 AC_CONFIG_SUBDIRS?
【问题讨论】:
我有一个 autotools C 项目,需要使用另一个用 CMake 构建的库。它们是否等同于适用于 CMake 的 AC_CONFIG_SUBDIRS?
【问题讨论】:
我认为您想要配置和构建基于 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.ac 将您想要的任何 shell 代码写入configure。您可能会发现为此编写自定义宏是值得的,特别是如果您有多个 CMake 子项目,但这不是强制性的。请注意,此类命令与通过AC_CONFIG_COMMANDS & co 指定的命令不同。按执行时间。
大概您将在构建和安装步骤中依赖递归make。无论您是使用基于 Automake 的 Makefile.in 还是顶层的手动操作,都应该不难做到这一点。
在您的顶级Makefile.am 中使用SUBDIRS 变量来指示make 递归到CMake 项目的子目录,就像您在任何其他项目的子目录中所做的那样。在那里编写一个简单的 Makefile 递归到 build 子目录(您必须确保它是由 configure 创建和配置的)。这不应该与子项目冲突,因为它预设了使用单独的构建目录。胶水 makefile 可以使目标和make 变量适应子项目构建系统的期望。
Automake 文档描述了 all the recursive targets 顶级 Autotools makefile 可能会尝试递归构建,并且胶水 makefile 应该提供所有这些 - 尽管可能有很多只需要一个虚拟(但不是空的)配方.
Makefile.in
另一方面,如果您使用手动顶级Makefile 模板,那么您可以完全控制递归make 调用。在这种情况下,您仍然可以在子项目中使用胶水 makefile,但直接适应预期的 CMake 生成的 makefile 可能更容易和更清晰。
【讨论】:
configure 输出的末尾或附近,您应该会看到类似“config.status: execution libdivsufsort commands”的行。如果您没有看到,那么您可能在应用更改后忘记运行autoreconf。如果您确实看到它,那么可能是您拼错了目录名称,或者cmake 由于某种原因失败了。或者请注意,如果您尝试配置源外构建,则需要更聪明的命令。