Check*: Restore toleration of false-like requirements

Commit 7644d557df (Check*: Refactor variable handling, 2026-07-20,
v4.4.1~12^2~1) introduced a subtle regression in the handling of
`CMAKE_REQUIRED_LINK_OPTIONS` and `CMAKE_REQUIRED_LIBRARIES` which
resulted in an error if these were set to a 'false-like' value. This
could happen, for example, if the user passes `<name>_LIBS`, which
happens to have the value `<name>-NOTFOUND`. Previously, such values
would be ignored.

Fix it by separately checking for user- or module-provided link options
or link libraries. (We were already doing this for the other variables
used to propagate requirements into checks.)

Fixes: #28026
This commit is contained in:
Matthew Woehlke
2026-08-07 14:14:52 -04:00
parent d657ecc4ea
commit 3209535fb3
2 changed files with 44 additions and 28 deletions
+6 -2
View File
@@ -60,18 +60,22 @@ macro(CMAKE_CHECK_COMMON_INIT_INCLUDE_DIRECTORIES _PREFIX)
endmacro()
macro(CMAKE_CHECK_COMMON_INIT_LINK_OPTIONS _PREFIX)
if(CMAKE_REQUIRED_LINK_OPTIONS OR ${ARGC} GREATER 1)
if(CMAKE_REQUIRED_LINK_OPTIONS)
set(${_PREFIX}_ADD_LINK_OPTIONS
LINK_OPTIONS ${ARGN} ${CMAKE_REQUIRED_LINK_OPTIONS})
elseif(${ARGC} GREATER 1)
set(${_PREFIX}_ADD_LINK_OPTIONS LINK_OPTIONS ${ARGN})
else()
set(${_PREFIX}_ADD_LINK_OPTIONS)
endif()
endmacro()
macro(CMAKE_CHECK_COMMON_INIT_LINK_LIBRARIES _PREFIX)
if(CMAKE_REQUIRED_LIBRARIES OR ${ARGC} GREATER 1)
if(CMAKE_REQUIRED_LIBRARIES)
set(${_PREFIX}_ADD_LINK_LIBRARIES
LINK_LIBRARIES ${ARGN} ${CMAKE_REQUIRED_LIBRARIES})
elseif(${ARGC} GREATER 1)
set(${_PREFIX}_ADD_LINK_LIBRARIES LINK_LIBRARIES ${ARGN})
else()
set(${_PREFIX}_ADD_LINK_LIBRARIES)
endif()
@@ -15,30 +15,42 @@ include(CheckLibraryExists)
include(CheckPrototypeDefinition)
include(CheckTypeSize)
check_function_exists(required_flag_function CHECK_FUNCTION_EXISTS_RESULT)
check_include_file(CheckRequiredFlags.h CHECK_INCLUDE_FILE_RESULT)
check_include_file_cxx(CheckRequiredFlags.h CHECK_INCLUDE_FILE_CXX_RESULT)
check_include_files("stddef.h;CheckRequiredFlags.h" CHECK_INCLUDE_FILES_RESULT)
check_library_exists("" required_flag_library "" CHECK_LIBRARY_EXISTS_RESULT)
check_prototype_definition(
required_flag_prototype
"int required_flag_prototype(int value)"
"value"
"CheckRequiredFlags.h"
CHECK_PROTOTYPE_DEFINITION_RESULT
)
check_type_size(required_flag_type CHECK_TYPE_SIZE_RESULT)
foreach(result IN ITEMS
CHECK_FUNCTION_EXISTS_RESULT
CHECK_INCLUDE_FILE_RESULT
CHECK_INCLUDE_FILE_CXX_RESULT
CHECK_INCLUDE_FILES_RESULT
CHECK_LIBRARY_EXISTS_RESULT
CHECK_PROTOTYPE_DEFINITION_RESULT
CHECK_TYPE_SIZE_RESULT
)
if(NOT ${result})
message(SEND_ERROR "${result} did not honor CMAKE_REQUIRED_FLAGS")
function(run_tests)
if(${ARGC} GREATER 1)
set(${ARGN})
endif()
endforeach()
check_function_exists(required_flag_function CHECK_FUNCTION_EXISTS_RESULT)
check_include_file(CheckRequiredFlags.h CHECK_INCLUDE_FILE_RESULT)
check_include_file_cxx(CheckRequiredFlags.h CHECK_INCLUDE_FILE_CXX_RESULT)
check_include_files("stddef.h;CheckRequiredFlags.h" CHECK_INCLUDE_FILES_RESULT)
check_library_exists("" required_flag_library "" CHECK_LIBRARY_EXISTS_RESULT)
check_prototype_definition(
required_flag_prototype
"int required_flag_prototype(int value)"
"value"
"CheckRequiredFlags.h"
CHECK_PROTOTYPE_DEFINITION_RESULT
)
check_type_size(required_flag_type CHECK_TYPE_SIZE_RESULT)
foreach(result IN ITEMS
CHECK_FUNCTION_EXISTS_RESULT
CHECK_INCLUDE_FILE_RESULT
CHECK_INCLUDE_FILE_CXX_RESULT
CHECK_INCLUDE_FILES_RESULT
CHECK_LIBRARY_EXISTS_RESULT
CHECK_PROTOTYPE_DEFINITION_RESULT
CHECK_TYPE_SIZE_RESULT
)
if(NOT ${result})
message(SEND_ERROR "${result} did not honor CMAKE_REQUIRED_FLAGS")
endif()
unset(CACHE{${result}})
endforeach()
unset(CACHE{HAVE_CHECK_TYPE_SIZE_RESULT})
endfunction()
run_tests()
run_tests(CMAKE_REQUIRED_LINK_OPTIONS REQUIRED-NOTFOUND)
run_tests(CMAKE_REQUIRED_LIBRARIES REQUIRED-NOTFOUND)