【发布时间】:2016-09-23 23:21:10
【问题描述】:
在我的基于 CMake 的项目中,我的 CMakeLists.txt 中有一个变量,可以启用目标后端。这个变量的有效值是有限的,比如 6。
我想缓存一个有效值列表,以便用户可以选择要启用的功能。 CMake 应该验证变量。
这可能吗?如果可以,怎么做?
【问题讨论】:
在我的基于 CMake 的项目中,我的 CMakeLists.txt 中有一个变量,可以启用目标后端。这个变量的有效值是有限的,比如 6。
我想缓存一个有效值列表,以便用户可以选择要启用的功能。 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()
【讨论】: