cmake - 如何处理具有 cmake 依赖关系的 autotools 项目?
问题描述
我有一个需要使用另一个用 CMake 构建的库的 autotools C 项目。它们是否等同于适用于 CMake 的 AC_CONFIG_SUBDIRS?
解决方案
我认为您想要配置和构建基于 CMake 的项目作为配置和构建基于 Autotools 的宿主项目的一部分。这是可能的,并且有几种可行的方法可以做到这一点,但我不知道任何完全预先打包的东西,比如AC_CONFIG_SUBDIRS
基于 Autotools 的子项目。
用于配置
选项 1 - 配置命令
Autoconf 提供了一组宏,您可以通过它们指定自定义命令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 已经为您似乎想要的内容提供了足够的支持,但是如果您不这么认为,那么您始终可以选择将任何您想要的 shell 代码写入configure
via configure.ac
。您可能会发现为此编写自定义宏是值得的,特别是如果您有多个 CMake 子项目,但这不是强制性的。请注意,此类命令与通过AC_CONFIG_COMMANDS
& co 指定的命令不同。由他们执行的时间。
用于建筑
make
大概您将在构建和安装步骤中依赖递归。Makefile.in
无论您是在顶层使用基于 Automake 的还是手动滚动的,都应该不难做到这一点。
选项 1 - Automake + 胶水 makefile
使用SUBDIRS
顶层中的变量Makefile.am
来直接make
递归到 CMake 项目的子目录,就像您在任何其他项目中所做的那样。在那里编写一个简单的 Makefile 递归到build
子目录(您必须确保它是由创建和配置的configure
)。这不应该与子项目冲突,因为它预先假定使用了单独的构建目录。胶水 makefile 可以使目标和make
变量适应子项目构建系统的期望。
Automake 文档描述了顶级 Autotools makefile 可能尝试递归构建的所有递归目标,并且胶水 makefile 应该提供所有这些目标——尽管可能有许多只需要一个虚拟(但不是空的)配方。
选项 2 - 手卷顶层Makefile.in
另一方面,如果您使用的是手动顶级Makefile
模板,那么您可以完全控制递归make
调用。在这种情况下,您仍然可以在子项目中使用胶水 makefile,但直接适应预期的 CMake 生成的 makefile 可能更容易和更清晰。
推荐阅读
- python - 有没有办法通过它的主要索引来分割一个列表?
- javascript - AngularJS 的继承控制器
- python - 将字母数字字符串屏蔽为类似格式
- windows - Windows systemprofile 目录根据用户显示不同
- python - Can't import scikit-learn: ImportError: DLL load failed: 找不到指定的程序
- python - 如何在 pycharm (windows 10) 上安装 numpy 1.18.1
- java - 将交互式 shell 输出转换为纯文本
- ruby-on-rails - 在实例范围内的类上定义的运行块
- typescript - 部署到 Firebase 时出现 TypeScript Functions 编译错误
- csv - Protractor Console.Log 导出选项?