“cmake_minimum_required(VERSION 3.10)”中的 "VERSION" 是什么

What is the "VERSION" in "cmake_minimum_required(VERSION 3.10)”

我知道以下CMake语句的含义:

cmake_minimum_required(VERSION 3.10)

我只是想知道 VERSION 部分在语法上是什么

unquoted argument吗?如果它一个参数,那么一定有一些其他的参数选择。

但是根据hereVERSION似乎是cmake_minimum_required()命令的唯一选择。

如果是这样,为什么我们还要明确地指定这个参数??

并且根据here,此命令设置变量CMAKE_MINIMUM_REQUIRED_VERSION。这里有某种字符串 concatenation 吗?所以我可以使用 set_minimum_required(XXX <some_value>) 将名称为 CMAKE_MINIMUM_REQUIRED_XXX 的任意变量发送到 ?

加 1

我刚刚在 CMakeLists.txt 中尝试使用以下语句:

cmake_minimum_required(XXX 123)

并且 cmake 抱怨说:

CMake Error at CMakeLists.txt:2 (cmake_minimum_required):
  cmake_minimum_required called with unknown argument "XXX".

所以好像是在争论

但是根据here对于project()命令,类似的VERSION字符串被指定为选项。好像有点不一致。

添加 2

我刚刚在 CMakeLists.txt 中尝试使用以下语句:

cmake_minimum_required(3.10)

并且 cmake 抱怨说:

CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
  cmake_minimum_required called with unknown argument "3.10".

所以 CMake 似乎依赖 VERSION 部分来正确解释“3.10”参数。所以我想 VERSION 也是一个选项。

并且因为还有另一个可能的选项FATAL_ERROR,所以有必要有一个VERSION选项。

所以总结一下我目前的理解:

CMake语言的本质范式是:

CMake 命令只是根据参数和选项操作变量。

有些变量需要 进行操作,有些变量可选

添加 3

来自here,对于cmake_minimum_required()中的VERSION

The VERSION is a special keyword for this function. And the value of the version follows the keyword.

所以这里叫keyword而不是option ...

加 4

Some feelings 关于 CMake...

我认为CMake命令的输入可以分为3种类型:

  1. 关键字参数(也称为option

  2. 位置参数

  3. 可变参数(如 C 中的 ...

对于1,就像cmake_minimum_required中的VERSION一样,其值紧随其后。它被称为 关键字option.

对于 2,此类参数具有正式名称,并在命令主体中通过该名称进行引用。

对于3,参数可以用ARGVARGNARGVC

引用

我在某处也看到了marker argument。但我忘了在哪里。糟糕的语法...

加 1

好的,我找到了 marker argument。它在 CMake 团队的书 Mastering CMake 中:

...而 CMake 官方文档说它是 option:

Search the paths specified by the PATHS option or in the short-hand version of the command. These are typically hard-coded guesses.

多么混乱的措辞...

What is the "VERSION" in "cmake_minimum_required(VERSION 3.10)”

I am just wondering what the VERSION part is syntactically?

一个字符串。 VERSION。没什么特别的。

Is it a unquoted argument?

是的。

why do we even need to specify this argument explicitly??

保持向前兼容性。这个想法是,也许在功能中会有 cmake_minimum_required(DATE 2021-11-03) 或类似的,例如。

Is there some kind of string concatenation here?

没有。 It is set explicitly.

So I can use set_minimum_required(XXX <some_value>) to sent an arbitrary variable with the name CMAKE_MINIMUM_REQUIRED_XXX to <some_value>?

没有

Some variables are required to be manipulated and some are optional.

CMake argument parsing 真的很粗糙很简单。它基本上是 shell 伪代码 if == "VERSION" then check_version() else error。如何调用这些字符串实际上取决于您的 解释 ,这取决于上下文,在 cmake_minimum_required 的上下文中,确保 VERSION 是一个“关键字”。或“特殊要求的论点”。或类似。

所有函数参数都是字符串,函数将它们与其他字符串进行比较并根据其执行逻辑。没有其他变量类型。列表是字符串,列表元素在字符串中由 ; 个字符分隔。

cmake_minimum_required 的实现在这里: https://gitlab.kitware.com/cmake/cmake/-/blob/master/Source/cmCMakeMinimumRequired.cxx#L29 。有趣的是,看起来解析是在一个循环中,所以 cmake_minimum_required(VERSION VERSION VERSION VERSION 3.11) 工作正常。