我应该缓存CMAKE_BUILD_TYPE吗?

时间:2017-10-18 22:22:13

标签: 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()

或只是:

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE "Release" )
endif()

或者这不重要吗?

2 个答案:

答案 0 :(得分:2)

CMAKE_BUILD_TYPE 的缓存对于cmake-gui非常有用:项目的用户可以很好地更改构建类型。

有一个很好的模板可用于设置默认 CMAKE_BUILD_TYPE from developers

# 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()

答案 1 :(得分:2)

CMake缓存中的

CMAKE_BUILD_TYPE

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

即使您没有为单个配置makefile生成器提供CMAKE_BUILD_TYPE,CMake也会自动create an empty cache entry(因此用户可以选择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=

如果CMake的平台/编译器定义没有通过CMAKE_BUILD_TYPE Windows-MSVC来提供CMAKE_BUILD_TYPE_INIT的默认值:

# default to Debug builds
set(CMAKE_BUILD_TYPE_INIT Debug)

设置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()

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

参考