我应该缓存 CMAKE_BUILD_TYPE 吗?

ein*_*ica 5 cmake

如果您不设置CMAKE_BUILD_TYPE,则默认情况下不会缓存它。我应该缓存它吗?例如我应该有:

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE "Release" )
  set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Type of build (Debug, Release etc." FORCE)
endif()
Run Code Online (Sandbox Code Playgroud)

要不就:

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE "Release" )
endif()
Run Code Online (Sandbox Code Playgroud)

或者这并不重要?

Tsy*_*rev 7

CMAKE_BUILD_TYPE的缓存对于 cmake-gui 很有用:项目的用户能够以良好的方式更改构建类型。

Kitware有一个很好的模板用于设置默认CMAKE_BUILD_TYPE

# Set a default build type if none was specified
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  message(STATUS "Setting build type to 'Debug' as none was specified.")
  set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE)
  # Set the possible values of build type for cmake-gui
  set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
    "MinSizeRel" "RelWithDebInfo")
endif()
Run Code Online (Sandbox Code Playgroud)


Flo*_*ian 2

CMAKE_BUILD_TYPE在CMake的缓存中

用户通常会CMAKE_BUILD_TYPE通过命令行使用cmake -D .... 所以这确实生成了一个缓存条目。

即使您没有提供CMAKE_BUILD_TYPE单个配置 makefile 生成器,CMake 也会自动创建一个空的缓存条目(因此用户可以在例如中选择cmake-gui):

//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or
// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.
CMAKE_BUILD_TYPE:STRING=
Run Code Online (Sandbox Code Playgroud)

如果 CMake 的平台/编译器定义没有通过 for给出CMAKE_BUILD_TYPE默认值:CMAKE_BUILD_TYPE_INITWindows-MSVC

# default to Debug builds
set(CMAKE_BUILD_TYPE_INIT Debug)
Run Code Online (Sandbox Code Playgroud)

设置默认值CMAKE_BUILD_TYPE

所以是的,如果您想强制在 GUI 中可见的默认值,请设置缓存变量(请参阅@Tsyvarev 答案)。

我通常不会强制缓存默认值,如果没有给出,我只是设置一个临时值。这允许例如我的项目用作子项目。

但这更多取决于您的个人品味。

在我的项目中,这些默认CMAKE_BUILD_TYPE检查看起来有点复杂,因为我允许更多用例:

# Make RelWithDebInfo the default (it does e.g. add '-O2 -g -DNDEBUG' for GNU)
#   If not in multi-configuration environments, no explicit build type 
#   is set by the user and if we are the root CMakeLists.txt file.
if (NOT CMAKE_CONFIGURATION_TYPES AND 
    NOT CMAKE_NO_BUILD_TYPE AND
    NOT CMAKE_BUILD_TYPE AND
    CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
    set(CMAKE_BUILD_TYPE RelWithDebInfo)
endif()

if (CMAKE_BUILD_TYPE)
    string(TOUPPER "_${CMAKE_BUILD_TYPE}" MY_PROJECT_BUILD_TYPE_EXT)
endif() 

# Choose a configuration for our compiler tests
if (NOT CMAKE_CONFIGURATION_TYPES AND 
    NOT CMAKE_NO_BUILD_TYPE)
    set(CMAKE_TRY_COMPILE_CONFIGURATION "${CMAKE_BUILD_TYPE}")
else()
    set(CMAKE_TRY_COMPILE_CONFIGURATION RelWithDebInfo)
endif()
Run Code Online (Sandbox Code Playgroud)

但也许我应该更新此代码以考虑新的GENERATOR_IS_MULTI_CONFIG全局属性(而不是检查CMAKE_NO_BUILD_TYPE)。

参考