63

所以似乎有很多关于 Autotools 与 CMake 的文章,但对于我的生活,我似乎无法找到一个关于如何将项目从 Autotools(Makefile.amconfigure.ac文件)转换为 CMake(CMakeLists.txt文件)。如何做到这一点?

4

2 回答 2

112

没有自动化工具可以将任意构建系统从 autotools 转换为 cmake。我已经手动转换了一些中等规模的项目。我喜欢CMakeLists.txt为每组configure.ac和/或Makefile.am文件创建一个文件,以简化从 autotools 到 cmake 的转换。

可悲的是,这种手动方法需要在两个系统中培养专业知识,其中任何一个都不应该强加给任何无辜者。

  1. 捕获自动工具构建在您的机器上实际执行的操作的记录。这将帮助您验证您的 CMake 构建系统是否使用相同的编译标志实际编译每个文件,并创建 autotools 执行的每个库和可执行文件;至少在你的机器上,有你的选择。

    % ./configure [配置选项] > configure_autotools.log

    % 制作 > make_autotools.log

    % 安装 > make_install_autotools.log

  2. 在每个包含configure.acorMakefile.am文件的目录中,包括项目根目录,创建一个新的空 CMakeLists.txt 文件。将 cmake add_subdirectory(...) 命令添加到每个非叶 CMakeLists.txt 文件中,以将所有 cmake 文件以树状结构链接在一起。将 cmake project() 和 cmake_minimum_required() 命令添加到顶级 CMakeLists.txt 文件的顶部。

    project(MyProject)
    cmake_minimum_required(VERSION 2.8)
    add_subdirectory(foo)
    
  3. 您现在拥有一个一致但无用的 cmake 构建系统,它什么都不做。暂时在更深的 CMakeLists.txt 文件中添加一些message(...)命令,以验证所有内容是否正确连接。请记住,message()在调试 cmake 配置问题时,这是您的朋友。立即尝试构建以确保您的 cmake 基础架构正常工作。什么都不会被建造或安装;但此时使用 cmake 基础设施是很有价值的。

    % mkdir build_cmake

    % cd build_cmake

    % ccmake -i [你的项目根目录]

    [配置,配置,生成]

    % 使 VERBOSE=1

    % 进行安装

  4. 这是困难的部分。一个一个地填充您的 CMakeLists.txt 文件。以下是一些指导方针:

    • 打开两个并排的编辑器,一个带有 CMakeLists.txt 文件,另一个带有相应的 Makefile.am/configure.ac 文件。

    • 让您的浏览器打开cmake 命令文档

    • 与其从最顶层开始,不如从创建用于构建小型库或可执行文件的 cmake 规则开始,如果您可以在项目中找到一个(cmakeadd_library()add_executable())。使用这种方法,您可以一次建立一个转换。

    • 添加每个目标时,请定期测试您的 cmake 构建系统。

    • 我喜欢使用 cmakefile(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 答案是否是此类列表的最佳位置...

  5. 为了获得额外的功劳,一旦您完成了所有工作,请调整您的 cmake 规则,以便能够从 Windows Visual Studio 构建和运行您的项目。用自动工具试试吧!

于 2011-10-06T20:42:25.327 回答
12

这种转换是非常特定于项目的,这使得编写一个普遍适用的教程变得困难。

下面是一些工具的开始,它们可能会给你一些灵感。

https://gitlab.kitware.com/cmake/community/-/wikis/Home#converters-from-other-buildsystems-to-cmake

===== 一篇与此相关的有趣文章:

为什么 KDE 项目切换到 CMake - 以及如何(续) http://lwn.net/Articles/188693/

于 2011-09-24T17:05:22.013 回答