mirror of
https://gitlab.kitware.com/cmake/cmake.git
synced 2026-09-25 04:09:36 +03:00
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
124 lines
4.5 KiB
CMake
124 lines
4.5 KiB
CMake
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
# file LICENSE.rst or https://cmake.org/licensing for details.
|
|
|
|
|
|
# Do NOT include this module directly into any of your code. It is meant as
|
|
# a library for Check*CompilerFlag.cmake and Check*LinkerFlag.cma modules.
|
|
# It's content may change in any way between releases.
|
|
|
|
include_guard(GLOBAL)
|
|
|
|
macro(CMAKE_CHECK_COMMON_INIT_COMPILE_FLAGS _PREFIX)
|
|
set(${_PREFIX}_EXTRA_CMAKE_ARGUMENTS)
|
|
string(REPLACE "\\;" "\\\\;" CMAKE_REQUIRED_FLAGS
|
|
"${CMAKE_REQUIRED_FLAGS}")
|
|
#[[
|
|
cmake_polify(GET CMP0999 ${_PREFIX}_CMP0999)
|
|
if(${_PREFIX}_CMP0999 STREQUAL "NEW")
|
|
# Join multiple list arguments into the space-separated string that we
|
|
# want. This ensures that the entirety of the value gets passed as
|
|
# compile arguments, which is what the user almost surely intended.
|
|
#
|
|
# FIXME(#27901): This needs a policy to be implemented. This will be
|
|
# available in a future version of CMake.
|
|
list(JOIN CMAKE_REQUIRED_FLAGS " " CMAKE_REQUIRED_FLAGS)
|
|
else()
|
|
#]]
|
|
# If CMAKE_REQUIRED_FLAGS contains an unescaped semicolon, anything after
|
|
# gets passed as flags to 'cmake' itself. This is probably not intended,
|
|
# but we preserve it for compatibility.
|
|
set(${_PREFIX}_EXTRA_CMAKE_ARGUMENTS "${CMAKE_REQUIRED_FLAGS}")
|
|
list(POP_FRONT ${_PREFIX}_EXTRA_CMAKE_ARGUMENTS CMAKE_REQUIRED_FLAGS)
|
|
if(NOT ${_PREFIX}_EXTRA_CMAKE_ARGUMENTS STREQUAL "")
|
|
# cmake_policy(ISSUE_WARNING CMP0999) TODO
|
|
# There are known instances of users accidentally passing '-W' arguments
|
|
# intended for the compiler as arguments to CMake. Since CMake complains
|
|
# about unknown '-W' arguments starting with CMake 4.4, we need to strip
|
|
# these for compatibility.
|
|
string(REPLACE "\\;" "\\\\;" ${_PREFIX}_EXTRA_CMAKE_ARGUMENTS
|
|
"${${_PREFIX}_EXTRA_CMAKE_ARGUMENTS}")
|
|
list(FILTER ${_PREFIX}_EXTRA_CMAKE_ARGUMENTS EXCLUDE REGEX "^-W")
|
|
endif()
|
|
#endif()
|
|
endmacro()
|
|
|
|
macro(CMAKE_CHECK_COMMON_INIT_INCLUDE_DIRECTORIES _PREFIX)
|
|
if(CMAKE_REQUIRED_INCLUDES)
|
|
if(${ARGC} GREATER 1)
|
|
set(${_PREFIX}_INCLUDE_DIRECTORIES
|
|
"-DINCLUDE_DIRECTORIES:STRING=${ARGN};${CMAKE_REQUIRED_INCLUDES}")
|
|
else()
|
|
set(${_PREFIX}_INCLUDE_DIRECTORIES
|
|
"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
|
|
endif()
|
|
elseif(${ARGC} GREATER 1)
|
|
set(${_PREFIX}_INCLUDE_DIRECTORIES
|
|
"-DINCLUDE_DIRECTORIES:STRING=${ARGN}")
|
|
else()
|
|
set(${_PREFIX}_INCLUDE_DIRECTORIES)
|
|
endif()
|
|
endmacro()
|
|
|
|
macro(CMAKE_CHECK_COMMON_INIT_LINK_OPTIONS _PREFIX)
|
|
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)
|
|
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()
|
|
endmacro()
|
|
|
|
macro(CMAKE_CHECK_COMMON_INIT_LINK_DIRECTORIES _PREFIX)
|
|
if(CMAKE_REQUIRED_LINK_DIRECTORIES)
|
|
if(${ARGC} GREATER 1)
|
|
set(${_PREFIX}_LINK_DIRECTORIES
|
|
"-DLINK_DIRECTORIES:STRING=${ARGN};${CMAKE_REQUIRED_LINK_DIRECTORIES}")
|
|
else()
|
|
set(${_PREFIX}_LINK_DIRECTORIES
|
|
"-DLINK_DIRECTORIES:STRING=${CMAKE_REQUIRED_LINK_DIRECTORIES}")
|
|
endif()
|
|
elseif(${ARGC} GREATER 1)
|
|
set(${_PREFIX}_LINK_DIRECTORIES
|
|
"-DLINK_DIRECTORIES:STRING=${ARGN}")
|
|
else()
|
|
set(${_PREFIX}_LINK_DIRECTORIES)
|
|
endif()
|
|
endmacro()
|
|
|
|
macro(CMAKE_CHECK_COMMON_INIT_COMPILE_ARGS _PREFIX)
|
|
cmake_check_common_init_compile_flags(${_PREFIX})
|
|
cmake_check_common_init_include_directories(${_PREFIX})
|
|
endmacro()
|
|
|
|
macro(CMAKE_CHECK_COMMON_INIT_LINK_ARGS _PREFIX)
|
|
cmake_check_common_init_link_options(${_PREFIX})
|
|
cmake_check_common_init_link_libraries(${_PREFIX})
|
|
cmake_check_common_init_link_directories(${_PREFIX})
|
|
endmacro()
|
|
|
|
macro(CMAKE_CHECK_COMMON_INIT_ARGS _PREFIX)
|
|
cmake_check_common_init_compile_args(${_PREFIX})
|
|
cmake_check_common_init_link_args(${_PREFIX})
|
|
endmacro()
|
|
|
|
macro(CMAKE_CHECK_COMMON_CLEANUP _PREFIX)
|
|
unset(${_PREFIX}_ADD_LINK_OPTIONS)
|
|
unset(${_PREFIX}_ADD_LINK_LIBRARIES)
|
|
unset(${_PREFIX}_LINK_DIRECTORIES)
|
|
unset(${_PREFIX}_INCLUDE_DIRECTORIES)
|
|
unset(${_PREFIX}_EXTRA_CMAKE_ARGUMENTS)
|
|
endmacro()
|