鉴于以下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:有人可以解释当前的行为吗?我不明白为什么缓存以用户设置值结束,脚本以脚本设置值结束。
答案 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。