From the docs page:
CMAKE_BUILD_TYPE
Specifies the build type on single-configuration generators.
This statically specifies what build type (configuration) will be built in this build tree. Possible values are empty,
Debug
,Release
,RelWithDebInfo
andMinSizeRel
. This variable is only meaningful to single-configuration generators (such asMakefile Generators
andNinja
) i.e. those which choose a single configuration when CMake runs to generate a build tree as opposed to multi-configuration generators which offer selection of the build configuration within the generated build environment. There are many per-config properties and variables (usually following cleanSOME_VAR_<CONFIG>
order conventions), such asCMAKE_C_FLAGS_<CONFIG>
, specified as uppercase:CMAKE_C_FLAGS_[DEBUG|RELEASE|RELWITHDEBINFO|MINSIZEREL]
. For example, in a build tree configured to build typeDebug
, CMake will see to havingCMAKE_C_FLAGS_DEBUG
settings get added to theCMAKE_C_FLAGS
settings. See alsoCMAKE_CONFIGURATION_TYPES
.
I'm aware the differences between Debug
builds and Release
builds, but what are the differences between Release
, RelWithDebInfo
and MinSizeRel
? I'm guessing RelWithDebInfo
meant creating debuggable binaries, and MinSizeRel
meant creating smallest possible size binaries.
From the LLVM CMake page:
CMAKE_BUILD_TYPE:STRING
If you are using an IDE such as Visual Studio, you should use the IDE settings to set the build type. Be aware that Release and RelWithDebInfo use different optimization levels on most platforms.
If I want to generate a production build, should I choose Release
?
RelWithDebInfo is the same as Release, allowing you to have symbol files for debugging.
For example in Visual Studio, you'll have
.pdb
files and without them, it'll be hard to debug because all the signatures in the binary files are not going to be human readable and there's no way to map them to the source code.MinSizeRel is the same as Release, with its optimization configuration just set to Minimize size, Maximize speed in Visual Studio, for example.
Yes, that should do the right job for you. Debug/Release are the most commonly used options.
Reading this CMAKE FAQ will actually help you a lot.
Yes, you are correct:
RelWithDebInfo
will add compiler flags for generating debug information (the-g
flag for GCC / clang), and will result in debuggable, yet much larger binaries.MinSizeRel
will add compiler flags for generating more compact binaries (the-Os
flag for GCC / clang), possibly on the expense of program speed.Yes,
Release
would be a good choice. It should produce faster binaries, by specifying compiler optimization level for favoring speed (-O3
for GCC / clang), and not including debug symbols.