在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
)
$<$<CONFIG:Debug>:Release>$<$<CONFIG:Release>:Debug>
在这里意味着什么?
答案 0 :(得分:11)
这是一个CMake generator expression。您可以点击链接,全面讨论这些内容以及它们可以执行的操作。简而言之,它是CMake将在生成时评估的一段文本(当它完成解析所有CMakeLists并生成构建系统时);它可以为每个配置评估不同的值。
你所拥有的那个大致意味着这个(伪代码):
if current_configuration == "Debug"
output "Release"
if current_configureation == "Release"
output "Debug"
因此,如果当前配置为Debug,则整个表达式将计算为Release
。如果当前配置发布,它将评估为Debug
。请注意,正在添加的步骤称为&#34; BuildOtherConfig,&#34;所以这种倒置的逻辑是有道理的。
如何运作,更详细一点:
$<CONFIG:Debug>
如果当前配置为1
,则评估为Debug
,否则评估为0
。
$<1:X>
评估为X
。
$<0:X>
评估为空字符串(无值)。
把它放在一起,我们有$<$<CONFIG:Debug>:Release>
。当前配置为Debug
时,其评估结果如下:
$<$<CONFIG:Debug>:Release>
$<1:Release>
Release
当前配置不是Debug
时,它的评估结果如下:
$<$<CONFIG:Debug>:Release>
$<0:Release>
答案 1 :(得分:0)
像$<...>
这样的表达式是generator exressions,在CMake 2.8中引入。这些表达式的主要特征是它们在构建时评估,而不是在配置时评估,就像普通的CMake变量一样。
你的特殊表达
$<$<CONFIG:Debug>:Release>
扩展到&#34;发布&#34;如果正在使用Debug
配置。