CMake-gui切换变量的可见性

时间:2014-04-23 08:19:08

标签: cmake

我有一个CMake设置,其中一个变量的可访问性将取决于是否设置了另一个变量。小片段:

option(build-compiler "Build the Nap Compiler" ON)
set(include_interrupt_dirs CACHE INTERNAL "interrupts/intr_4" FORCE)

if(build-compiler)
    option(enable-runtime-compilation 
           "Build in the runtime code compilation link in intr_2 & intr_3)" ON)
    if(enable-runtime-compilation)
        list(APPEND include_interrupt_dirs "interrupts/intr_2" "interrupts/intr_3" )
    endif()
endif()

我使用cmake-gui来配置项目,我想要实现的是:

  1. 如果用户选择build-compiler,则还应显示enable-runtime-compilation。这部分已经完成。
  2. 如果用户从GUI中取消选择build-compiler enable-runtime-compilation 隐藏。这不起作用。
  3. 你知道如何让它发挥作用吗?

2 个答案:

答案 0 :(得分:1)

您可以使用unset(var CACHE)从缓存中删除变量:

if(build-compiler)
    option(enable-runtime-compilation 
           "Build in the runtime code compilation link in intr_2 & intr_3)" ON)
    if(enable-runtime-compilation)
        list(APPEND include_interrupt_dirs "interrupts/intr_2" "interrupts/intr_3" )
    endif()
else()
    unset(enable-runtime-compilation CACHE)
endif()

答案 1 :(得分:0)

使用unset(var [CACHE])非常棘手。如果您只是取消设置变量,它将保留在缓存中(尽管脚本不可见,但用户仍然可以看到它)。如果你也从缓存中删除它,那么你将失去那里的值。

在我的用例中,我想根据某些条件隐藏变量。我发现从缓存中删除变量可能会让人感到困惑,因为在恢复时,它们会返回到默认状态而不是用户之前可能设置的状态。

我更喜欢使用mark_as_advanced(FORCE var)隐藏变量,并使用mark_as_advanced(CLEAR var)取消隐藏。它完全符合您的需要 - 它隐藏了GUI中的变量,但它仍然存在于缓存中。您可以将此与“soft”unset(没有CACHE的那个)一起使用,以确保隐藏变量仍未在配置中使用。

此外,还有CMakeDependentOption专门用于此用例(仅在某些条件集评估为true时才可用的选项)。从CMake 3.0.2开始,这显然是可用的。