【问题标题】:What does "$<$<CONFIG:Debug>:Release>" mean in cmake?cmake中的“$<$<CONFIG:Debug>:Release>”是什么意思?
【发布时间】:2015-12-28 08:47:14
【问题描述】:

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
                        )

$&lt;$&lt;CONFIG:Debug&gt;:Release&gt;$&lt;$&lt;CONFIG:Release&gt;:Debug&gt; 在这里是什么意思?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    这是一个 CMake generator expression。您可以点击链接以全面讨论这些是什么以及它们可以做什么。简而言之,它是 CMake 将在生成时评估的一段文本(当它解析完所有 CMakeList 并正在生成构建系统时);它可以为每个配置评估不同的值。

    你那里的那个大致意思是这个(伪代码):

    if current_configuration == "Debug"
      output "Release"
    if current_configuration == "Release"
      output "Debug"
    

    因此,如果当前配置为 Debug,则整个表达式的计算结果为 Release。如果当前配置的版本,它将评估为Debug。请注意,要添加的步骤称为“BuildOtherConfig”,因此这种反转逻辑是有意义的。


    它是如何工作的,更详细一点:

    $<CONFIG:Debug>
    

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

    $<1:X>
    

    评估为X

    $<0:X>
    

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

    综合起来,我们有$&lt;$&lt;CONFIG:Debug&gt;:Release&gt;。当前配置为Debug 时,其计算结果如下:

    $<$<CONFIG:Debug>:Release>
    $<1:Release>
    Release
    

    当当前配置不是Debug 时,它的评估如下:

    $<$<CONFIG:Debug>:Release>
    $<0:Release>
    

    【讨论】:

    • 如果我要求调试,它会给我释放...你介意评论这个逻辑吗...哈哈。谢谢~
    • @davidshen84 扩展,既可以解释反转,也可以更好地说明扩展。
    • CONFIG的值从何而来?好像和CMAKE_BUILD_TYPE有关,但好像没有直接回应?用-DCONFIG=Release 设置它似乎也不起作用。
    • 它看起来像是来自CMAKE_BUILD_TYPE,还要注意you can't use message to print out generator expressions,虽然可以使用file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/output.txt CONTENT "CONFIG is $&lt;CONFIG&gt;")之类的东西(它会在你的构建目录中放置一个名为 output.txt 的文件该表达式的值)。
    • @jrh 此答案中使用的CONFIG 不是变量。它是$&lt;CONFIG:x&gt; 生成器表达式语法的一部分。 DCONFIG=Release 设置一个与基因无关的变量。 Genex 基于“正在生成的当前配置”。对于单配置生成器,这将是CMAKE_BUILD_TYPE 的值。对于多配置生成器,它们将在生成时依次是来自CMAKE_CONFIGURATION_TYPES 的每个配置。
    【解决方案2】:

    $&lt;...&gt; 这样的表达式是generator exressions,在 CMake 2.8 中引入。这些表达式的主要特点是它们在构建时进行评估,而不是在配置时进行评估,就像普通的 CMake 变量一样。

    你的特殊表情

    $<$<CONFIG:Debug>:Release>
    

    如果Debug 配置正在使用中,则扩展为“发布”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      相关资源
      最近更新 更多