ChatGPT解决这个技术问题 Extra ChatGPT

How to change the build type to Release mode in cmake?

I am trying to build a project in Release mode. By default it is built in debug mode. I am setting the variable CMAKE_BUILD_TYPE to "Release" in CMakeLists.txt. But it is still building the project in debug mode. When I pass "Release" as the build type in the CMake command, it still does not work.

The CMake command that I am using is:

cmake -G"Visual Studio 10" -DCMAKE_BUILD_TYPE=Release
  -H"source_path" -B"Build path"

Please provide a solution if any.

try using cmake -DCMAKE_BUILD_TYPE=Release -H"soruce_path" -B"Buidl path" -G"Visual Studio 10"
It is giving the same result. It is Building the project in Debug mode only.
CMAKE_CONFIGURATION_TYPES Specifies the available build types. This specifies what build types will be available such as Debug, Release, RelWithDebInfo etc. This has reasonable defaults on most platforms. But can be extended to provide other build types. See also CMAKE_BUILD_TYPE.
CMAKE_BUILD_TYPE Specifies the build type for make based generators. This specifies what build type will be built in this tree. Possible values are empty, Debug, Release, RelWithDebInfo and Min- SizeRel. This variable is only supported for make based generators. If this variable is supported, then CMake will also provide initial values for the variables with the name CMAKE_C_FLAGS_[Debug|Release|RelWithDebInfo|MinSizeRel]. For example, if CMAKE_BUILD_TYPE is Debug, then CMAKE_C_FLAGS_DEBUG will be added to the CMAKE_C_FLAGS.
you can play around with these two options if either of them works

e
emlai

To change the build type, on Windows, it must be done at build time:

cmake --build {DIR} --config Release

By default it's Debug. I'm still looking for a way of changing this default. CMAKE_BUILD_TYPE doesn't work of course, and tweaking CMAKE_CONFIGURATION_TYPES doesn't work either, obviously for the same reason, they only apply for Unix makefiles, not for Visual projects.


You are not changing configuration build type, you are building Release configuration of project. Though the answer is right, +1
CMAKE_CONFIGURATION_TYPES doesn't work either CMAKE_CONFIGURATION_TYPES variable controls build configurations for current project (take a look at solution configurations of visual studio project). See comments above.
This works for me. Additionally, when I want to do an install I do cmake --build . --config Release --target install. Then cmake works it's magic!
@PfunnyGuy that’s super helpful, tho I wonder why cmake --install . doesn’t work the same way with the VS generator.
M
Maks

I checked it with Visual Studio 2015 and cmake 3.3 .

Short answer

Link

cmake --build {BUILD_DIR_PATH} --target ALL_BUILD --config {BUILD_TYPE}

Example

cmake --build . --target ALL_BUILD --config Release

Long answer

cmake -G{GENERATOR_NAME} -B{BUILD_DIR_PATH} -H{SOURCE_DIR_PATH}

cmake --build {BUILD_DIR_PATH} --target ALL_BUILD --config {BUILD_TYPE}

Example

cmake -GVisual Studio 14 -Bbuild/win32/x86 -H.    

cmake --build build/win32/x86 --target ALL_BUILD --config Release

Additional info

"-G" - specifies the generator name

"-B" - specifies path to the build folder

"-H" - specifies path to the source folder


--config Release doesn't work for me. Only -DCMAKE_CONFIGURATION_TYPES=Release works.
ALL_BUILD affects all targets that are depending on the project. I would prefer not touching it. What if you are working on your project but want to build its dependencies in release mode? This is a perfectly find and common example.
S
Smi

You cannot set the default build type for Visual Studio from the command line.

CMake's Visual Studio Generators will generate the four standard profiles (Debug, RelWithDebInfo, MinSizeRel and Release) and you have to choose the one you want to build from within VS. This is because the information about the active configuration is not part of the project files generated by CMake, but part of the .suo file generated by VS.

If you want an automated build of a particular configuration, use MSBuild instead of VS which allows you to specify a configuration on the command line.


Then what is the use of CMAKE_BUILD_TYPE.
@123r789 It is used for example for Makefile generators which only allow one profile at the time. IDE generators like VS generate multiple profiles at once and allow choosing one from the IDE. With Makefiles you only ever have one profile so the choice must be made at CMake configure time. The documentation also points this out explicitly: This variable [CMAKE_BUILD_TYPE] is only supported for make based generators.
It is simply not true. Cmake is pretty flexible of what could be changed in the default behavior.
@ixSci Your solution does not change the default, it completely removes any configurations besides the Release. I would argue that's a bit harsh for this kind of problem. I also disagree with the -1 (not implying that it was you) as the central argument of my answer is still valid: the information about the active configuration is not part of the project files generated by CMake, but part of the .suo file generated by VS.
I switch build type frequently. I can't see how it's convenient to only have one type either - you're removing useful functionality. This is the correct answer to the OP's question IMHO.
L
Louis Langholtz

Tried the things below which worked for me to build the binaries in release/debug mode in Windows.

Added the following line in the root CMakeLists.txt file, just above the project command:

SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE} CACHE STRING "" FORCE)

Used the following command for setting the release mode configuration:

cmake -DCMAKE_BUILD_TYPE=Release .. 

Used this command to build the same in Release mode:

cmake --build . --config Release

You can repeat the same procedure for debug mode as well, it works.


a
aalpatya

Bit late, but I found this worked for me and was quite clean: This means that just calling cmake builds in release mode, but if you want debug mode just call cmake -DCMAKE_BUILD_TYPE=Debug

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose Release or Debug" FORCE)
endif()

i
ixSci

Use it as you do it but in the root cmake file add the following before the project keyword

SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE} CACHE STRING "" FORCE)
PROJECT(MY_PROJECT)#It's here just to show where you should add it.

I think this would be a very unexpected way to go about setting the build type for those used to Visual Studio. While it does work, I certainly wouldn't recommend this method.
@Fraser, any arguments?
My main argument is that this is an unusual technique. If it's used in a private project where nobody except the author is expected to have to run CMake, then cool. If I had to use this, it would be surprising initially that there is only one build type. Once I saw the reason, it would become slightly annoying, since you're not actually trying to disable other build types; you're just forcing multi-config users to have to work as if they were single-config users.
I'm not deciding it's usual - it's an observation having seen the way that many other projects work. I can point to several projects which don't do this. I don't know of a single one which does. And for me, it's a lot easier to do 2 clicks in my IDE to change build types than open a command prompt, navigate to my build root, then type cmake . -DCMAKE_BUILD_TYPE=Release. Neither is hard, but I'd choose the easier way every time.
Let's not forget you are relying on undocumented behavior here. CMake does only guarantee that CMAKE_BUILD_TYPE does the right thing for make based generators. Your solution might suddenly stop working with any future CMake version.