1 # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 # file Copyright.txt or https://cmake.org/licensing for details.
7 cmake_policy(SET CMP0054 NEW) # if() quoted variables not dereferenced
8 cmake_policy(SET CMP0057 NEW) # if() supports IN_LIST
10 function(CMAKE_CHECK_SOURCE_COMPILES _lang _source _var)
11 if(NOT DEFINED "${_var}")
13 if(_lang STREQUAL "C")
14 set(_lang_textual "C")
16 elseif(_lang STREQUAL "CXX")
17 set(_lang_textual "C++")
19 elseif(_lang STREQUAL "CUDA")
20 set(_lang_textual "CUDA")
22 elseif(_lang STREQUAL "Fortran")
23 set(_lang_textual "Fortran")
25 elseif(_lang STREQUAL "HIP")
26 set(_lang_textual "HIP")
28 elseif(_lang STREQUAL "ISPC")
29 set(_lang_textual "ISPC")
31 elseif(_lang STREQUAL "OBJC")
32 set(_lang_textual "Objective-C")
34 elseif(_lang STREQUAL "OBJCXX")
35 set(_lang_textual "Objective-C++")
38 message (SEND_ERROR "check_source_compiles: ${_lang}: unknown language.")
42 get_property (_supported_languages GLOBAL PROPERTY ENABLED_LANGUAGES)
43 if (NOT _lang IN_LIST _supported_languages)
44 message (SEND_ERROR "check_source_compiles: ${_lang}: needs to be enabled before use.")
52 if("${arg}" MATCHES "^(FAIL_REGEX|SRC_EXT|OUTPUT_VARIABLE)$")
54 elseif(_key STREQUAL "FAIL_REGEX")
55 list(APPEND _FAIL_REGEX "${arg}")
56 elseif(_key STREQUAL "SRC_EXT")
57 set(_SRC_EXT "${arg}")
59 elseif(_key STREQUAL "OUTPUT_VARIABLE")
60 set(_OUTPUT_VARIABLE "${arg}")
63 message(FATAL_ERROR "Unknown argument:\n ${arg}\n")
68 set(_SRC_EXT ${_lang_ext})
71 if(CMAKE_REQUIRED_LINK_OPTIONS)
72 set(CHECK_${LANG}_SOURCE_COMPILES_ADD_LINK_OPTIONS
73 LINK_OPTIONS ${CMAKE_REQUIRED_LINK_OPTIONS})
75 set(CHECK_${LANG}_SOURCE_COMPILES_ADD_LINK_OPTIONS)
77 if(CMAKE_REQUIRED_LIBRARIES)
78 set(CHECK_${LANG}_SOURCE_COMPILES_ADD_LIBRARIES
79 LINK_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
81 set(CHECK_${LANG}_SOURCE_COMPILES_ADD_LIBRARIES)
83 if(CMAKE_REQUIRED_INCLUDES)
84 set(CHECK_${LANG}_SOURCE_COMPILES_ADD_INCLUDES
85 "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
87 set(CHECK_${LANG}_SOURCE_COMPILES_ADD_INCLUDES)
90 if(NOT CMAKE_REQUIRED_QUIET)
91 message(CHECK_START "Performing Test ${_var}")
93 string(APPEND _source "\n")
95 SOURCE_FROM_VAR "src.${_SRC_EXT}" _source
96 COMPILE_DEFINITIONS -D${_var} ${CMAKE_REQUIRED_DEFINITIONS}
97 ${CHECK_${LANG}_SOURCE_COMPILES_ADD_LINK_OPTIONS}
98 ${CHECK_${LANG}_SOURCE_COMPILES_ADD_LIBRARIES}
99 CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${CMAKE_REQUIRED_FLAGS}
100 "${CHECK_${LANG}_SOURCE_COMPILES_ADD_INCLUDES}"
101 OUTPUT_VARIABLE OUTPUT)
103 foreach(_regex ${_FAIL_REGEX})
104 if("${OUTPUT}" MATCHES "${_regex}")
109 if (_OUTPUT_VARIABLE)
110 set(${_OUTPUT_VARIABLE} "${OUTPUT}" PARENT_SCOPE)
114 set(${_var} 1 CACHE INTERNAL "Test ${_var}")
115 if(NOT CMAKE_REQUIRED_QUIET)
116 message(CHECK_PASS "Success")
118 file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
119 "Performing ${_lang_textual} SOURCE FILE Test ${_var} succeeded with the following output:\n"
121 "Source file was:\n${_source}\n")
123 if(NOT CMAKE_REQUIRED_QUIET)
124 message(CHECK_FAIL "Failed")
126 set(${_var} "" CACHE INTERNAL "Test ${_var}")
127 file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
128 "Performing ${_lang_textual} SOURCE FILE Test ${_var} failed with the following output:\n"
130 "Source file was:\n${_source}\n")