如果您没有设置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()
或者这不重要吗?
答案 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_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
)。