在cmake中"$ <$ <CONFIG:Debug>:Release>"是什么意思?

Dav*_* S. 9 cmake

buildem_cmake_recipe.cmake中,我看到了一个表达式:

    externalproject_add_step(${_name} BuildOtherConfig
                        COMMAND ${CMAKE_COMMAND} --build ${BINARY_DIR} --config "$<$<CONFIG:Debug>:Release>$<$<CONFIG:Release>:Debug>" --target INSTALL
                        DEPENDEES install
                        )
Run Code Online (Sandbox Code Playgroud)

$<$<CONFIG:Debug>:Release>$<$<CONFIG:Release>:Debug>意味着什么?

Rei*_*ica 16

这是一个CMake 生成器表达式.您可以按照链接进行全面讨论,了解这些内容以及它们可以执行的操作.简而言之,它是CMake将在生成时评估的一段文本(当它完成解析所有CMakeLists并生成构建系统时); 它可以为每个配置评估不同的值.

你在那里的那个意味着大概这个(伪代码):

if current_configuration == "Debug"
  output "Release"
if current_configureation == "Release"
  output "Debug"
Run Code Online (Sandbox Code Playgroud)

因此,如果当前配置是Debug,则整个表达式将计算为Release.如果当前配置发布,它将评估为Debug.请注意,添加的步骤称为"BuildOtherConfig",因此这种反转逻辑是有意义的.


如何工作,更详细一点:

$<CONFIG:Debug>
Run Code Online (Sandbox Code Playgroud)

这将评估1当前配置是否为Debug,0否则为.

$<1:X>
Run Code Online (Sandbox Code Playgroud)

评估到X.

$<0:X>
Run Code Online (Sandbox Code Playgroud)

计算为空字符串(无值).

把它放在一起,我们有$<$<CONFIG:Debug>:Release>.当前配置是Debug,它的评估如下:

$<$<CONFIG:Debug>:Release>
$<1:Release>
Release
Run Code Online (Sandbox Code Playgroud)

当前配置不是时Debug,它的计算结果如下:

$<$<CONFIG:Debug>:Release>
$<0:Release>
Run Code Online (Sandbox Code Playgroud)

  • @jrh 此答案中使用的“CONFIG”不是变量。它是 `$&lt;CONFIG:x&gt;` 生成器表达式语法的一部分。`DCONFIG=Release` 设置一个与 Genex 无关的变量。Genex 基于“正在生成的当前配置”。对于单配置生成器,这将是“CMAKE_BUILD_TYPE”的值。对于多配置生成器,它将在生成时依次使用“CMAKE_CONFIGURATION_TYPES”中的每个配置。 (2认同)