Reputation:
In the following CMake code snippet, I am confused by the if elseif check. My understanding is that BL will always be "Ei", so there is no need to check other values. Are there any scenarios where BL could be overwritten by something else? I am new to CMake so need some help here.
set(BL "Ei" CACHE STRING "library")
set_property(CACHE BL PROPERTY STRINGS "Ei;AT;Op")
message(STATUS "The backend of choice:" ${BL})
if(BL STREQUAL "Ei")
...
elseif(BL STREQUAL "AT")
...
elseif(BL STREQUAL "Op")
...
else()
message(FATAL_ERROR "Unrecognized option:" ${BL})
endif()
Upvotes: 1
Views: 2179
Reputation: 3103
The code set(BL "Ei" CACHE STRING "library")
defines a CMake cache variable. However, without a FORCE
option in the set
statement, that means that it will not be overwritten if the variable was previously defined in the cache.
One way for a user to set a different value for BL
would be on the cmake
command line. For example: cmake ../sourcedir -DBL:STRING=AT
By entering the variable in the cache as type STRING
(as opposed to type INTERNAL
) that also makes the variable available to be configured in cmake-gui
or in ccmake
. (Furthermore, the set_property(... STRINGS ...)
directive tells cmake-gui
to produce a drop-down list containing Ei
, AT
, and Op
to select from. However, this isn't enforced for setting the variable from the command line, which is why it's still a good idea to have the default case signalling an error.)
See the section "Set Cache Entry" under CMake's documentation for set
for more information.
Upvotes: 1