Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add a custom build type to cmake ? (targeting make)

Tags:

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..."...

like image 341
Offirmo Avatar asked Jul 11 '12 17:07

Offirmo


People also ask

Why can’t I run a custom command in CMake?

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.

What is add_custom_target CMake?

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:

How does CMake create file-level dependencies?

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.

How do I add a custom target to a build target?

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 ).


1 Answers

Found the problem : there is a confusion between adding custom builds and custom configurations :

  • configurations are for special tools like Visual Studio or XCode
  • build types are a much rawer feature

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).

like image 76
Offirmo Avatar answered Oct 23 '22 09:10

Offirmo