【问题标题】:Which CMake version as the minimum?哪个 CMake 版本最低?
【发布时间】:2016-06-03 16:06:39
【问题描述】:

我想使用“cmake_minimum_required”工具定义 CMake 的最低版本。 我已经看到一些项目设置最低版本 2.8 一些其他设置 3.0 或 3.2。 我想了解您对该主题的意见和最佳做法。

【问题讨论】:

  • Opinions and best practices 通常与why? 问题的答案有关。
  • 尽可能选择最大(最后)版本?
  • 不是最后的,而是你需要的;最后一个版本(或前沿的夜间构建)可能不是您需要的东西。但首先您需要确定这些限制背后的原因,然后选择满足您大部分需求的那个 - 很可能可能不是最后一个版本。
  • 如果我要开始一个新项目,我至少会选择 3.3。 3.x 版本确实引入了许多非常有用的命令(例如target_... 命令或if(... IN_LIST ...)),并且它具有更好的一致性检查(可通过policies 配置)。我遇到了一些与我的环境相关的错误(例如,与 ninja 结合使用)并在 3.3 中修复。
  • @mustafagonul:如果您知道满足您的要求的最低版本,并且它是几个版本,那么选择最新和最好的版本基本上是故意烦人的。在撰写本文时,cmake.org 拥有 3.4.3。 Debian stable 有 3.0.2,Ubuntu wily 有 3.2.2,甚至 Gentoo stable 也“只有”3.3.1。因此,为了编译您的软件,基本上每个人都必须先手动下载并安装更新的 CMake(然后它会开始恶化,因为它不会 通过包管理器更新)。作为客户,我不喜欢这样。

标签: cmake minimum required


【解决方案1】:

cmake_minimum_required() 函数用于避免由于 CMakeLists.txt 假设 CMake 版本高于当前主机上安装的版本而导致的任何隐晦错误消息。

例如,早期失败,并带有明确的信息...

CMake 3.2 or higher is required. You are running version 2.8.12.2

...比以后更神秘(很多)的东西更受欢迎...

In file included from /home/foouser/src/testprj/string.cpp:1:0:
/home/foouser/src/testprj/string.hpp:94:29: error: ‘std::is_same’ has not been declared

...只是因为在此示例中,较旧的 CMake 版本不支持 set( CMAKE_CXX_STANDARD 11 )。我相信你会同意的。


理想的设置是:

  1. 具有脚本所需的所有功能的最旧版本。

与运行旧版本的人以及您的脚本的最大兼容性。但它需要测试哪个版本确切首先支持您的构造。所以通常归结为:

  1. 您测试过的最旧版本,它具有您的脚本所需的所有功能。

这对于大多数项目来说可能已经足够了。如果你是唯一一个真正参与该项目的人,并且测试 CMake 兼容性真的在你的列表中很低,那么你最终可能会得到:

  1. 您当前使用的版本。

一旦其他人试图编译您的项目,后一种方法就有一个严重的缺陷。相当多的人使用最新版本的一切。特别是在 Linux 上,默认设置是使用包管理器为您提供的任何内容。例如,Ubuntu wily 目前是 3.2.2 版本——可能有更高版本,但除非你需要更高版本,否则你不应该需要它(因为这意味着如果不先手动安装更新版本的 CMake,人们将无法构建您的项目)。

你应该做的是......

  • 需要一个非常旧的版本,但实际上并未针对该旧版本测试否!)。

原因应该很明显——构建可能会失败,而用户不会得到任何关于为什么会出错的提示。

【讨论】:

  • 在 CMakeLists.txt 中保留评论以跟踪为什么它是您需要的 this 版本的 CMake,这有助于以后的维护。
  • 我很自责,因为我没有按照 DevSolar 的建议写评论。我现在盯着我的cmake_minimum_required 行,不记得为什么我选择了它的当前版本值。
  • @EmileCormier:如果您记得您确实为 {reason} 选择了那个号码,请安装 an older version of CMake 并检查哪些中断。 ;-) 或者耸耸肩说“只要它有效,它就不是重要的”。 ;-)
  • 我心中的 ~~完美主义者~~ 痴迷者会想要进行二分搜索以找到实际可行的最小版本。 :-D
猜你喜欢
  • 1970-01-01
  • 2011-12-12
  • 2022-11-23
  • 2012-06-01
  • 2011-04-21
  • 1970-01-01
  • 2020-04-27
  • 2016-06-24
  • 1970-01-01
相关资源
最近更新 更多