cmake中的默认选项设置

时间:2017-11-07 18:33:30

标签: cmake

鉴于以下cmake:

BUILD_TOOLS : OFF

然后使用ccmake打开BUILD_SERVER,然后配置,然后手动将BUILD_TOOLS重新打开然后配置/生成。我得到BUILD_TOOLS:BOOL=ON,但是在CMakeCache.txt event

我有两个问题。如果这些似乎微不足道,请道歉。尽管阅读了各种解释,但我还没有很好地掌握缓存变量在cmake中的工作方式。

1:如果BUILD_SERVER设置为ON,我希望的行为是关闭BUILD_TOOLS,但允许手动更改它。这可能吗?我猜它可能不是因为它不像我在BUILD_SERVER更改时可以捕获的man find

2:有人可以解释当前的行为吗?我不明白为什么缓存以用户设置值结束,脚本以脚本设置值结束。

1 个答案:

答案 0 :(得分:2)

  

有人可以解释当前的行为吗?

命令

set (BUILD_TOOLS OFF)

设置非缓存变量,但CMakeCache.txt包含(和ccmake显示)缓存一个。

实际上,您当前的代码是正确的,在设置变量后,它使用非缓存版本运行。因此,如果您不关心用户可见(缓存)变量,则无需更改任何内容。

  

如果BUILD_SERVER设置为ON

,我希望的行为是关闭BUILD_TOOLS

如果要在代码中更改缓存变量,请使用set(... CACHE ... FORCE)命令流:

if (BUILD_SERVER)
    if(BUILD_TOOLS) # Additional check for not-showing warning message to the user.
        message("WARNING: Set BUILD_TOOLS option to OFF because BUILD_SERVER is ON")
        set (BUILD_TOOLS OFF CACHE BOOL "" FORCE)
    endif()
endif()
  

...但随后允许手动更改。

上面的代码允许用户在BUILD_TOOLS设置为TRUE时将BUILD_SERVER变量设置为TRUE事件。但BUILD_TOOLS将在下一次cmake运行时重置。

如果要在BUILD_TOOLS变为ON时恢复BUILD_SERVER变量的值,则需要存储此值。下面的代码使用缓存条目BUILD_TOOLS_SHADOW来存储该值。因为此条目是INTERNAL,它不会向用户显示。

if (BUILD_SERVER)
    if(BUILD_TOOLS) # Additional check for not-showing warning message to the user.
        message("WARNING: Set BUILD_TOOLS option to OFF because BUILD_SERVER is TRUE")
        # Forcibly clear BUILD_TOOLS variable, but store its value in shadow one.
        set (BUILD_TOOLS OFF CACHE BOOL "" FORCE)
        set (BUILD_TOOLS_SHADOW ${BUILD_TOOLS} CACHE INTERNAL "")
    endif()
else()
  if(BUILD_TOOLS_SHADOW)
     # Restore BUILD_TOOLS variable from shadow copy, and remove that copy.
     set (BUILD_TOOLS ${BUILD_TOOLS_SHADOW} CACHE BOOL "" FORCE)
     unset (BUILD_TOOLS_SHADOW CACHE)
  endif()
endif()

代码变得更难理解,实际上它有一些意想不到的效果。例如,如果在BUILD_TOOLS变为ON时BUILD_SERVER为ON,则用户无法将“影子副本”更改为FALSE值。但这只是因为你的要求

但是如果你真的想维护关于选项依赖性的非简单逻辑,你可以查看CMake模块CMakeDependentOption