【发布时间】:2011-10-31 06:20:04
【问题描述】:
所以似乎有很多关于 Autotools 与 CMake 主题的文章,但对于我来说,我似乎无法找到关于如何从 Autotools 转换项目的好教程(Makefile.am 和configure.ac 文件)到 CMake(CMakeLists.txt 文件)。如何做到这一点?
【问题讨论】:
标签: build build-process cmake autotools build-system
所以似乎有很多关于 Autotools 与 CMake 主题的文章,但对于我来说,我似乎无法找到关于如何从 Autotools 转换项目的好教程(Makefile.am 和configure.ac 文件)到 CMake(CMakeLists.txt 文件)。如何做到这一点?
【问题讨论】:
标签: build build-process cmake autotools build-system
没有自动化工具可以将任意构建系统从 autotools 转换为 cmake。我已经手动转换了一些中等规模的项目。我喜欢为每组configure.ac 和/或Makefile.am 文件创建一个CMakeLists.txt 文件,以简化从autotools 到cmake 的转换。
遗憾的是,这种手动方法需要在两个系统中培养专业知识,不应将任何一个系统强加于任何无辜者。
记录 autotools build 在您的机器上实际执行的操作。这将帮助您验证您的 CMake 构建系统是否使用相同的编译标志实际编译每个文件,并创建 autotools 执行的每个库和可执行文件;至少在你的机器上,有你的选择。
% ./configure [配置选项] > configure_autotools.log
% make > make_autotools.log
% make install > make_install_autotools.log
在每个包含configure.ac 或Makefile.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)
您现在拥有一个一致但无用的 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 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 答案是否是此类列表的最佳位置...
为了获得额外的荣誉,一旦您完成了所有工作,请调整您的 cmake 规则,以便能够从 Windows Visual Studio 构建和运行您的项目。用自动工具试试吧!
【讨论】:
file(GLOB ...) 提供源代码,因为它实际上使 CMake 的文件跟踪更加困难。维护源文件的手动列表是要走的路。我还要补充一点,转换一个随机项目比转换一个真正熟悉的项目要困难得多,尤其是对于大型代码库。一直困扰我最多的部分是在构建链中使用非标准工具时。
这种转换是非常特定于项目的,这使得编写普遍适用的教程变得困难。
这里是一些工具的开始,可能会给你一些灵感。
https://gitlab.kitware.com/cmake/community/-/wikis/Home#converters-from-other-buildsystems-to-cmake
===== 一篇与此相关的有趣文章:
为什么 KDE 项目切换到 CMake —— 以及如何(续) http://lwn.net/Articles/188693/
【讨论】: