Cmake: Определите специфические настройки конфигурации для проекта мультиконфигурации cmake

Cmake новичок здесь, в настоящее время я пытаюсь преобразовать проект cmake, который был разработан только с одной конфигурацией, в проект с несколькими конфигурациями, который может генерировать файлы Visual Studio.

Моя проблема, которую я не могу решить, состоит в том, что в проекте cmake существует логика, зависящая от переменной CMAKE_BUILD_TYPE, такая как:

set(ENABLE_DEBUG TRUE)
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
set(ENABLE_DEBUG FALSE)
)

Так как для мультиконфигурированного cmake CMAKE_BUILD_TYPE пуст, этот способ не работает. Затем переменная ENABLE_DEBUG находится в проекте cmake и используется для таких вещей, как:

Случай 1: Добавление библиотек только для отладки конфигурации

if(ENABLE_DEBUG)
list(APPEND LIB_SRC src/lib_debug.cpp)
endif()
add_library(LIB OBJECT LIB_SRC)

Случай 2: Добавление флагов препроцессора только в отладочный конфиг

if(ENABLE_DEBUG)
add_definitions(...)
endif()

Поэтому меня интересует, есть ли у кого-нибудь обходной путь для одного или обоих описанных выше случаев, который бы работал для мультиконфигурированных проектов cmake, т. Е. Чтобы я мог указывать добавления библиотеки и флаги препроцессора, не завися от переменной CMAKE_BUILD_TYPE. Или даже лучше, если есть специальный способ установки ENABLE_DEBUG без зависимости от переменной CMAKE_BUILD_TYPE?

5

Решение

В CMake используется общий способ настройки конкретных настроек для инструментов построения нескольких конфигураций. генератор выражений.

команда add_library позволяет использовать выражения генератора для исходных файлов. Например. этот:

add_library(mylib common.c $<$<CONFIG:DEBUG>:debug.c>)

создает библиотеку, состоящую из common.c во всей конфигурации плюс дополнительные debug.c в отлаживать конфигурации.

Документация для add_definitions не отмечает использование выражений генератора, но документацию для target_compile_definitions делает:

target_compile_definitions(mylib PUBLIC $<$<CONFIG:DEBUG>:-DDEBUG_VAR>)
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]