'How can cmake detect misspelled variable names on command line?

My CMakeLists.txt can take variables and values when the user specifies them on the command line in the usual form -Dname=value. E.g.

% cmake -DmyVariable=someValue ..

How can CMakeLists.txt detect variables that aren’t actually relevant, e.g. in case the user mispells them:

% cmake -Dmyxvarble=someValue ..

For example, can CMakeLists.txt process each defined variable on the command line sequentially, thereby spotting misspelled variable names?

I’m running cmake version 3.18.0-rc2. Thanks!



Solution 1:[1]

You could query the cache entries of the toplevel dir and match against patterns of expected entries. Note though that this is not easy to maintain, since functionality like find_package relies on cache variables.

set(CACHE_VARIABLE_WHITELIST
    MyProject_BINARY_DIR
    MyProject_IS_TOP_LEVEL
    MyProject_SOURCE_DIR
    ...
)

get_directory_property(CACHE_VARS DIRECTORY ${CMAKE_SOURCE_DIR} CACHE_VARIABLES)

foreach(CACHE_VAR IN LISTS CACHE_VARS)
    # fatal error for any non-advanced cache variable
    # not in the whitelist and not starting with CMAKE_
    get_property(IS_ADVANCED CACHE ${CACHE_VAR} PROPERTY ADVANCED)
    if (NOT IS_ADVANCED AND NOT CACHE_VAR MATCHES "^CMAKE_.*" AND NOT CACHE_VAR IN_LIST CACHE_VARIABLE_WHITELIST)
        message(FATAL_ERROR "Unexpected cache variable set: ${CACHE_VAR}")
    endif()
endforeach()

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 fabian