【问题标题】:Variables with angle brackets in CMake scriptsCMake 脚本中带尖括号的变量
【发布时间】:2012-11-05 02:20:40
【问题描述】:

我注意到 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 模块文件夹中找到。

我没有在文档中找到关于使用尖括号的语法的任何解释。有没有人用过这样的语法,能解释一下它的意思吗?

【问题讨论】:

    标签: cmake


    【解决方案1】:

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

    在某些时候,CMake 引入了generator expressions,其形式为$&lt;FOO&gt;。从 CMake 的角度来看,这样的表达式是纯字符串。但是,在运行生成器代码时它们会被取消引用(例如,当您运行 makeninja 时)。

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

    ExternalProject 命令的文档提到了一些&lt;FOO&gt; 样式变量。 &lt;SOURCE_DIR&gt;&lt;BINARY_DIR&gt; 显然会被真实的源代码替换,并为给定的外部项目构建目录(不是名为 ExternalProject_*() 的项目的 ${CMAKE_SOURCE_DIR}${CMAKE_BINARY_DIR}),但我找不到这组命令的可用替换的完整列表。

    【讨论】:

    • 但是有什么区别呢?为什么他们在内部使用 ${VAR} 和 语法?
    • &lt;VAR&gt; 在这种情况下是纯字符串。它不是 CMake 语言的一部分。我想,CMake 开发人员故意让它们与众不同以避免混淆。
    • 嗯,所以要 100% 清楚,&lt;VAR&gt; 除了以后可能被某种字符串解析函数替换之外没有任何意义?情况似乎是这样,但我不太明白为什么 cmake 甚至使用这些占位符值。如果你很好奇,是什么让我来到这里的是在我继承的一段代码中有一行代码使用&lt;BINARY_DIR&gt;,我认为它也是一个占位符,但显然它以某种方式被赋予了一个值......?尽管我认为只有 ${BINARY_DIR} 可以用来获取变量的值,但它还是返回了一条真实的路径。
    • 这可能是一种奇怪的理论,但是有问题的代码为 cmake 本身提供了命令行参数;它是一个运行 cmake 的 cmake 脚本; cmake 本身是否算作 cmake 的呃...语言?编辑:看起来它们对ExternalProject_Add 有特殊意义
    • 我仍然不清楚这一点,因为我似乎处于@jrh 的确切情况。即使在这里on the ExternalProject_Add 页面同时使用 和 ?为什么有人会在 ExternalProject 命令中使用裸尖括号?
    猜你喜欢
    • 2011-09-28
    • 2019-05-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2011-11-30
    • 1970-01-01
    相关资源
    最近更新 更多