2016-09-23 105 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