2016-09-23 58 views
4

在我的基于CMake的项目中,我的CMakeLists.txt中有一个变量,它启用了后端的目标。这个变量的有效值是有限的,比如说6.CMake变量的有效值有限

我想缓存一个有效值列表,以便用户可以选择启用哪个功能。 CMake应该验证变量。

这是可能的,如果是这样,如何?

回答

4

如果您想验证允许的值,您需要自己在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缓存变量,但如果用户点击它进行编辑,而不是一个普通的文本框,你会获取包含项目RedOrangeGreen的组合框。

虽然这不是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() 
+0

尼斯的答案!有关同一主题的博客文章:https://blog.kitware.com/constraining-values-with-comboboxes-in-cmake-cmake-gui/ – DLRdave