我有一个项目,其中存在一堆配置选项,可用于通过设置预处理器标志来控制编译的源代码。其中一些使代码性能更好。
现在,如果构建类型设置为释放,我想默认启用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})