Как добавить собственный тип сборки в cmake? (таргетинг)

Я пытаюсь добавить пользовательский тип сборки для моей сборки cmake, ориентированный на покрытие кода.

Я нашел запись часто задаваемых вопросов об этом: https://gitlab.kitware.com/cmake/community/wikis/FAQ#how-can-i-specify-my-own-configurations-for-generators-that-allow-it-

Однако я не могу заставить это работать.

Вот мой код, использующий 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()

И я получаю "XXX пользовательских типов сборки не допускаются..."...

Ответы

Ответ 1

Обнаружена проблема: существует путаница между добавлением пользовательских сборок и пользовательских конфигураций :

  • конфигурации предназначены для специальных инструментов, таких как Visual Studio или XCode
  • типы сборки - гораздо более простая функция

Поэтому для добавления пользовательского типа сборки совсем не нужно манипулировать переменной CMAKE_CONFIGURATION_TYPES. Просто установите соответствующие переменные и начните использовать их, как объясняет 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 )

Мы также можем захотеть обновить строку справки (наряду с , между прочим, установив тип сборки по умолчанию):

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}")

Небольшое предупреждение о попытке наследовать параметры по умолчанию от другого типа сборки:

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 )

Это плохая идея, потому что дополнительные параметры продолжают добавляться каждый раз, когда конфигурация поступает снова (каждый раз, когда вы что-то меняете в ней).