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)
89 file(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.${_SRC_EXT}"
92 if(NOT CMAKE_REQUIRED_QUIET)
93 message(CHECK_START "Performing Test ${_var}")
97 ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.${_SRC_EXT}
98 COMPILE_DEFINITIONS -D${_var} ${CMAKE_REQUIRED_DEFINITIONS}
99 ${CHECK_${LANG}_SOURCE_COMPILES_ADD_LINK_OPTIONS}
100 ${CHECK_${LANG}_SOURCE_COMPILES_ADD_LIBRARIES}
101 CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${CMAKE_REQUIRED_FLAGS}
102 "${CHECK_${LANG}_SOURCE_COMPILES_ADD_INCLUDES}"
103 OUTPUT_VARIABLE OUTPUT)
105 foreach(_regex ${_FAIL_REGEX})
106 if("${OUTPUT}" MATCHES "${_regex}")
111 if (_OUTPUT_VARIABLE)
112 set(${_OUTPUT_VARIABLE} "${OUTPUT}" PARENT_SCOPE)
116 set(${_var} 1 CACHE INTERNAL "Test ${_var}")
117 if(NOT CMAKE_REQUIRED_QUIET)
118 message(CHECK_PASS "Success")
120 file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
121 "Performing ${_lang_textual} SOURCE FILE Test ${_var} succeeded with the following output:\n"
123 "Source file was:\n${_source}\n")
125 if(NOT CMAKE_REQUIRED_QUIET)
126 message(CHECK_FAIL "Failed")
128 set(${_var} "" CACHE INTERNAL "Test ${_var}")
129 file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
130 "Performing ${_lang_textual} SOURCE FILE Test ${_var} failed with the following output:\n"
132 "Source file was:\n${_source}\n")