blob: 6a19e322f497f94e189d749398988b924de8f82f [file] [log] [blame]
Jonathan Peyton2e013352015-07-15 16:05:30 +00001#
2#//===----------------------------------------------------------------------===//
3#//
Chandler Carruth57b08b02019-01-19 10:56:40 +00004#// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5#// See https://llvm.org/LICENSE.txt for license information.
6#// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Jonathan Peyton2e013352015-07-15 16:05:30 +00007#//
8#//===----------------------------------------------------------------------===//
9#
10
11include(CheckCCompilerFlag)
12include(CheckCSourceCompiles)
13include(CheckCXXCompilerFlag)
Jonathan Peyton01dcf362015-11-30 20:02:59 +000014include(CheckIncludeFile)
Jonathan Peyton2e013352015-07-15 16:05:30 +000015include(CheckLibraryExists)
Jonathan Peyton69e596a2015-10-29 20:56:24 +000016include(CheckIncludeFiles)
Jonathan Peyton2e013352015-07-15 16:05:30 +000017include(LibompCheckLinkerFlag)
18include(LibompCheckFortranFlag)
19
20# Check for versioned symbols
21function(libomp_check_version_symbols retval)
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +000022 set(source_code
23 "#include <stdio.h>
24 void func1() { printf(\"Hello\"); }
25 void func2() { printf(\"World\"); }
26 __asm__(\".symver func1, func@VER1\");
27 __asm__(\".symver func2, func@VER2\");
28 int main() {
29 func1();
30 func2();
31 return 0;
32 }")
33 set(version_script_source "VER1 { }; VER2 { } VER1;")
34 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/__version_script.txt "${version_script_source}")
35 set(CMAKE_REQUIRED_FLAGS -Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/__version_script.txt)
36 check_c_source_compiles("${source_code}" ${retval})
37 set(${retval} ${${retval}} PARENT_SCOPE)
38 file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/__version_script.txt)
Jonathan Peyton2e013352015-07-15 16:05:30 +000039endfunction()
40
41# Includes the architecture flag in both compile and link phase
42function(libomp_check_architecture_flag flag retval)
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +000043 set(CMAKE_REQUIRED_FLAGS "${flag}")
44 check_c_compiler_flag("${flag}" ${retval})
45 set(${retval} ${${retval}} PARENT_SCOPE)
Jonathan Peyton2e013352015-07-15 16:05:30 +000046endfunction()
47
Jonas Hahnfelddc23c832019-08-15 13:11:50 +000048# Checking CXX, Linker Flags
Jonathan Peyton2e013352015-07-15 16:05:30 +000049check_cxx_compiler_flag(-fno-exceptions LIBOMP_HAVE_FNO_EXCEPTIONS_FLAG)
Jonathan Peyton1cdd87a2016-11-14 21:08:35 +000050check_cxx_compiler_flag(-fno-rtti LIBOMP_HAVE_FNO_RTTI_FLAG)
Jonas Hahnfelddc23c832019-08-15 13:11:50 +000051check_cxx_compiler_flag(-Wno-class-memaccess LIBOMP_HAVE_WNO_CLASS_MEMACCESS_FLAG)
52check_cxx_compiler_flag(-Wno-covered-switch-default LIBOMP_HAVE_WNO_COVERED_SWITCH_DEFAULT_FLAG)
53check_cxx_compiler_flag(-Wno-frame-address LIBOMP_HAVE_WNO_FRAME_ADDRESS_FLAG)
Jonas Hahnfelddc23c832019-08-15 13:11:50 +000054check_cxx_compiler_flag(-Wno-strict-aliasing LIBOMP_HAVE_WNO_STRICT_ALIASING_FLAG)
55check_cxx_compiler_flag(-Wstringop-overflow=0 LIBOMP_HAVE_WSTRINGOP_OVERFLOW_FLAG)
56check_cxx_compiler_flag(-Wno-stringop-truncation LIBOMP_HAVE_WNO_STRINGOP_TRUNCATION_FLAG)
57check_cxx_compiler_flag(-Wno-switch LIBOMP_HAVE_WNO_SWITCH_FLAG)
58check_cxx_compiler_flag(-Wno-uninitialized LIBOMP_HAVE_WNO_UNINITIALIZED_FLAG)
59check_cxx_compiler_flag(-Wno-unused-but-set-variable LIBOMP_HAVE_WNO_UNUSED_BUT_SET_VARIABLE_FLAG)
60check_cxx_compiler_flag(-msse2 LIBOMP_HAVE_MSSE2_FLAG)
61check_cxx_compiler_flag(-ftls-model=initial-exec LIBOMP_HAVE_FTLS_MODEL_FLAG)
Jonathan Peyton2e013352015-07-15 16:05:30 +000062libomp_check_architecture_flag(-mmic LIBOMP_HAVE_MMIC_FLAG)
63libomp_check_architecture_flag(-m32 LIBOMP_HAVE_M32_FLAG)
64if(WIN32)
Andrey Churbanovf700e9e2018-12-10 13:45:00 +000065 if(MSVC)
66 # Check Windows MSVC style flags.
Andrey Churbanovf700e9e2018-12-10 13:45:00 +000067 check_cxx_compiler_flag(/EHsc LIBOMP_HAVE_EHSC_FLAG)
68 check_cxx_compiler_flag(/GS LIBOMP_HAVE_GS_FLAG)
69 check_cxx_compiler_flag(/Oy- LIBOMP_HAVE_Oy__FLAG)
70 check_cxx_compiler_flag(/arch:SSE2 LIBOMP_HAVE_ARCH_SSE2_FLAG)
71 check_cxx_compiler_flag(/Qsafeseh LIBOMP_HAVE_QSAFESEH_FLAG)
72 endif()
Jonas Hahnfelddc23c832019-08-15 13:11:50 +000073 check_cxx_compiler_flag(-mrtm LIBOMP_HAVE_MRTM_FLAG)
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +000074 # It is difficult to create a dummy masm assembly file
75 # and then check the MASM assembler to see if these flags exist and work,
76 # so we assume they do for Windows.
77 set(LIBOMP_HAVE_SAFESEH_MASM_FLAG TRUE)
78 set(LIBOMP_HAVE_COFF_MASM_FLAG TRUE)
79 # Change Windows flags /MDx to /MTx
80 foreach(libomp_lang IN ITEMS C CXX)
81 foreach(libomp_btype IN ITEMS DEBUG RELWITHDEBINFO RELEASE MINSIZEREL)
82 string(REPLACE "/MD" "/MT"
83 CMAKE_${libomp_lang}_FLAGS_${libomp_btype}
84 "${CMAKE_${libomp_lang}_FLAGS_${libomp_btype}}"
85 )
Jonathan Peyton2e013352015-07-15 16:05:30 +000086 endforeach()
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +000087 endforeach()
Jonathan Peyton2e013352015-07-15 16:05:30 +000088else()
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +000089 # It is difficult to create a dummy assembly file that compiles into an
90 # exectuable for every architecture and then check the C compiler to
91 # see if -x assembler-with-cpp exists and works, so we assume it does for non-Windows.
92 set(LIBOMP_HAVE_X_ASSEMBLER_WITH_CPP_FLAG TRUE)
Jonathan Peyton2e013352015-07-15 16:05:30 +000093endif()
94if(${LIBOMP_FORTRAN_MODULES})
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +000095 libomp_check_fortran_flag(-m32 LIBOMP_HAVE_M32_FORTRAN_FLAG)
Jonathan Peyton2e013352015-07-15 16:05:30 +000096endif()
97
98# Check linker flags
99if(WIN32)
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +0000100 libomp_check_linker_flag(/SAFESEH LIBOMP_HAVE_SAFESEH_FLAG)
Jonathan Peyton2e013352015-07-15 16:05:30 +0000101elseif(NOT APPLE)
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +0000102 libomp_check_linker_flag(-Wl,-x LIBOMP_HAVE_X_FLAG)
103 libomp_check_linker_flag(-Wl,--warn-shared-textrel LIBOMP_HAVE_WARN_SHARED_TEXTREL_FLAG)
104 libomp_check_linker_flag(-Wl,--as-needed LIBOMP_HAVE_AS_NEEDED_FLAG)
105 libomp_check_linker_flag("-Wl,--version-script=${LIBOMP_SRC_DIR}/exports_so.txt" LIBOMP_HAVE_VERSION_SCRIPT_FLAG)
106 libomp_check_linker_flag(-static-libgcc LIBOMP_HAVE_STATIC_LIBGCC_FLAG)
107 libomp_check_linker_flag(-Wl,-z,noexecstack LIBOMP_HAVE_Z_NOEXECSTACK_FLAG)
108 libomp_check_linker_flag(-Wl,-fini=__kmp_internal_end_fini LIBOMP_HAVE_FINI_FLAG)
Jonathan Peyton2e013352015-07-15 16:05:30 +0000109endif()
110
111# Check Intel(R) C Compiler specific flags
112if(CMAKE_C_COMPILER_ID STREQUAL "Intel")
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +0000113 check_cxx_compiler_flag(/Qlong_double LIBOMP_HAVE_LONG_DOUBLE_FLAG)
114 check_cxx_compiler_flag(/Qdiag-disable:177 LIBOMP_HAVE_DIAG_DISABLE_177_FLAG)
115 check_cxx_compiler_flag(/Qinline-min-size=1 LIBOMP_HAVE_INLINE_MIN_SIZE_FLAG)
116 check_cxx_compiler_flag(-Qoption,cpp,--extended_float_types LIBOMP_HAVE_EXTENDED_FLOAT_TYPES_FLAG)
117 check_cxx_compiler_flag(-falign-stack=maintain-16-byte LIBOMP_HAVE_FALIGN_STACK_FLAG)
118 check_cxx_compiler_flag("-opt-streaming-stores never" LIBOMP_HAVE_OPT_STREAMING_STORES_FLAG)
119 libomp_check_linker_flag(-static-intel LIBOMP_HAVE_STATIC_INTEL_FLAG)
120 libomp_check_linker_flag(-no-intel-extensions LIBOMP_HAVE_NO_INTEL_EXTENSIONS_FLAG)
121 check_library_exists(irc_pic _intel_fast_memcpy "" LIBOMP_HAVE_IRC_PIC_LIBRARY)
Jonathan Peyton2e013352015-07-15 16:05:30 +0000122endif()
123
124# Checking Threading requirements
125find_package(Threads REQUIRED)
126if(WIN32)
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +0000127 if(NOT CMAKE_USE_WIN32_THREADS_INIT)
128 libomp_error_say("Need Win32 thread interface on Windows.")
129 endif()
Jonathan Peyton2e013352015-07-15 16:05:30 +0000130else()
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +0000131 if(NOT CMAKE_USE_PTHREADS_INIT)
132 libomp_error_say("Need pthread interface on Unix-like systems.")
133 endif()
Jonathan Peyton2e013352015-07-15 16:05:30 +0000134endif()
135
136# Find perl executable
137# Perl is used to create omp.h (and other headers) along with kmp_i18n_id.inc and kmp_i18n_default.inc
138find_package(Perl REQUIRED)
Jonathan Peyton4c91ad12016-01-26 19:44:31 +0000139# The perl scripts take the --os=/--arch= flags which expect a certain format for operating systems and arch's.
140# Until the perl scripts are removed, the most portable way to handle this is to have all operating systems that
Jonathan Peyton2e013352015-07-15 16:05:30 +0000141# are neither Windows nor Mac (Most Unix flavors) be considered lin to the perl scripts. This is rooted
142# in that all the Perl scripts check the operating system and will fail if it isn't "valid". This
143# temporary solution lets us avoid trying to enumerate all the possible OS values inside the Perl modules.
144if(WIN32)
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +0000145 set(LIBOMP_PERL_SCRIPT_OS win)
Jonathan Peyton2e013352015-07-15 16:05:30 +0000146elseif(APPLE)
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +0000147 set(LIBOMP_PERL_SCRIPT_OS mac)
Jonathan Peyton2e013352015-07-15 16:05:30 +0000148else()
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +0000149 set(LIBOMP_PERL_SCRIPT_OS lin)
Jonathan Peyton2e013352015-07-15 16:05:30 +0000150endif()
Jonathan Peyton4c91ad12016-01-26 19:44:31 +0000151if(IA32)
152 set(LIBOMP_PERL_SCRIPT_ARCH 32)
153elseif(MIC)
154 set(LIBOMP_PERL_SCRIPT_ARCH mic)
155elseif(INTEL64)
156 set(LIBOMP_PERL_SCRIPT_ARCH 32e)
157else()
158 set(LIBOMP_PERL_SCRIPT_ARCH ${LIBOMP_ARCH})
159endif()
Jonathan Peyton2e013352015-07-15 16:05:30 +0000160
161# Checking features
162# Check if version symbol assembler directives are supported
163libomp_check_version_symbols(LIBOMP_HAVE_VERSION_SYMBOLS)
164
165# Check if quad precision types are available
166if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +0000167 set(LIBOMP_HAVE_QUAD_PRECISION TRUE)
Jonathan Peyton2e013352015-07-15 16:05:30 +0000168elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel")
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +0000169 if(LIBOMP_HAVE_EXTENDED_FLOAT_TYPES_FLAG)
170 set(LIBOMP_HAVE_QUAD_PRECISION TRUE)
171 else()
172 set(LIBOMP_HAVE_QUAD_PRECISION TRUE)
173 endif()
Jonathan Peyton2e013352015-07-15 16:05:30 +0000174else()
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +0000175 set(LIBOMP_HAVE_QUAD_PRECISION FALSE)
Jonathan Peyton2e013352015-07-15 16:05:30 +0000176endif()
177
178# Check if adaptive locks are available
179if((${IA32} OR ${INTEL64}) AND NOT MSVC)
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +0000180 set(LIBOMP_HAVE_ADAPTIVE_LOCKS TRUE)
Jonathan Peyton2e013352015-07-15 16:05:30 +0000181else()
Jonathan Peyton5b4acbd2015-07-15 16:57:19 +0000182 set(LIBOMP_HAVE_ADAPTIVE_LOCKS FALSE)
Jonathan Peyton2e013352015-07-15 16:05:30 +0000183endif()
184
185# Check if stats-gathering is available
Jonathan Peytonb9e83262015-12-18 16:19:35 +0000186if(${LIBOMP_STATS})
187 check_c_source_compiles(
188 "__thread int x;
Jonathan Peyton975dabc2016-05-17 20:51:24 +0000189 int main(int argc, char** argv)
Jonathan Peytonb9e83262015-12-18 16:19:35 +0000190 { x = argc; return x; }"
191 LIBOMP_HAVE___THREAD)
192 check_c_source_compiles(
Jonathan Peyton975dabc2016-05-17 20:51:24 +0000193 "int main(int argc, char** argv)
Jonathan Peytonb9e83262015-12-18 16:19:35 +0000194 { unsigned long long t = __builtin_readcyclecounter(); return 0; }"
195 LIBOMP_HAVE___BUILTIN_READCYCLECOUNTER)
196 if(NOT LIBOMP_HAVE___BUILTIN_READCYCLECOUNTER)
Jonathan Peyton316af8d2016-03-28 18:53:10 +0000197 if(${IA32} OR ${INTEL64} OR ${MIC})
Jonathan Peytonb9e83262015-12-18 16:19:35 +0000198 check_include_file(x86intrin.h LIBOMP_HAVE_X86INTRIN_H)
199 libomp_append(CMAKE_REQUIRED_DEFINITIONS -DLIBOMP_HAVE_X86INTRIN_H LIBOMP_HAVE_X86INTRIN_H)
200 check_c_source_compiles(
201 "#ifdef LIBOMP_HAVE_X86INTRIN_H
202 # include <x86intrin.h>
203 #endif
204 int main(int argc, char** argv) { unsigned long long t = __rdtsc(); return 0; }" LIBOMP_HAVE___RDTSC)
205 set(CMAKE_REQUIRED_DEFINITIONS)
206 endif()
207 endif()
208 if(LIBOMP_HAVE___THREAD AND (LIBOMP_HAVE___RDTSC OR LIBOMP_HAVE___BUILTIN_READCYCLECOUNTER))
209 set(LIBOMP_HAVE_STATS TRUE)
210 else()
211 set(LIBOMP_HAVE_STATS FALSE)
212 endif()
Jonathan Peyton2e013352015-07-15 16:05:30 +0000213endif()
214
215# Check if OMPT support is available
Jonathan Peyton69e596a2015-10-29 20:56:24 +0000216# Currently, __builtin_frame_address() is required for OMPT
Jonas Hahnfeldd0ef19e2017-11-11 13:59:48 +0000217# Weak attribute is required for Unices (except Darwin), LIBPSAPI is used for Windows
Jonathan Peyton69e596a2015-10-29 20:56:24 +0000218check_c_source_compiles("int main(int argc, char** argv) {
219 void* p = __builtin_frame_address(0);
220 return 0;}" LIBOMP_HAVE___BUILTIN_FRAME_ADDRESS)
221check_c_source_compiles("__attribute__ ((weak)) int foo(int a) { return a*a; }
222 int main(int argc, char** argv) {
223 return foo(argc);}" LIBOMP_HAVE_WEAK_ATTRIBUTE)
224check_include_files("windows.h;psapi.h" LIBOMP_HAVE_PSAPI_H)
225check_library_exists(psapi EnumProcessModules "" LIBOMP_HAVE_LIBPSAPI)
226if(LIBOMP_HAVE_PSAPI_H AND LIBOMP_HAVE_LIBPSAPI)
227 set(LIBOMP_HAVE_PSAPI TRUE)
Jonathan Peyton2e013352015-07-15 16:05:30 +0000228endif()
Jonathan Peyton69e596a2015-10-29 20:56:24 +0000229if(NOT LIBOMP_HAVE___BUILTIN_FRAME_ADDRESS)
230 set(LIBOMP_HAVE_OMPT_SUPPORT FALSE)
231else()
Joachim Protzee5e4afd2018-01-02 21:09:00 +0000232 if( # hardware architecture supported?
233 ((LIBOMP_ARCH STREQUAL x86_64) OR
234 (LIBOMP_ARCH STREQUAL i386) OR
235# (LIBOMP_ARCH STREQUAL arm) OR
236 (LIBOMP_ARCH STREQUAL aarch64) OR
237 (LIBOMP_ARCH STREQUAL ppc64le) OR
Jonas Hahnfeld2488ae92019-07-25 14:36:20 +0000238 (LIBOMP_ARCH STREQUAL ppc64) OR
239 (LIBOMP_ARCH STREQUAL riscv64))
Joachim Protzee5e4afd2018-01-02 21:09:00 +0000240 AND # OS supported?
241 ((WIN32 AND LIBOMP_HAVE_PSAPI) OR APPLE OR (NOT WIN32 AND LIBOMP_HAVE_WEAK_ATTRIBUTE)))
Jonathan Peyton69e596a2015-10-29 20:56:24 +0000242 set(LIBOMP_HAVE_OMPT_SUPPORT TRUE)
243 else()
244 set(LIBOMP_HAVE_OMPT_SUPPORT FALSE)
245 endif()
246endif()
247
Jonathan Peyton01dcf362015-11-30 20:02:59 +0000248# Check if HWLOC support is available
249if(${LIBOMP_USE_HWLOC})
Jonathan Peyton0f3c2b92016-06-16 20:23:11 +0000250 set(CMAKE_REQUIRED_INCLUDES ${LIBOMP_HWLOC_INSTALL_DIR}/include)
251 check_include_file(hwloc.h LIBOMP_HAVE_HWLOC_H)
252 set(CMAKE_REQUIRED_INCLUDES)
253 find_library(LIBOMP_HWLOC_LIBRARY
254 NAMES hwloc libhwloc
255 HINTS ${LIBOMP_HWLOC_INSTALL_DIR}/lib)
256 if(LIBOMP_HWLOC_LIBRARY)
257 check_library_exists(${LIBOMP_HWLOC_LIBRARY} hwloc_topology_init
Jonathan Peyton01dcf362015-11-30 20:02:59 +0000258 ${LIBOMP_HWLOC_INSTALL_DIR}/lib LIBOMP_HAVE_LIBHWLOC)
Jonathan Peyton01dcf362015-11-30 20:02:59 +0000259 get_filename_component(LIBOMP_HWLOC_LIBRARY_DIR ${LIBOMP_HWLOC_LIBRARY} PATH)
Jonathan Peyton0f3c2b92016-06-16 20:23:11 +0000260 endif()
261 if(LIBOMP_HAVE_HWLOC_H AND LIBOMP_HAVE_LIBHWLOC AND LIBOMP_HWLOC_LIBRARY)
262 set(LIBOMP_HAVE_HWLOC TRUE)
263 else()
264 set(LIBOMP_HAVE_HWLOC FALSE)
265 libomp_say("Could not find hwloc")
Jonathan Peyton01dcf362015-11-30 20:02:59 +0000266 endif()
267endif()
268
Jonas Hahnfeld50fed042016-11-07 15:58:36 +0000269# Check if ThreadSanitizer support is available
270if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux" AND ${INTEL64})
271 set(LIBOMP_HAVE_TSAN_SUPPORT TRUE)
272else()
273 set(LIBOMP_HAVE_TSAN_SUPPORT FALSE)
274endif()