Merge pull request #16122 from alalek:cmake_update_cpu_compiler_detection
[platform/upstream/opencv.git] / cmake / OpenCVDetectCXXCompiler.cmake
1 # Compilers:
2 # - CV_GCC - GNU compiler (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
3 # - CV_CLANG - Clang-compatible compiler (CMAKE_CXX_COMPILER_ID MATCHES "Clang" - Clang or AppleClang, see CMP0025)
4 # - CV_ICC - Intel compiler
5 # - MSVC - Microsoft Visual Compiler (CMake variable)
6 # - MINGW / CYGWIN / CMAKE_COMPILER_IS_MINGW / CMAKE_COMPILER_IS_CYGWIN (CMake original variables)
7 #
8 # CPU Platforms:
9 # - X86 / X86_64
10 # - ARM - ARM CPU, not defined for AArch64
11 # - AARCH64 - ARMv8+ (64-bit)
12 # - PPC64 / PPC64LE - PowerPC
13 # - MIPS
14 #
15 # OS:
16 # - WIN32 - Windows | MINGW
17 # - UNIX - Linux | MacOSX | ANDROID
18 # - ANDROID
19 # - IOS
20 # - APPLE - MacOSX | iOS
21 # ----------------------------------------------------------------------------
22
23 ocv_declare_removed_variables(MINGW64 MSVC64)
24 # do not use (CMake variables): CMAKE_CL_64
25
26 if(NOT DEFINED CV_GCC AND CMAKE_CXX_COMPILER_ID MATCHES "GNU")
27   set(CV_GCC 1)
28 endif()
29 if(NOT DEFINED CV_CLANG AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")  # Clang or AppleClang (see CMP0025)
30   set(CV_CLANG 1)
31   set(CMAKE_COMPILER_IS_CLANGCXX 1)  # TODO next release: remove this
32   set(CMAKE_COMPILER_IS_CLANGCC 1)   # TODO next release: remove this
33 endif()
34
35 function(access_CMAKE_COMPILER_IS_CLANGCXX)
36   if(NOT OPENCV_SUPPRESS_DEPRECATIONS)
37     message(WARNING "DEPRECATED: CMAKE_COMPILER_IS_CLANGCXX support is deprecated in OpenCV.
38     Consider using:
39     - CV_GCC    # GCC
40     - CV_CLANG  # Clang or AppleClang (see CMP0025)
41 ")
42   endif()
43 endfunction()
44 variable_watch(CMAKE_COMPILER_IS_CLANGCXX access_CMAKE_COMPILER_IS_CLANGCXX)
45 variable_watch(CMAKE_COMPILER_IS_CLANGCC access_CMAKE_COMPILER_IS_CLANGCXX)
46
47
48 # ----------------------------------------------------------------------------
49 # Detect Intel ICC compiler
50 # ----------------------------------------------------------------------------
51 if(UNIX)
52   if(__ICL)
53     set(CV_ICC   __ICL)
54   elseif(__ICC)
55     set(CV_ICC   __ICC)
56   elseif(__ECL)
57     set(CV_ICC   __ECL)
58   elseif(__ECC)
59     set(CV_ICC   __ECC)
60   elseif(__INTEL_COMPILER)
61     set(CV_ICC   __INTEL_COMPILER)
62   elseif(CMAKE_C_COMPILER MATCHES "icc")
63     set(CV_ICC   icc_matches_c_compiler)
64   endif()
65 endif()
66
67 if(MSVC AND CMAKE_C_COMPILER MATCHES "icc|icl")
68   set(CV_ICC   __INTEL_COMPILER_FOR_WINDOWS)
69 endif()
70
71 if(NOT DEFINED CMAKE_CXX_COMPILER_VERSION
72     AND NOT OPENCV_SUPPRESS_MESSAGE_MISSING_COMPILER_VERSION)
73   message(WARNING "OpenCV: Compiler version is not available: CMAKE_CXX_COMPILER_VERSION is not set")
74 endif()
75 if((NOT DEFINED CMAKE_SYSTEM_PROCESSOR OR CMAKE_SYSTEM_PROCESSOR STREQUAL "")
76     AND NOT OPENCV_SUPPRESS_MESSAGE_MISSING_CMAKE_SYSTEM_PROCESSOR)
77   message(WARNING "OpenCV: CMAKE_SYSTEM_PROCESSOR is not defined. Perhaps CMake toolchain is broken")
78 endif()
79 if(NOT DEFINED CMAKE_SIZEOF_VOID_P
80     AND NOT OPENCV_SUPPRESS_MESSAGE_MISSING_CMAKE_SIZEOF_VOID_P)
81   message(WARNING "OpenCV: CMAKE_SIZEOF_VOID_P is not defined. Perhaps CMake toolchain is broken")
82 endif()
83
84 message(STATUS "Detected processor: ${CMAKE_SYSTEM_PROCESSOR}")
85 if(OPENCV_SKIP_SYSTEM_PROCESSOR_DETECTION)
86   # custom setup: required variables are passed through cache / CMake's command-line
87 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*")
88   set(X86_64 1)
89 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i686.*|i386.*|x86.*")
90   set(X86 1)
91 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*|arm64.*|ARM64.*)")
92   set(AARCH64 1)
93 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm.*|ARM.*)")
94   set(ARM 1)
95 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64le")
96   set(PPC64LE 1)
97 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
98   set(PPC64 1)
99 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(mips.*|MIPS.*)")
100   set(MIPS 1)
101 else()
102   if(NOT OPENCV_SUPPRESS_MESSAGE_UNRECOGNIZED_SYSTEM_PROCESSOR)
103     message(WARNING "OpenCV: unrecognized target processor configuration")
104   endif()
105 endif()
106
107 # Workaround for 32-bit operating systems on x86_64
108 if(CMAKE_SIZEOF_VOID_P EQUAL 4 AND X86_64
109     AND NOT FORCE_X86_64  # deprecated (2019-12)
110     AND NOT OPENCV_FORCE_X86_64
111 )
112   message(STATUS "sizeof(void) = 4 on 64 bit processor. Assume 32-bit compilation mode")
113   if(X86_64)
114     unset(X86_64)
115     set(X86 1)
116   endif()
117 endif()
118 # Workaround for 32-bit operating systems on aarch64 processor
119 if(CMAKE_SIZEOF_VOID_P EQUAL 4 AND AARCH64
120     AND NOT OPENCV_FORCE_AARCH64
121 )
122   message(STATUS "sizeof(void) = 4 on 64 bit processor. Assume 32-bit compilation mode")
123   if(AARCH64)
124     unset(AARCH64)
125     set(ARM 1)
126   endif()
127 endif()
128
129
130 # Similar code exists in OpenCVConfig.cmake
131 if(NOT DEFINED OpenCV_STATIC)
132   # look for global setting
133   if(NOT DEFINED BUILD_SHARED_LIBS OR BUILD_SHARED_LIBS)
134     set(OpenCV_STATIC OFF)
135   else()
136     set(OpenCV_STATIC ON)
137   endif()
138 endif()
139
140 if(DEFINED OpenCV_ARCH AND DEFINED OpenCV_RUNTIME)
141   # custom overridden values
142 elseif(MSVC)
143   # see Modules/CMakeGenericSystem.cmake
144   if("${CMAKE_GENERATOR}" MATCHES "(Win64|IA64)")
145     set(arch_hint "x64")
146   elseif("${CMAKE_GENERATOR_PLATFORM}" MATCHES "ARM64")
147     set(arch_hint "ARM64")
148   elseif("${CMAKE_GENERATOR}" MATCHES "ARM")
149     set(arch_hint "ARM")
150   elseif("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8")
151     set(arch_hint "x64")
152   else()
153     set(OpenCV_ARCH x86)
154   endif()
155
156   if(MSVC_VERSION EQUAL 1400)
157     set(OpenCV_RUNTIME vc8)
158   elseif(MSVC_VERSION EQUAL 1500)
159     set(OpenCV_RUNTIME vc9)
160   elseif(MSVC_VERSION EQUAL 1600)
161     set(OpenCV_RUNTIME vc10)
162   elseif(MSVC_VERSION EQUAL 1700)
163     set(OpenCV_RUNTIME vc11)
164   elseif(MSVC_VERSION EQUAL 1800)
165     set(OpenCV_RUNTIME vc12)
166   elseif(MSVC_VERSION EQUAL 1900)
167     set(OpenCV_RUNTIME vc14)
168   elseif(MSVC_VERSION MATCHES "^191[0-9]$")
169     set(OpenCV_RUNTIME vc15)
170   elseif(MSVC_VERSION MATCHES "^192[0-9]$")
171     set(OpenCV_RUNTIME vc16)
172   else()
173     message(WARNING "OpenCV does not recognize MSVC_VERSION \"${MSVC_VERSION}\". Cannot set OpenCV_RUNTIME")
174   endif()
175 elseif(MINGW)
176   set(OpenCV_RUNTIME mingw)
177
178   if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*")
179     set(OpenCV_ARCH x64)
180   else()
181     set(OpenCV_ARCH x86)
182   endif()
183 endif()
184
185 # Fix handling of duplicated files in the same static library:
186 # https://public.kitware.com/Bug/view.php?id=14874
187 if(CMAKE_VERSION VERSION_LESS "3.1")
188   foreach(var CMAKE_C_ARCHIVE_APPEND CMAKE_CXX_ARCHIVE_APPEND)
189     if(${var} MATCHES "^<CMAKE_AR> r")
190       string(REPLACE "<CMAKE_AR> r" "<CMAKE_AR> q" ${var} "${${var}}")
191     endif()
192   endforeach()
193 endif()
194
195 if(ENABLE_CXX11)
196   #cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
197   set(CMAKE_CXX_STANDARD 11)
198   set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
199   set(CMAKE_CXX_EXTENSIONS OFF) # use -std=c++11 instead of -std=gnu++11
200   if(CMAKE_CXX11_COMPILE_FEATURES)
201     set(HAVE_CXX11 ON)
202   endif()
203 endif()
204 if(NOT HAVE_CXX11)
205   ocv_check_compiler_flag(CXX "" HAVE_CXX11 "${OpenCV_SOURCE_DIR}/cmake/checks/cxx11.cpp")
206   if(NOT HAVE_CXX11 AND ENABLE_CXX11)
207     ocv_check_compiler_flag(CXX "-std=c++11" HAVE_STD_CXX11 "${OpenCV_SOURCE_DIR}/cmake/checks/cxx11.cpp")
208     if(HAVE_STD_CXX11)
209       set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
210       set(HAVE_CXX11 ON)
211     endif()
212   endif()
213 endif()
214
215 if((HAVE_CXX11
216         AND NOT MSVC
217         AND NOT (X86 OR X86_64)
218     AND NOT OPENCV_SKIP_LIBATOMIC_COMPILER_CHECK)
219     OR OPENCV_FORCE_LIBATOMIC_COMPILER_CHECK
220 )
221   ocv_check_compiler_flag(CXX "" HAVE_CXX_ATOMICS_WITHOUT_LIB "${OpenCV_SOURCE_DIR}/cmake/checks/atomic_check.cpp")
222   if(NOT HAVE_CXX_ATOMICS_WITHOUT_LIB)
223     list(APPEND CMAKE_REQUIRED_LIBRARIES atomic)
224     ocv_check_compiler_flag(CXX "" HAVE_CXX_ATOMICS_WITH_LIB "${OpenCV_SOURCE_DIR}/cmake/checks/atomic_check.cpp")
225     if(HAVE_CXX_ATOMICS_WITH_LIB)
226       list(APPEND OPENCV_LINKER_LIBS atomic)
227     else()
228       message(FATAL_ERROR "C++11 compiler must support std::atomic")
229     endif()
230   endif()
231 endif()