[CMake] How to correctly default initialize CMAKE_BUILD_TYPE inside CMakeLists.txt

frodak17 frodak17 at gmail.com
Mon Jan 14 13:45:14 EST 2019


On Mon, Jan 14, 2019 at 1:09 PM Kim Walisch <kim.walisch at gmail.com> wrote:

> Based on feedback from Craig Scott I now use the following code:
>
> if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.9)
>          get_property(isMultiConfig GLOBAL PROPERTY
> GENERATOR_IS_MULTI_CONFIG)
> elseif(CMAKE_CONFIGURATION_TYPES)
>          set(isMultiConfig TRUE)
> endif()
>
> if(NOT isMultiConfig AND NOT CMAKE_BUILD_TYPE)
>         set(CMAKE_BUILD_TYPE Release CACHE STRING
>         "Choose the type of build, options are: None Debug Release
> RelWithDebInfo MinSizeRel." FORCE)
> endif()
>
> This code sets CMAKE_BUILD_TYPE only for single configuration generators
> (like GNU make or Ninja) because multi configuration generators (like Xcode
> or Visual Studio) generally ignore CMAKE_BUILD_TYPE. For an in depth
> explanation please refer to chapter 13 of Scott's excellent "Professional
> CMake" book (https://crascit.com/professional-cmake).
>
> Regards,
> Kim
>
>
There is nothing particularly wrong with setting CMAKE_BUILD_TYPE to
Release in a CMakeLists.txt except that then you can't use the default
settings of when it is not set.

In general a CMakeLists.txt that supports Multi-configuration generators
will use the generator expressions to determine the configuration type.  In
those cases CMAKE_BUILD_TYPE is not used and doesn't show up in any script.

Other scripts may check if CMAKE_BUILD_TYPE is set to enable additional
flags or add in special files and those scripts won't usually work as
expected with a multi-configuration generator because Debug / Release can
be chosen at build time.

If you have to work around something that is going to break because it
expects CMAKE_BUILD_TYPE to never be set then it won't work for single
configuration generators when the user sets CMAKE_BUILD_TYPE to Release.

Both types of generators are available for use when working with clang on
windows.

You never mentioned what part didn't work or what generator you are using,
but if only setting CMAKE_BUILD_TYPE when a single configuration generator
is used gets you past the problem then that works too.

Regards,
F
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20190114/d7fc8034/attachment.html>


More information about the CMake mailing list