2017-11-11 23:08:37 +08:00
# Distributed under the OSI-approved BSD 3-Clause License. See full license information in
# doc_src/license.hdr or https://cmake.org/licensing for details.
#.rst:
# CheckIncludeFiles
# -----------------
#
# Provides a macro to check if a list of one or more header files can
# be included together in ``C``.
#
# .. command:: CHECK_INCLUDE_FILES
#
# ::
#
# CHECK_INCLUDE_FILES("<includes>" <variable> [LANGUAGE <language>])
#
# Check if the given ``<includes>`` list may be included together
# in a ``C`` source file and store the result in an internal cache
# entry named ``<variable>``. Specify the ``<includes>`` argument
# as a :ref:`;-list <CMake Language Lists>` of header file names.
#
# If LANGUAGE is set, the specified compiler will be used to perform the
# check. Acceptable values are C and CXX.
#
# The following variables may be set before calling this macro to modify
# the way the check is run:
#
# ``CMAKE_REQUIRED_FLAGS``
# string of compile command line flags
# ``CMAKE_REQUIRED_DEFINITIONS``
# list of macros to define (-DFOO=bar)
# ``CMAKE_REQUIRED_INCLUDES``
# list of include directories
# ``CMAKE_REQUIRED_QUIET``
# execute quietly without messages
#
# See modules :module:`CheckIncludeFile` and :module:`CheckIncludeFileCXX`
# to check for a single header file in ``C`` or ``CXX`` languages.
macro ( CHECK_INCLUDE_FILES INCLUDE VARIABLE )
if ( NOT DEFINED "${VARIABLE}" )
set ( CMAKE_CONFIGURABLE_FILE_CONTENT "/* */\n" )
if ( "x${ARGN}" STREQUAL "x" )
if ( CMAKE_C_COMPILER_LOADED )
set ( _lang C )
elseif ( CMAKE_CXX_COMPILER_LOADED )
set ( _lang CXX )
else ( )
message ( FATAL_ERROR "CHECK_INCLUDE_FILES needs either C or CXX language enabled" )
endif ( )
elseif ( "x${ARGN}" MATCHES "^xLANGUAGE;([a-zA-Z]+)$" )
set ( _lang "${CMAKE_MATCH_1}" )
else ( )
message ( FATAL_ERROR "Unknown arguments:\n ${ARGN}\n" )
endif ( )
if ( _lang STREQUAL "C" )
2021-06-06 18:09:50 +08:00
set ( src ${ CMAKE_BINARY_DIR } ${ CMAKE_FILES_DIRECTORY } /CheckIncludeFiles/ ${ VARIABLE } .c )
2017-11-11 23:08:37 +08:00
elseif ( _lang STREQUAL "CXX" )
2021-06-06 18:09:50 +08:00
set ( src ${ CMAKE_BINARY_DIR } ${ CMAKE_FILES_DIRECTORY } /CheckIncludeFiles/ ${ VARIABLE } .cpp )
2017-11-11 23:08:37 +08:00
else ( )
message ( FATAL_ERROR "Unknown language:\n ${_lang}\nSupported languages: C, CXX.\n" )
endif ( )
if ( CMAKE_REQUIRED_INCLUDES )
set ( CHECK_INCLUDE_FILES_INCLUDE_DIRS "-DINCLUDE_DIRECTORIES=${CMAKE_REQUIRED_INCLUDES}" )
else ( )
set ( CHECK_INCLUDE_FILES_INCLUDE_DIRS )
endif ( )
set ( CHECK_INCLUDE_FILES_CONTENT "/* */\n" )
set ( MACRO_CHECK_INCLUDE_FILES_FLAGS ${ CMAKE_REQUIRED_FLAGS } )
foreach ( FILE ${ INCLUDE } )
string ( APPEND CMAKE_CONFIGURABLE_FILE_CONTENT
" #include <${FILE}>\n")
endforeach ( )
string ( APPEND CMAKE_CONFIGURABLE_FILE_CONTENT
" \ n \ n i n t main ( void ) { r e t u r n 0 ; } \ n " )
configure_file ( "${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in"
" $ { s r c } " @ O N L Y )
set ( _INCLUDE ${ INCLUDE } ) # remove empty elements
if ( "${_INCLUDE}" MATCHES "^([^;]+);.+;([^;]+)$" )
list ( LENGTH _INCLUDE _INCLUDE_LEN )
set ( _description "${_INCLUDE_LEN} include files ${CMAKE_MATCH_1}, ..., ${CMAKE_MATCH_2}" )
elseif ( "${_INCLUDE}" MATCHES "^([^;]+);([^;]+)$" )
set ( _description "include files ${CMAKE_MATCH_1}, ${CMAKE_MATCH_2}" )
else ( )
set ( _description "include file ${_INCLUDE}" )
endif ( )
if ( NOT CMAKE_REQUIRED_QUIET )
message ( STATUS "Looking for ${_description}" )
endif ( )
try_compile ( ${ VARIABLE }
$ { C M A K E _ B I N A R Y _ D I R }
$ { s r c }
C O M P I L E _ D E F I N I T I O N S $ { C M A K E _ R E Q U I R E D _ D E F I N I T I O N S }
C M A K E _ F L A G S
- D C O M P I L E _ D E F I N I T I O N S : S T R I N G = $ { M A C R O _ C H E C K _ I N C L U D E _ F I L E S _ F L A G S }
" $ { C H E C K _ I N C L U D E _ F I L E S _ I N C L U D E _ D I R S } "
O U T P U T _ V A R I A B L E O U T P U T )
if ( ${ VARIABLE } )
if ( NOT CMAKE_REQUIRED_QUIET )
message ( STATUS "Looking for ${_description} - found" )
endif ( )
set ( ${ VARIABLE } 1 CACHE INTERNAL "Have include ${INCLUDE}" )
file ( APPEND ${ CMAKE_BINARY_DIR } ${ CMAKE_FILES_DIRECTORY } /CMakeOutput.log
" D e t e r m i n i n g i f f i l e s $ { I N C L U D E } "
" e x i s t p a s s e d w i t h t h e f o l l o w i n g o u t p u t : \ n "
" $ { O U T P U T } \ n \ n " )
else ( )
if ( NOT CMAKE_REQUIRED_QUIET )
message ( STATUS "Looking for ${_description} - not found" )
endif ( )
set ( ${ VARIABLE } "" CACHE INTERNAL "Have includes ${INCLUDE}" )
file ( APPEND ${ CMAKE_BINARY_DIR } ${ CMAKE_FILES_DIRECTORY } /CMakeError.log
" D e t e r m i n i n g i f f i l e s $ { I N C L U D E } "
" e x i s t f a i l e d w i t h t h e f o l l o w i n g o u t p u t : \ n "
" $ { O U T P U T } \ n S o u r c e : \ n $ { C M A K E _ C O N F I G U R A B L E _ F I L E _ C O N T E N T } \ n " )
endif ( )
endif ( )
endmacro ( )