Imported Upstream version 3.25.0
[platform/upstream/cmake.git] / Modules / CheckIncludeFile.cmake
1 # Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2 # file Copyright.txt or https://cmake.org/licensing for details.
3
4 #[=======================================================================[.rst:
5 CheckIncludeFile
6 ----------------
7
8 Provides a macro to check if a header file can be included in ``C``.
9
10 .. command:: CHECK_INCLUDE_FILE
11
12   .. code-block:: cmake
13
14     CHECK_INCLUDE_FILE(<include> <variable> [<flags>])
15
16   Check if the given ``<include>`` file may be included in a ``C``
17   source file and store the result in an internal cache entry named
18   ``<variable>``.  The optional third argument may be used to add
19   compilation flags to the check (or use ``CMAKE_REQUIRED_FLAGS`` below).
20
21 The following variables may be set before calling this macro to modify
22 the way the check is run:
23
24 ``CMAKE_REQUIRED_FLAGS``
25   string of compile command line flags.
26 ``CMAKE_REQUIRED_DEFINITIONS``
27   a :ref:`;-list <CMake Language Lists>` of macros to define (-DFOO=bar).
28 ``CMAKE_REQUIRED_INCLUDES``
29   a :ref:`;-list <CMake Language Lists>` of header search paths to pass to
30   the compiler.
31 ``CMAKE_REQUIRED_LINK_OPTIONS``
32   .. versionadded:: 3.14
33     a :ref:`;-list <CMake Language Lists>` of options to add to the link command.
34 ``CMAKE_REQUIRED_LIBRARIES``
35   a :ref:`;-list <CMake Language Lists>` of libraries to add to the link
36   command. See policy :policy:`CMP0075`.
37 ``CMAKE_REQUIRED_QUIET``
38   .. versionadded:: 3.1
39     execute quietly without messages.
40
41 See the :module:`CheckIncludeFiles` module to check for multiple headers
42 at once.  See the :module:`CheckIncludeFileCXX` module to check for headers
43 using the ``CXX`` language.
44 #]=======================================================================]
45
46 include_guard(GLOBAL)
47
48 macro(CHECK_INCLUDE_FILE INCLUDE VARIABLE)
49   if(NOT DEFINED "${VARIABLE}")
50     if(CMAKE_REQUIRED_INCLUDES)
51       set(CHECK_INCLUDE_FILE_C_INCLUDE_DIRS "-DINCLUDE_DIRECTORIES=${CMAKE_REQUIRED_INCLUDES}")
52     else()
53       set(CHECK_INCLUDE_FILE_C_INCLUDE_DIRS)
54     endif()
55     set(MACRO_CHECK_INCLUDE_FILE_FLAGS ${CMAKE_REQUIRED_FLAGS})
56     set(CHECK_INCLUDE_FILE_VAR ${INCLUDE})
57     file(READ ${CMAKE_ROOT}/Modules/CheckIncludeFile.c.in _CIF_SOURCE_CONTENT)
58     string(CONFIGURE "${_CIF_SOURCE_CONTENT}" _CIF_SOURCE_CONTENT)
59     if(NOT CMAKE_REQUIRED_QUIET)
60       message(CHECK_START "Looking for ${INCLUDE}")
61     endif()
62     if(${ARGC} EQUAL 3)
63       set(CMAKE_C_FLAGS_SAVE ${CMAKE_C_FLAGS})
64       string(APPEND CMAKE_C_FLAGS " ${ARGV2}")
65     endif()
66
67     set(_CIF_LINK_OPTIONS)
68     if(CMAKE_REQUIRED_LINK_OPTIONS)
69       set(_CIF_LINK_OPTIONS LINK_OPTIONS ${CMAKE_REQUIRED_LINK_OPTIONS})
70     endif()
71
72     set(_CIF_LINK_LIBRARIES "")
73     if(CMAKE_REQUIRED_LIBRARIES)
74       cmake_policy(GET CMP0075 _CIF_CMP0075
75         PARENT_SCOPE # undocumented, do not use outside of CMake
76         )
77       if("x${_CIF_CMP0075}x" STREQUAL "xNEWx")
78         set(_CIF_LINK_LIBRARIES LINK_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
79       elseif("x${_CIF_CMP0075}x" STREQUAL "xOLDx")
80       elseif(NOT _CIF_CMP0075_WARNED)
81         set(_CIF_CMP0075_WARNED 1)
82         message(AUTHOR_WARNING
83           "Policy CMP0075 is not set: Include file check macros honor CMAKE_REQUIRED_LIBRARIES.  "
84           "Run \"cmake --help-policy CMP0075\" for policy details.  "
85           "Use the cmake_policy command to set the policy and suppress this warning."
86           "\n"
87           "CMAKE_REQUIRED_LIBRARIES is set to:\n"
88           "  ${CMAKE_REQUIRED_LIBRARIES}\n"
89           "For compatibility with CMake 3.11 and below this check is ignoring it."
90           )
91       endif()
92       unset(_CIF_CMP0075)
93     endif()
94
95     try_compile(${VARIABLE}
96       SOURCE_FROM_VAR CheckIncludeFile.c _CIF_SOURCE_CONTENT
97       COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
98       ${_CIF_LINK_OPTIONS}
99       ${_CIF_LINK_LIBRARIES}
100       CMAKE_FLAGS
101       -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_INCLUDE_FILE_FLAGS}
102       "${CHECK_INCLUDE_FILE_C_INCLUDE_DIRS}"
103       OUTPUT_VARIABLE OUTPUT)
104     unset(_CIF_LINK_OPTIONS)
105     unset(_CIF_LINK_LIBRARIES)
106
107     if(${ARGC} EQUAL 3)
108       set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS_SAVE})
109     endif()
110
111     if(${VARIABLE})
112       if(NOT CMAKE_REQUIRED_QUIET)
113         message(CHECK_PASS "found")
114       endif()
115       set(${VARIABLE} 1 CACHE INTERNAL "Have include ${INCLUDE}")
116       file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
117         "Determining if the include file ${INCLUDE} "
118         "exists passed with the following output:\n"
119         "${OUTPUT}\n\n")
120     else()
121       if(NOT CMAKE_REQUIRED_QUIET)
122         message(CHECK_FAIL "not found")
123       endif()
124       set(${VARIABLE} "" CACHE INTERNAL "Have include ${INCLUDE}")
125       file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
126         "Determining if the include file ${INCLUDE} "
127         "exists failed with the following output:\n"
128         "${OUTPUT}\n\n")
129     endif()
130   endif()
131 endmacro()