27aa3e01755ecd0ef01f86eefd6139f9cc8e489d
[platform/upstream/cmake.git] / Modules / Internal / CheckSourceCompiles.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 include_guard(GLOBAL)
5
6 cmake_policy(PUSH)
7 cmake_policy(SET CMP0054 NEW) # if() quoted variables not dereferenced
8 cmake_policy(SET CMP0057 NEW) # if() supports IN_LIST
9
10 function(CMAKE_CHECK_SOURCE_COMPILES _lang _source _var)
11   if(NOT DEFINED "${_var}")
12
13     if(_lang STREQUAL "C")
14       set(_lang_textual "C")
15       set(_lang_ext "c")
16     elseif(_lang STREQUAL "CXX")
17       set(_lang_textual "C++")
18       set(_lang_ext "cxx")
19     elseif(_lang STREQUAL "CUDA")
20       set(_lang_textual "CUDA")
21       set(_lang_ext "cu")
22     elseif(_lang STREQUAL "Fortran")
23       set(_lang_textual "Fortran")
24       set(_lang_ext "F90")
25     elseif(_lang STREQUAL "HIP")
26       set(_lang_textual "HIP")
27       set(_lang_ext "hip")
28     elseif(_lang STREQUAL "ISPC")
29       set(_lang_textual "ISPC")
30       set(_lang_ext "ispc")
31     elseif(_lang STREQUAL "OBJC")
32       set(_lang_textual "Objective-C")
33       set(_lang_ext "m")
34     elseif(_lang STREQUAL "OBJCXX")
35       set(_lang_textual "Objective-C++")
36       set(_lang_ext "mm")
37     else()
38       message (SEND_ERROR "check_source_compiles: ${_lang}: unknown language.")
39       return()
40     endif()
41
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.")
45       return()
46     endif()
47
48     set(_FAIL_REGEX)
49     set(_SRC_EXT)
50     set(_key)
51     foreach(arg ${ARGN})
52       if("${arg}" MATCHES "^(FAIL_REGEX|SRC_EXT|OUTPUT_VARIABLE)$")
53         set(_key "${arg}")
54       elseif(_key STREQUAL "FAIL_REGEX")
55         list(APPEND _FAIL_REGEX "${arg}")
56       elseif(_key STREQUAL "SRC_EXT")
57         set(_SRC_EXT "${arg}")
58         set(_key "")
59       elseif(_key STREQUAL "OUTPUT_VARIABLE")
60         set(_OUTPUT_VARIABLE "${arg}")
61         set(_key "")
62       else()
63         message(FATAL_ERROR "Unknown argument:\n  ${arg}\n")
64       endif()
65     endforeach()
66
67     if(NOT _SRC_EXT)
68       set(_SRC_EXT ${_lang_ext})
69     endif()
70
71     if(CMAKE_REQUIRED_LINK_OPTIONS)
72       set(CHECK_${LANG}_SOURCE_COMPILES_ADD_LINK_OPTIONS
73         LINK_OPTIONS ${CMAKE_REQUIRED_LINK_OPTIONS})
74     else()
75       set(CHECK_${LANG}_SOURCE_COMPILES_ADD_LINK_OPTIONS)
76     endif()
77     if(CMAKE_REQUIRED_LIBRARIES)
78       set(CHECK_${LANG}_SOURCE_COMPILES_ADD_LIBRARIES
79         LINK_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
80     else()
81       set(CHECK_${LANG}_SOURCE_COMPILES_ADD_LIBRARIES)
82     endif()
83     if(CMAKE_REQUIRED_INCLUDES)
84       set(CHECK_${LANG}_SOURCE_COMPILES_ADD_INCLUDES
85         "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
86     else()
87       set(CHECK_${LANG}_SOURCE_COMPILES_ADD_INCLUDES)
88     endif()
89     file(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.${_SRC_EXT}"
90       "${_source}\n")
91
92     if(NOT CMAKE_REQUIRED_QUIET)
93       message(CHECK_START "Performing Test ${_var}")
94     endif()
95     try_compile(${_var}
96       ${CMAKE_BINARY_DIR}
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)
104
105     foreach(_regex ${_FAIL_REGEX})
106       if("${OUTPUT}" MATCHES "${_regex}")
107         set(${_var} 0)
108       endif()
109     endforeach()
110
111     if (_OUTPUT_VARIABLE)
112       set(${_OUTPUT_VARIABLE} "${OUTPUT}" PARENT_SCOPE)
113     endif()
114
115     if(${_var})
116       set(${_var} 1 CACHE INTERNAL "Test ${_var}")
117       if(NOT CMAKE_REQUIRED_QUIET)
118         message(CHECK_PASS "Success")
119       endif()
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"
122         "${OUTPUT}\n"
123         "Source file was:\n${_source}\n")
124     else()
125       if(NOT CMAKE_REQUIRED_QUIET)
126         message(CHECK_FAIL "Failed")
127       endif()
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"
131         "${OUTPUT}\n"
132         "Source file was:\n${_source}\n")
133     endif()
134   endif()
135 endfunction()
136
137 cmake_policy(POP)