mirror of
https://gitlab.kitware.com/cmake/cmake.git
synced 2026-07-31 23:52:46 +08:00
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
155 lines
4.6 KiB
CMake
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()
|