cmake/Modules/CheckIncludeFileCXX.cmake
Matthew Woehlke a72e241200 Check*: Restore more toleration of ;-W... in CMAKE_REQUIRED_FLAGS
Commit 5abaf65154 (Check*: Restore toleration of `;-W...` in
CMAKE_REQUIRED_FLAGS, 2026-06-24, v4.4.0-rc3~2^2) introduced logic to
prevent `-W*` arguments in `CMAKE_REQUIRED_FLAGS` from being passed as
CMake arguments in the `check[_<lang>]_source_{compiles,runs}` family of
utilities. However, several other related modules are also affected.
Update those to also use the new logic, and to have more uniform
implementations, making use of the refactoring from the previous commit.

Fixes: #27961
2026-07-21 15:21:42 -04:00

155 lines
4.6 KiB
CMake

# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.
#[=======================================================================[.rst:
CheckIncludeFileCXX
-------------------
This module provides a command to check a C++ header file.
Load this module in a CMake project with:
.. code-block:: cmake
include(CheckIncludeFileCXX)
Commands
^^^^^^^^
This module provides the following command:
.. command:: check_include_file_cxx
Checks once whether a header file exists and can be included in C++ code:
.. code-block:: cmake
check_include_file_cxx(<include> <variable> [<flags>])
.. rubric:: The arguments are:
``<include>``
A header file to be checked.
``<variable>``
The name of the variable to store the result of the check. This
variable will be created as an internal cache variable.
``<flags>``
(Optional) A space-separated string of
additional compilation flags to be added to the check. Alternatively,
flags can be also specified with the ``CMAKE_REQUIRED_FLAGS`` variable
below.
.. rubric:: Variables Affecting the Check
The following variables may be set before calling this command to modify
the way the check is run:
.. include:: /module/include/CMAKE_REQUIRED_FLAGS.rst
.. include:: /module/include/CMAKE_REQUIRED_DEFINITIONS.rst
.. include:: /module/include/CMAKE_REQUIRED_INCLUDES.rst
.. include:: /module/include/CMAKE_REQUIRED_LINK_OPTIONS.rst
.. include:: /module/include/CMAKE_REQUIRED_LIBRARIES.rst
.. include:: /module/include/CMAKE_REQUIRED_LINK_DIRECTORIES.rst
.. include:: /module/include/CMAKE_REQUIRED_QUIET.rst
.. versionadded:: 3.12
The ``CMAKE_REQUIRED_LIBRARIES`` variable, if policy :policy:`CMP0075` is
set to ``NEW``.
Examples
^^^^^^^^
Checking whether the ``C++23`` header ``<stdfloat>`` exists and storing the
check result in the ``HAVE_STDFLOAT_HEADER`` cache variable:
.. code-block:: cmake
include(CheckIncludeFileCXX)
check_include_file_cxx(stdfloat HAVE_STDFLOAT_HEADER)
See Also
^^^^^^^^
* The :module:`CheckIncludeFile` module to check for single C header.
* The :module:`CheckIncludeFiles` module to check for one or more C or
C++ headers at once.
#]=======================================================================]
include_guard(GLOBAL)
include(Internal/CheckCommon)
macro(CHECK_INCLUDE_FILE_CXX INCLUDE VARIABLE)
if(NOT DEFINED "${VARIABLE}" OR "x${${VARIABLE}}" STREQUAL "x${VARIABLE}")
set(CHECK_INCLUDE_FILE_VAR ${INCLUDE})
file(READ ${CMAKE_ROOT}/Modules/CheckIncludeFile.cxx.in _CIF_SOURCE_CONTENT)
string(CONFIGURE "${_CIF_SOURCE_CONTENT}" _CIF_SOURCE_CONTENT)
if(NOT CMAKE_REQUIRED_QUIET)
message(CHECK_START "Looking for C++ include ${INCLUDE}")
endif()
if(${ARGC} EQUAL 3)
set(CMAKE_CXX_FLAGS_SAVE ${CMAKE_CXX_FLAGS})
string(APPEND CMAKE_CXX_FLAGS " ${ARGV2}")
endif()
cmake_check_common_init_compile_args(_CIF)
cmake_check_common_init_link_options(_CIF)
cmake_check_common_init_link_directories(_CIF)
set(_CIF_ADD_LINK_LIBRARIES "")
if(CMAKE_REQUIRED_LIBRARIES)
cmake_policy(GET CMP0075 _CIF_CMP0075
PARENT_SCOPE # undocumented, do not use outside of CMake
)
if("x${_CIF_CMP0075}x" STREQUAL "xNEWx")
set(_CIF_ADD_LINK_LIBRARIES LINK_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
elseif("x${_CIF_CMP0075}x" STREQUAL "xOLDx")
elseif(NOT _CIF_CMP0075_WARNED)
set(_CIF_CMP0075_WARNED 1)
cmake_policy(ISSUE_WARNING CMP0075 POST
"CMAKE_REQUIRED_LIBRARIES is set to:\n"
" ${CMAKE_REQUIRED_LIBRARIES}\n"
"For compatibility with CMake 3.11 and below this check is ignoring it."
)
endif()
unset(_CIF_CMP0075)
endif()
try_compile(${VARIABLE}
SOURCE_FROM_VAR CheckIncludeFile.cxx _CIF_SOURCE_CONTENT
COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
${_CIF_ADD_LINK_OPTIONS}
${_CIF_ADD_LINK_LIBRARIES}
CMAKE_FLAGS
-DCOMPILE_DEFINITIONS:STRING=${CMAKE_REQUIRED_FLAGS}
"${_CIF_INCLUDE_DIRECTORIES}"
"${_CIF_LINK_DIRECTORIES}"
)
cmake_check_common_cleanup(_CIF)
if(${ARGC} EQUAL 3)
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS_SAVE})
endif()
if(${VARIABLE})
if(NOT CMAKE_REQUIRED_QUIET)
message(CHECK_PASS "found")
endif()
set(${VARIABLE} 1 CACHE INTERNAL "Have include ${INCLUDE}")
else()
if(NOT CMAKE_REQUIRED_QUIET)
message(CHECK_FAIL "not found")
endif()
set(${VARIABLE} "" CACHE INTERNAL "Have include ${INCLUDE}")
endif()
endif()
endmacro()