【问题标题】:How do I convert an Autotools project to a CMake project? [closed]如何将 Autotools 项目转换为 CMake 项目? [关闭]
【发布时间】:2011-10-31 06:20:04
【问题描述】:

所以似乎有很多关于 Autotools 与 CMake 主题的文章,但对于我来说,我似乎无法找到关于如何从 Autotools 转换项目的好教程(Makefile.amconfigure.ac 文件)到 CMake(CMakeLists.txt 文件)。如何做到这一点?

【问题讨论】:

    标签: build build-process cmake autotools build-system


    【解决方案1】:

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

    遗憾的是,这种手动方法需要在两个系统中培养专业知识,不应将任何一个系统强加于任何无辜者。

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

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

      % make > make_autotools.log

      % make install > make_install_autotools.log

    2. 在每个包含configure.acMakefile.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 commands documentation

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

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

      • 我喜欢使用 cmake file(GLOB ...) 命令来紧凑地创建源文件列表。请注意,这是一个有争议的观点。

      • 许多常见的自动工具节都有对应的CMake commands。例如 autoconf AC_TRY_COMPILE 可以转换为 cmake TRY_COMPILE。但大多数情况下,我发现我必须了解每个小 autotools 节的作用,并弄清楚如何编写相应的 cmake。此外,还有一个series of CMake modules 可以帮助创建类似自动工具的 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 构建和运行您的项目。用自动工具试试吧!

    【讨论】:

    • 我不想要自动工具。我正在寻找的正是这种类型的讨论和一般性建议。诸如“我喜欢为每组 configure.ac 和 Makefile.am 文件创建一个 CmakeLists.txt 文件”。如果你能详细说明这一点,我会将赏金奖励给你。
    • @KurtisNusbaum:我编辑了答案,详细说明了我经历的过程,包括步骤和更多指南。这种方式更有帮助吗?
    • 这是迄今为止我见过的最好的。不过,我真的很想看到“如果您在 Makefile.am 中看到 x,请在 CMakeLists.txt 中写入 y”。如果有人发现,请告诉我。
    • +1 是一篇不错的帖子,即使 CMake 文档也不推荐 file(GLOB ...) 提供源代码,因为它实际上使 CMake 的文件跟踪更加困难。维护源文件的手动列表是要走的路。我还要补充一点,转换一个随机项目比转换一个真正熟悉的项目要困难得多,尤其是对于大型代码库。一直困扰我最多的部分是在构建链中使用非标准工具时。
    • "用自动工具试试吧!" ./configure CC=/path/to/MSVS/cc ?
    【解决方案2】:

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

    这里是一些工具的开始,可能会给你一些灵感。

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

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

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

    【讨论】:

    • 我看到了。但它们只是 KDE 特有的,我没有发现它们有那么大的帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-09-26
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多