所以似乎有很多关于 Autotools 与 CMake 的文章,但对于我的生活,我似乎无法找到一个关于如何将项目从 Autotools(Makefile.am
和configure.ac
文件)转换为 CMake(CMakeLists.txt
文件)。如何做到这一点?
2 回答
没有自动化工具可以将任意构建系统从 autotools 转换为 cmake。我已经手动转换了一些中等规模的项目。我喜欢CMakeLists.txt
为每组configure.ac
和/或Makefile.am
文件创建一个文件,以简化从 autotools 到 cmake 的转换。
可悲的是,这种手动方法需要在两个系统中培养专业知识,其中任何一个都不应该强加给任何无辜者。
捕获自动工具构建在您的机器上实际执行的操作的记录。这将帮助您验证您的 CMake 构建系统是否使用相同的编译标志实际编译每个文件,并创建 autotools 执行的每个库和可执行文件;至少在你的机器上,有你的选择。
% ./configure [配置选项] > configure_autotools.log
% 制作 > make_autotools.log
% 安装 > make_install_autotools.log
在每个包含
configure.ac
orMakefile.am
文件的目录中,包括项目根目录,创建一个新的空 CMakeLists.txt 文件。将 cmakeadd_subdirectory
(...) 命令添加到每个非叶 CMakeLists.txt 文件中,以将所有 cmake 文件以树状结构链接在一起。将 cmake project() 和 cmake_minimum_required() 命令添加到顶级 CMakeLists.txt 文件的顶部。project(MyProject) cmake_minimum_required(VERSION 2.8) add_subdirectory(foo)
您现在拥有一个一致但无用的 cmake 构建系统,它什么都不做。暂时在更深的 CMakeLists.txt 文件中添加一些
message(...)
命令,以验证所有内容是否正确连接。请记住,message()
在调试 cmake 配置问题时,这是您的朋友。立即尝试构建以确保您的 cmake 基础架构正常工作。什么都不会被建造或安装;但此时使用 cmake 基础设施是很有价值的。% mkdir build_cmake
% cd build_cmake
% ccmake -i [你的项目根目录]
[配置,配置,生成]
% 使 VERBOSE=1
% 进行安装
这是困难的部分。一个一个地填充您的 CMakeLists.txt 文件。以下是一些指导方针:
打开两个并排的编辑器,一个带有 CMakeLists.txt 文件,另一个带有相应的 Makefile.am/configure.ac 文件。
让您的浏览器打开cmake 命令文档。
与其从最顶层开始,不如从创建用于构建小型库或可执行文件的 cmake 规则开始,如果您可以在项目中找到一个(cmake
add_library()
或add_executable()
)。使用这种方法,您可以一次建立一个转换。添加每个目标时,请定期测试您的 cmake 构建系统。
我喜欢使用 cmake
file(GLOB ...)
命令来紧凑地创建源文件列表。请注意,这是一个有争议的观点。许多常见的 autotools 节都有相应的CMake 命令。例如 autoconf AC_TRY_COMPILE可以转换为 cmake TRY_COMPILE。但大多数情况下,我发现我必须了解每个小 autotools 节的作用,并弄清楚如何编写相应的 cmake。此外,还有一系列 CMake 模块可帮助创建类似 autotools 的 config.h 文件。Makefile.am 文件通常更容易转换,并且在转换为 cmake 后实际上可以变得更紧凑。
将您的 cmake 构建结果与您在步骤 1 中捕获的 autotools 日志进行比较。编译标志是否相同?是否构建了所有相同的目标?是否安装了相同的文件?
不幸的是,我最近还没有将 autotools 转换为 cmake,所以我无法写一个全面的“如果您在 Makefile.am 中看到 x,请在 CMakeLists.txt 中写入 y”。有人可以建议一个公共 wiki 的好位置,积极从 autotools 转换为 cmake 的人们可以积累一套全面的此类指南吗?我不确定这个 stackoverflow 答案是否是此类列表的最佳位置...
为了获得额外的功劳,一旦您完成了所有工作,请调整您的 cmake 规则,以便能够从 Windows Visual Studio 构建和运行您的项目。用自动工具试试吧!
这种转换是非常特定于项目的,这使得编写一个普遍适用的教程变得困难。
下面是一些工具的开始,它们可能会给你一些灵感。
https://gitlab.kitware.com/cmake/community/-/wikis/Home#converters-from-other-buildsystems-to-cmake
===== 一篇与此相关的有趣文章:
为什么 KDE 项目切换到 CMake - 以及如何(续) http://lwn.net/Articles/188693/