【问题标题】:CMake variable with limited valid values具有有限有效值的 CMake 变量
【发布时间】:2016-09-23 23:21:10
【问题描述】:

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

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

这可能吗?如果可以,怎么做?

【问题讨论】:

    标签: build cmake


    【解决方案1】:

    如果您想验证允许的值,您需要自己在您的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()
    

    【讨论】:

    猜你喜欢
    • 2016-04-02
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2018-09-03
    相关资源
    最近更新 更多