【问题标题】:What are the benefits of cmake over make for single platform project对于单平台项目,cmake 比 make 有什么好处
【发布时间】:2023-03-28 14:56:02
【问题描述】:

如果有一个相对较大的项目完全使用Makefiles 构建,是否可以将make 替换为cmake?大家都强调cmake更容易支持跨平台开发,但万一目标平台只是其中之一,没有计划改变它。在这种特殊情况下,cmake 会给我带来什么好处?

【问题讨论】:

  • 这不是在“非常简单的单平台案例”中询问 CMake 优于 Make 的第一次尝试。实际上,CMake 提供的不仅仅是多平台开发。您可以列出 CMake 的任何优点,并从中消除一点。
  • 嗯,cmake 会生成 makefile。所以cmake所做的一切,都可以在makefile中完成。反过来并不总是正确的:在 makefile 中做一些非常琐碎的事情在 cmake 中却很难做。 cmake 为您做了很多事情,因此您不必编写复杂的 makefile——但您的已经编写好了。对于已经在 makefile 中实现的项目,您需要问自己希望通过切换获得什么。如果您的 makefile 可以满足您的要求并且可靠,那么转换它们只是浪费精力。如果他们有问题,也许 cmake 会有所帮助。
  • @MadScientist “嗯,cmake 会生成 makefile。所以 cmake 所做的一切都可以在 makefile 中完成。” 这个推理有缺陷,原因很简单:cmake 生成的 makefile包括对 cmake 命令行工具的调用,这意味着可能涉及的功能可能在 makefile 中不可用,除非您的系统上安装了 cmake。
  • @fabian 理论上是这样,但实际上并非如此。 cmake 调用只是为了提供某种程度的操作系统抽象:删除文件、创建目录等。请参阅cmake -E --help 的输出以查看 cmake 生成的 makefile 可能调用的操作。

标签: makefile cmake gnu-make


【解决方案1】:
  1. CMake 还擅长查找依赖项。以 OpenMP、TBB 和 MPI 为例,它们在并行执行方面非常常见。 CMake 提供了方便的方法来检查这些库中的哪些存在。你得到一个变量来使用添加包含和库到你的目标,你就完成了。如果您想在您的 C、C++ 代码(或您使用的任何代码)中知道存在哪个库,CMake 提供了将预处理器宏传递给编译器命令的方法。

  2. 与 Makefile 相比,CMakeLists.txt 文件更间接。这使它们更难阅读和理解。随着项目规模的扩大,它会变成一种优势,因为您必须在一个或更少的点上进行更改。

  3. 使用 CTest 可以很容易地包含基本测试。

  4. 您可以在项目中包含一些模块(CMake 代码文件)。这可以帮助您找到依赖项、自动化 Qt 的 moc(已包含在 CMake 中)或构建您的文档(Sphinx、JavaDoc、Doxygen、LaTeX)。使用 Make,大多数时候您最终都会编写自己的代码。

当然,你可以用 make 做任何事情,但需要付出更多的努力。您的项目越大,获得的目标和依赖项越多,成熟的构建系统就越能得到回报。这不仅适用于 CMake,也适用于 Meson、Waf 等。

【讨论】:

  • 我不同意这一点,但我会说:将复杂的 makefile 项目转换为 cmake 并不总是那么容易。 Make 为您提供了很大的灵活性来做 cmake 可能会变得非常困难的事情。如果您的系统是一个简单的编译,那很好,但是您需要做的“高级”事情越多,例如生成源文件的 DSL、生成链接器映射等花哨的链接器操作,您就越会与 cmake 施加的限制作斗争。
  • @usr1234567 您可能希望将 CPack/安装功能添加到您的答案中。
  • @fabian 上次尝试时,我对 CPack 的 RPM 包感到失望。所以我不认为这是一个优势。
猜你喜欢
  • 2019-04-27
  • 2019-12-21
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 2014-07-09
  • 2022-07-05
相关资源
最近更新 更多