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

stu*_*pix 5 cmake

我注意到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)
Run Code Online (Sandbox Code Playgroud)

在名为的脚本的CMake modules文件夹中找到CMakeCXXInformation.cmake

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

arr*_*owd 3

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

在某个时候,CMake 引入了生成器表达式,其形式为$<FOO>. 从 CMake 的角度来看,此类表达式是纯字符串。但是,它们在构建系统生成阶段(例如,当您运行make或时ninja)被替换。

最后,还有<FOO>表情。这些也是纯字符串,主要在内部 CMake 代码中用作替代品,稍后用string(REPLACE ...)命令替换。例如,在 CMake 中添加对新语言的支持时,此类表达式被广泛使用,share/cmake/Modules/CMakeAddNewLanguage.txt有关更多信息,请参阅 参考资料。

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

  • 但有什么区别呢?为什么他们在内部使用 ${VAR} 和 &lt;VAR&gt; 语法? (4认同)