防止 cmake 允许 CMAKE_CONFIGURATION_TYPES 的任何值

Prevent cmake from allowing any value for CMAKE_CONFIGURATION_TYPES

我正在尝试做类似

的事情
cmake -DCMAKE_CONFIGURATION_TYPES="Debug;RelWithDebInfo" ... 

我想检查我的类型名称是否有任何错误,所以我尝试了一些荒谬的事情希望 cmake 会出错并确认我的配置类型是正确的。

 cmake -DCMAKE_CONFIGURATION_TYPES="Debug;Relalaland" ...

但是 cmake 只是创建我指定的配置类型...

有没有办法让cmake不接受陌生的CONFIGURATION_TYPES?

所以检查一下。

set(allowed_types Debug Release RelWithDebInfo MinSizeRel)
foreach(i IN LISTS CMAKE_CONFIGURATION_TYPES)
   if(NOT i IN_LIST allowed_types)
       message(FATAL_ERROR "${i} is not valie configuration type")
   endif()
endforeach()

Is there a way to tell cmake to not accept unfamiliar CONFIGURATION_TYPES?

不要。 用户可能希望在外部定义自定义配置类型,这完全可以在工具链文件或命令行中完成。其用途之一可能是构建消毒剂。通常,您应该避免限制用户可以对您的构建执行的操作。只有 硬性要求 进入您的 CMakeLists.txt 并且拒绝自定义构建类型不符合条件。

综上所述,这是您可以执行此操作的方法:

set(known_types Debug Release RelWithDebInfo MinSizeRel)
get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if (is_multi_config)
  foreach (config IN LISTS CMAKE_CONFIGURATION_TYPES)
    if (NOT config IN_LIST known_types)
        message(FATAL_ERROR "Build type '${config}' invalid. Expected one of: ${known_types}")
    endif ()
  endforeach ()
elseif (NOT CMAKE_BUILD_TYPE IN_LIST known_types)
  message(FATAL_ERROR "Build type '${CMAKE_BUILD_TYPE}' invalid. Expected one of: ${known_types}")
endif ()

这适用于单配置生成器和多配置生成器。