I'm trying to add a custom build type for my cmake build, targetted at code coverage.
I've found the FAQ entry about it : https://gitlab.kitware.com/cmake/community/wikis/FAQ#how-can-i-specify-my-own-configurations-for-generators-that-allow-it-
However, I can't make it work.
Here is my code, using cmake 2.8.5 :
message("* Adding build types...") if(CMAKE_CONFIGURATION_TYPES) list(APPEND CMAKE_CONFIGURATION_TYPES CodeCoverage) list(REMOVE_DUPLICATES CMAKE_CONFIGURATION_TYPES) set(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING "Add the configurations that we need" FORCE) message(" Available build types are now : ${CMAKE_CONFIGURATION_TYPES}") else() message(" XXX custom build types are not allowed...") endif()
And I get "XXX custom build types are not allowed..."...
Because in CMake we build targets. Since there was not a defined target, the custom command will not be executed. So, we have to create a custom target and create a dependency between our custom target and our custom command: So, learned lesson: to run a custom command, a custom target must depend on it.
The add_custom_target CMake macro As the documentation says, this macro "Adds a target with the given name that executes the given commands". So, you can create a CMake target that will execute a command. Imagine we have the following CMakeLists.txt file:
Otherwise, a file-level dependency is created on that path relative to the current binary directory. If any dependency is an OUTPUT of another custom command in the same directory ( CMakeLists.txt file), CMake automatically brings the other custom command into the target in which this command is built.
By default nothing depends on the custom target. Use the add_dependencies () command to add dependencies to or from other targets. Indicate that this target should be added to the default build target so that it will be run every time (the command cannot be called ALL ).
Found the problem : there is a confusion between adding custom builds and custom configurations :
So to add a custom build type, there is no need to manipulate the CMAKE_CONFIGURATION_TYPES variable at all. Just set the corresponding variables and start using it, as explained :
SET(GCC_DEBUG_FLAGS "-g -Wall") # Add new build types message("* Adding build types...") SET(CMAKE_CXX_FLAGS_COVERAGE "${GCC_DEBUG_FLAGS} -fprofile-arcs -ftest-coverage" CACHE STRING "Flags used by the C++ compiler during coverage builds." FORCE ) SET(CMAKE_C_FLAGS_COVERAGE "${GCC_DEBUG_FLAGS} -fprofile-arcs -ftest-coverage" CACHE STRING "Flags used by the C compiler during coverage builds." FORCE ) SET(CMAKE_EXE_LINKER_FLAGS_COVERAGE "" CACHE STRING "Flags used for linking binaries during coverage builds." FORCE ) SET(CMAKE_SHARED_LINKER_FLAGS_COVERAGE "" CACHE STRING "Flags used by the shared libraries linker during coverage builds." FORCE ) MARK_AS_ADVANCED( CMAKE_CXX_FLAGS_COVERAGE CMAKE_C_FLAGS_COVERAGE CMAKE_EXE_LINKER_FLAGS_COVERAGE CMAKE_SHARED_LINKER_FLAGS_COVERAGE )
We may also want to udate the help string (along with setting the default build type by the way) :
IF(NOT CMAKE_BUILD_TYPE) SET(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build : None Debug Release RelWithDebInfo MinSizeRel Coverage." FORCE) ENDIF(NOT CMAKE_BUILD_TYPE) message("* Current build type is : ${CMAKE_BUILD_TYPE}")
A bit of warning about trying to inherit default options from another build type doing this :
SET(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage" CACHE STRING "Flags used by the C++ compiler during coverage builds." FORCE )
This is a bad idea because the extra options keep being appended every time the config is sourced again (every time you change something in it).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With