CMake脚本中带有尖括号的变量

11

我注意到 CMake 不仅可以使用 ${VAR_NAME} 语法中的变量,还可以使用 <VAR_NAME> 语法中的变量。例如,以下代码:

IF(NOT CMAKE_CXX_LINK_EXECUTABLE)
  SET(CMAKE_CXX_LINK_EXECUTABLE
    "<CMAKE_CXX_COMPILER>  <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS>  -o <TARGET> <LINK_LIBRARIES>")
ENDIF(NOT CMAKE_CXX_LINK_EXECUTABLE)

在名为CMakeCXXInformation.cmake的脚本中,在CMake模块文件夹中找到了它。

我没有在文档中找到有关使用尖括号语法的解释。有人使用过这样的语法吗,可以解释一下其含义吗?

1个回答

3

常规的CMake变量可以使用通常的${FOO}语法进行解引用。这些解引用发生在CMake运行期间。

在某个时候,CMake引入了生成器表达式,其形式为$<FOO>。从CMake的角度来看,这样的表达式是普通字符串。然而,在构建系统生成阶段(例如,当您运行makeninja时),它们会被替换。

最后,还有<FOO>表达式。这些也是普通字符串,通常在内部CMake代码中用作替代品,稍后会被string(REPLACE …)命令替换。例如,当在CMake中添加对新语言的支持时,这种表达式被广泛使用,请参见share/cmake/Modules/CMakeAddNewLanguage.txt以获取更多信息。

ExternalProject命令的文档提到了一些<FOO>风格的变量。显然,<SOURCE_DIR><BINARY_DIR>会被实际的源目录和构建目录替换,用于给定外部项目(而不是调用ExternalProject_*()的项目的${CMAKE_SOURCE_DIR}${CMAKE_BINARY_DIR}),但我找不到这组命令可用替换的完整列表。


4
但这有什么区别呢?为什么他们在内部使用 ${VAR} 和 <VAR> 语法? - Oleksandr
1
在这种情况下,<VAR>是普通字符串。它不是CMake语言的一部分。我想,CMake开发人员有意使它们不同,以避免混淆。 - arrowd
嗯,为了百分之百清楚,<VAR>除了可能稍后被某种字符串解析函数替换外,没有任何意义吗?看起来是这样,但我不太明白为什么cmake甚至使用这些占位符。如果你好奇,我来到这里的原因是有一行代码在我继承的代码中使用了<BINARY_DIR>,我也以为它是一个占位符,但显然它以某种方式被赋值了...?即使我认为只有${BINARY_DIR}可以用来获取变量的值,它也会返回一个真实路径。 - jrh
这可能是一个有点奇怪的理论,但是问题中的代码为cmake本身提供了命令行参数;它是一个运行cmake的cmake脚本;那么cmake本身算作一种...cmake语言吗?编辑:看起来它们对ExternalProject_Add有特殊意义。 - jrh
我注意到该页面上的所有示例都是$<var>形式的,但我更想了解没有美元符号的情况,例如只有<var>。我的测试似乎表明这可能是ExternalProject_Add特定的情况,但我不确定谁评估这些表达式,是被添加的外部项目还是添加外部项目的项目。 - jrh
1
我仍然不清楚这一点,因为我似乎处于与@jrh完全相同的情况。即使在此处on the ExternalProject_Add页面上,<BINARY_DIR>和<$CONFIG>都被使用了? 为什么有人会在ExternalProject命令中使用裸尖括号? - eMeL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接