Search code examples
cmake

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


I'm trying to add a custom build type for my CMake configuration targeting code coverage.

The method I've tried so far is from the FAQ entry about it in the CMake wiki site. 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..."...


Solution

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