我应该缓存CMAKE_BUILD_TYPE吗?

pbgvytdp  于 7个月前  发布在  其他
关注(0)|答案(2)|浏览(63)

如果你没有设置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()


或者这真的不重要吗?

r8xiu3jd

r8xiu3jd1#

缓存 CMAKE_BUILD_TYPE 对cmake-gui很有用:你的项目的用户可以很好地改变构建类型。
有一个很好的模板用于设置默认值 CMAKE_BUILD_TYPEfrom Kitware

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

字符串

gtlvzcf8

gtlvzcf82#

CMake缓存中的CMAKE_BUILD_TYPE

用户通常会通过命令行用cmake -D ...定义CMAKE_BUILD_TYPE,所以这确实会生成一个缓存条目。
即使你没有给予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=

字符串
如果CMake的平台/服务器定义通过CMAKE_BUILD_TYPE_INIT没有给出CMAKE_BUILD_TYPE的默认值,如Windows-MSVC

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

参考资料

相关问题