在我的基於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