mirror of
https://github.com/Kitware/CMake.git
synced 2026-08-09 17:18:18 +00:00
When a built-in cache variable is set via `-D <var>=<value>` with no help text supplied, populate `HELPSTRING` from the built-in documentation table (sourced from `Help/variable/*.rst` and the per-language pattern manuals). Project-defined and unknown variables continue to receive the legacy "No help, variable specified on the command line." sentinel. The cache entry's type and value are left untouched: type stays `UNINITIALIZED` for bare `-D` and an explicit `-D <var>:TYPE=<value>` is honored as before. The `cmCacheManager::LoadCache` path is not modified, so reload of existing caches is a fixed point. Fixes: #27830
137 lines
6.0 KiB
CMake
137 lines
6.0 KiB
CMake
# Inspects ${RunCMake_TEST_BINARY_DIR}/CMakeCache.txt and verifies that
|
|
# ``cmake::ProcessCacheArg`` installed the expected HELPSTRING (from the
|
|
# built-in documentation table) and preserved the cache entry's type
|
|
# and value verbatim.
|
|
#
|
|
# Each entry's HELPSTRING is serialized as zero or more ``//``-prefixed
|
|
# lines immediately preceding the ``KEY:TYPE=VALUE`` line.
|
|
|
|
set(_cache_file "${RunCMake_TEST_BINARY_DIR}/CMakeCache.txt")
|
|
if(NOT EXISTS "${_cache_file}")
|
|
set(RunCMake_TEST_FAILED "Missing cache file: ${_cache_file}")
|
|
return()
|
|
endif()
|
|
|
|
file(READ "${_cache_file}" _cache_text)
|
|
string(REGEX REPLACE "\r\n" "\n" _cache_text "${_cache_text}")
|
|
string(REPLACE ";" "\\;" _cache_text "${_cache_text}")
|
|
string(REPLACE "\n" ";" _cache_lines "${_cache_text}")
|
|
|
|
# Collect the contiguous run of ``//`` comment lines that immediately
|
|
# precedes ``${entry_key}:`` and join their bodies (everything after the
|
|
# leading ``//``) into a single string, one body per line. An entry
|
|
# preceded by no ``//`` lines yields the empty string.
|
|
function(_collect_help entry_key out_var)
|
|
set(_collected "")
|
|
set(_run "")
|
|
foreach(_line IN LISTS _cache_lines)
|
|
if(_line MATCHES "^//(.*)$")
|
|
string(APPEND _run "${CMAKE_MATCH_1}\n")
|
|
elseif(_line MATCHES "^${entry_key}:[A-Za-z]+=")
|
|
set(_collected "${_run}")
|
|
break()
|
|
else()
|
|
set(_run "")
|
|
endif()
|
|
endforeach()
|
|
set(${out_var} "${_collected}" PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# Find the ``${entry_key}:TYPE=VALUE`` line itself (the full type+value
|
|
# record, without the leading ``//`` help block). Sets ``out_var`` to
|
|
# the empty string if the entry is absent.
|
|
function(_find_entry_line entry_key out_var)
|
|
set(_found "")
|
|
foreach(_line IN LISTS _cache_lines)
|
|
if(_line MATCHES "^${entry_key}:[A-Za-z]+=")
|
|
set(_found "${_line}")
|
|
break()
|
|
endif()
|
|
endforeach()
|
|
set(${out_var} "${_found}" PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
if(test STREQUAL "DefineSetsTypeAndHelp")
|
|
# Bare ``-D CMAKE_COMPILE_WARNING_AS_ERROR=ON`` -- ProcessCacheArg
|
|
# must install the documentation-table summary as HELPSTRING and
|
|
# leave the entry typed UNINITIALIZED (the user did not pin a type).
|
|
_find_entry_line("CMAKE_COMPILE_WARNING_AS_ERROR" _line)
|
|
_collect_help("CMAKE_COMPILE_WARNING_AS_ERROR" _help)
|
|
if(NOT _line MATCHES "^CMAKE_COMPILE_WARNING_AS_ERROR:UNINITIALIZED=ON$")
|
|
set(RunCMake_TEST_FAILED
|
|
"ProcessCacheArg unexpectedly altered the bare -D entry's type "
|
|
"or value.\nRecovered entry line:\n[${_line}]")
|
|
elseif(NOT _help MATCHES "treat warnings on compile as errors")
|
|
set(RunCMake_TEST_FAILED
|
|
"ProcessCacheArg did not install HELPSTRING from documentation "
|
|
"table.\nRecovered help block:\n[${_help}]")
|
|
endif()
|
|
elseif(test STREQUAL "DefineTypePreserved")
|
|
# ``-D CMAKE_COMPILE_WARNING_AS_ERROR:STRING=ON`` -- the user's
|
|
# explicit ``:STRING`` annotation is honored; HELPSTRING is still
|
|
# populated from the table because the user supplied none.
|
|
_find_entry_line("CMAKE_COMPILE_WARNING_AS_ERROR" _line)
|
|
_collect_help("CMAKE_COMPILE_WARNING_AS_ERROR" _help)
|
|
if(NOT _line MATCHES "^CMAKE_COMPILE_WARNING_AS_ERROR:STRING=ON$")
|
|
set(RunCMake_TEST_FAILED
|
|
"ProcessCacheArg overwrote user's explicit :STRING type pin.\n"
|
|
"Recovered entry line:\n[${_line}]")
|
|
elseif(NOT _help MATCHES "treat warnings on compile as errors")
|
|
set(RunCMake_TEST_FAILED
|
|
"ProcessCacheArg did not install HELPSTRING when user pinned a "
|
|
"type.\nRecovered help block:\n[${_help}]")
|
|
endif()
|
|
elseif(test STREQUAL "DefineUnknownVarUninitialized")
|
|
# ``-D MY_CUSTOM_VAR_XYZZY=x`` -- a project-specific name absent from
|
|
# the documentation table. Type stays UNINITIALIZED and HELPSTRING
|
|
# falls back to the legacy sentinel.
|
|
_find_entry_line("MY_CUSTOM_VAR_XYZZY" _line)
|
|
_collect_help("MY_CUSTOM_VAR_XYZZY" _help)
|
|
if(NOT _line MATCHES "^MY_CUSTOM_VAR_XYZZY:UNINITIALIZED=x$")
|
|
set(RunCMake_TEST_FAILED
|
|
"ProcessCacheArg altered the unknown-variable entry.\n"
|
|
"Recovered entry line:\n[${_line}]")
|
|
elseif(NOT _help MATCHES "No help, variable specified on the command line")
|
|
set(RunCMake_TEST_FAILED
|
|
"ProcessCacheArg did not preserve sentinel HELPSTRING for unknown "
|
|
"variable.\nRecovered help block:\n[${_help}]")
|
|
endif()
|
|
elseif(test STREQUAL "PatternCxxClangTidy")
|
|
# ``-D CMAKE_CXX_CLANG_TIDY=clang-tidy`` -- no exact-match entry in
|
|
# ``cmCacheDocumentationTable``; the pattern table's
|
|
# ``CMAKE_<LANG>_CLANG_TIDY`` entry matches. ProcessCacheArg installs
|
|
# the pattern's Summary as HELPSTRING; type stays UNINITIALIZED.
|
|
_find_entry_line("CMAKE_CXX_CLANG_TIDY" _line)
|
|
_collect_help("CMAKE_CXX_CLANG_TIDY" _help)
|
|
if(NOT _line MATCHES "^CMAKE_CXX_CLANG_TIDY:UNINITIALIZED=clang-tidy$")
|
|
set(RunCMake_TEST_FAILED
|
|
"ProcessCacheArg unexpectedly altered the pattern-matched entry's "
|
|
"type or value.\nRecovered entry line:\n[${_line}]")
|
|
elseif(NOT _help MATCHES "clang-tidy command")
|
|
set(RunCMake_TEST_FAILED
|
|
"Pattern-table lookup did not install HELPSTRING from the "
|
|
"CMAKE_<LANG>_CLANG_TIDY pattern.\n"
|
|
"Recovered help block:\n[${_help}]")
|
|
endif()
|
|
elseif(test STREQUAL "PatternHipCppcheck")
|
|
# ``-D CMAKE_HIP_CPPCHECK=anything`` -- the matcher is intentionally
|
|
# permissive about ``<LANG>`` even though the cppcheck pattern's
|
|
# Summary names a C/CXX restriction. Assert the value is preserved
|
|
# verbatim, the type stays UNINITIALIZED, and the Summary's
|
|
# restriction phrase appears in the HELPSTRING.
|
|
_find_entry_line("CMAKE_HIP_CPPCHECK" _line)
|
|
_collect_help("CMAKE_HIP_CPPCHECK" _help)
|
|
if(NOT _line MATCHES "^CMAKE_HIP_CPPCHECK:UNINITIALIZED=anything$")
|
|
set(RunCMake_TEST_FAILED
|
|
"ProcessCacheArg unexpectedly altered the pattern-matched entry's "
|
|
"type or value.\nRecovered entry line:\n[${_line}]")
|
|
elseif(NOT _help MATCHES "C or CXX")
|
|
set(RunCMake_TEST_FAILED
|
|
"Pattern-table lookup did not surface the C/CXX restriction in "
|
|
"the HELPSTRING for CMAKE_HIP_CPPCHECK.\n"
|
|
"Recovered help block:\n[${_help}]")
|
|
endif()
|
|
else()
|
|
set(RunCMake_TEST_FAILED "Unknown test case: ${test}")
|
|
endif()
|