在我的基于CMake的项目中,我的CMakeLists.txt中有一个变量,它启用了后端的目标。这个变量的有效值是有限的,比如说6.CMake变量的有效值有限
我想缓存一个有效值列表,以便用户可以选择启用哪个功能。 CMake应该验证变量。
这是可能的,如果是这样,如何?
在我的基于CMake的项目中,我的CMakeLists.txt中有一个变量,它启用了后端的目标。这个变量的有效值是有限的,比如说6.CMake变量的有效值有限
我想缓存一个有效值列表,以便用户可以选择启用哪个功能。 CMake应该验证变量。
这是可能的,如果是这样,如何?
如果您想验证允许的值,您需要自己在CMakeLists.txt
文件中执行该操作。但是,您可以为CMake提供一个值列表,将其作为CMake GUI应用程序中STRING缓存变量的组合框(以及ccmake中的基于ncurses的等效项)。您可以通过设置缓存变量的STRINGS属性来实现这一点。例如:
set(trafficLightColors Red Orange Green)
set(trafficLight Green CACHE STRING "Status of something")
set_property(CACHE trafficLight PROPERTY STRINGS ${trafficLightColors})
在该示例中,CMake的GUI将显示,就像任何其他字符串变量trafficLight
缓存变量,但如果用户点击它进行编辑,而不是一个普通的文本框,你会获取包含项目Red
,Orange
和Green
的组合框。
虽然这不是100%稳健的验证,但它确实可以帮助用户在使用GUI时只输入有效值。如果他们在命令行使用cmake,那么没有什么能够阻止他们将缓存变量设置为他们喜欢的任何值。所以我建议使用STRINGS缓存变量属性来帮助你的用户,但也要进行验证。如果您使用了上述示例的模式,则您将拥有有效值列表,因此验证应该很容易。例如:
list(FIND trafficLightColors ${trafficLight} index)
if(index EQUAL -1)
message(FATAL_ERROR "trafficLight must be one of ${trafficLightColors}")
endif()
或者,如果你使用CMake的3.5或更高版本:
if(NOT trafficLight IN_LIST trafficLightColors)
message(FATAL_ERROR "trafficLight must be one of ${trafficLightColors}")
endif()
尼斯的答案!有关同一主题的博客文章:https://blog.kitware.com/constraining-values-with-comboboxes-in-cmake-cmake-gui/ – DLRdave