【问题标题】:Set option default value based on build type in CMake根据 CMake 中的构建类型设置选项默认值
【发布时间】:2021-03-10 19:16:02
【问题描述】:

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

现在,如果构建类型设置为发布,我想默认启用 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


    【解决方案1】:

    如果不检查,您可能无法根据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)
    

    根据该参数生成编译器选项时,可以使用如下sn-p:

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

    【讨论】:

    • 抱歉回复晚了,但这解决了我的问题,非常感谢
    猜你喜欢
    • 2015-09-27
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多