【发布时间】:2021-11-26 03:20:37
【问题描述】:
使用 CMake 版本 3.20.1,我正在做一些我认为相对简单的事情:验证 cfg pass via -DCMAKE_BUILD_TYPE=<cfg> 的值是有效配置。
参考CMake generator expressions 文档,$<CONFIG:cfgs> 似乎是$<IN_LIST:string,list> 的特殊情况,其中字符串为${CMAKE_CONFIGURATION_TYPES}。我得到的 CMake 运行时错误强化了这一点,并告诉我我遗漏了一些东西。
我期望的工作是这样的:
set( CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Build Configurations" FORCE )
if( NOT $<CONFIG:${CMAKE_CONFIGURATION_TYPES}> )
# Handle_the_bad_value()
endif()
当从命令行调用 cmake .. -DCMAKE_BUILD_TYPE=Debug 时,出现以下错误:
CMake Error at CMakeLists.txt:45 (if):
if given arguments:
"NOT" "\$<CONFIG:Debug" "Release>"
Unknown arguments specified
更换
$<CONFIG:<cfg_list>
与任一:
$<IN_LIST:${CMAKE_BUILD_TYPE},${CMAKE_CONFIGURATION_TYPES}>
或
$<IN_LIST:"Debug","Debug;Release">
给了我以下信息:
CMake Error at CMakeLists.txt:43 (if):
if given arguments:
"NOT" "\$<IN_LIST:Debug,Debug" "Release>"
Unknown arguments specified
在尝试 $<IN_LIST:str,list> 之前,我已经对原始语法进行了各种更改,但是由于我无法使 IN_LIST 语法正常工作,我觉得有一些基本的东西我错了m 也未能从文档中掌握。
随后的实验,使用:
if( NOT ${CMAKE_BUILD_TYPE} IN_LIST ${CMAKE_CONFIGURATION_TYPES} )
产量:
CMake Error at CMakeLists.txt:43 (if):
if given arguments:
"NOT" "Debug" "IN_LIST" "Debug" "Release"
Unknown arguments specified
所以我尝试了蛮力:
if( NOT ( "Debug" IN_LIST "Debug;Release" ) )
它的计算结果不正确,因为它在列表中没有找到“Debug”,所以它在 if 语句中输入代码。最后的尝试:
if( NOT ( CMAKE_BUILD_TYPE IN_LIST CMAKE_CONFIGURATION_TYPES ) )
是否按预期工作。注意:NOT 应该应用于括号内的 表达式。但它仍然不能帮助我理解 CONFIG 生成器表达式的正确语法。
【问题讨论】:
标签: cmake cmakelists-options cmake-language