根据CMake中的构建类型设置选项默认值



我有一个项目,其中存在一堆配置选项,可用于通过设置预处理器标志来控制编译的源代码。其中一些使代码性能更好。

现在,如果构建类型设置为释放,我想默认启用CMake选项。

最小的例子:

cmake_minimum_required(VERSION 3.13)
project(foo)
option(FOO_OPT "Enabled by default when building with RELEASE" (OFF IF DEBUG / ON IF RELEASE)
message(STATUS "Value: ${FOO_OPT}")

现在,我希望得到以下输出:

$cmake path/to/source -DCMAKE_BUILD_TYPE=Release
[...]
-- Value: ON
[...]
$cmake path/to/source -DCMAKE_BUILD_TYPE=Debug
[...]
-- Value: OFF
[...]

如果我没记错的话,明确检查CMAKE_BUILD_TYPE是一个坏主意,应该避免(多配置生成器如vs-studio的问题)。

有什么建议的方法来处理这种情况吗?

您不能在不检查CMAKE_BUILD_TYPE的情况下设置该选项的默认值。

你可以给变量赋值一个生成器表达式,比如
$<IF:$<CONFIG:Release>,ON,OFF>

,但不能在if语句中使用此值,因为生成器表达式只在配置过程结束时展开。

相反,您可以定义一个附加值,其中表示一些特别的东西,并将此值设置为默认值:
# Declare a parameter with 3 possible values:
#   ON - the option is set,
#   OFF - the option is unset,
#   ReleaseOnly - the option is set only in Release build.
set(FOO_OPT "ReleaseOnly" CACHE STRING "Use foo feature (ON/OFF/ReleaseOnly)")
set_property(CACHE FOO_OPT PROPERTY STRINGS ON OFF ReleaseOnly)

当根据该参数生成编译器选项时,可以使用以下代码段:

# Prepare foo_compiler_opt variable according to FOO_OPT.
if(FOO_OPT STREQUAL "ReleaseOnly")
set(foo_compiler_opt "$<IF:$<CONFIG:Release>,--foo,--bar>")
elif (FOO_OPT)
set(foo_compiler_opt "--foo")
else ()
set(foo_compiler_opt "--bar")
endif()
# Use foo_compiler_opt in a place which allows a generator expression.
target_compile_options(mytarget PRIVATE ${foo_compiler_opt})

最新更新