Cmake:针对multi-config cmake项目的特定配置特定设置

时间:2017-10-05 09:06:57

标签: c++ visual-studio-2015 cmake multi-configuration

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变量?

1 个答案:

答案 0 :(得分:5)

在CMake中,针对多配置构建工具的特定于配置的设置的常用方法是使用generator expressions

命令add_library允许对源文件使用生成器表达式。例如。这样:

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

在所有配置中创建一个由common.c组成的库,并在 Debug 配置中创建其他debug.c

add_definitions的文档没有注意到生成器表达式的使用,但是target_compile_definitions的文档却没有:

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