xref: /aosp_15_r20/external/pytorch/cmake/Modules/FindOpenMP.cmake (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2*da0073e9SAndroid Build Coastguard Worker# file Copyright.txt or https://cmake.org/licensing for details.
3*da0073e9SAndroid Build Coastguard Worker
4*da0073e9SAndroid Build Coastguard Worker#.rst:
5*da0073e9SAndroid Build Coastguard Worker# FindOpenMP
6*da0073e9SAndroid Build Coastguard Worker# ----------
7*da0073e9SAndroid Build Coastguard Worker#
8*da0073e9SAndroid Build Coastguard Worker# Finds OpenMP support
9*da0073e9SAndroid Build Coastguard Worker#
10*da0073e9SAndroid Build Coastguard Worker# This module can be used to detect OpenMP support in a compiler.  If
11*da0073e9SAndroid Build Coastguard Worker# the compiler supports OpenMP, the flags required to compile with
12*da0073e9SAndroid Build Coastguard Worker# OpenMP support are returned in variables for the different languages.
13*da0073e9SAndroid Build Coastguard Worker# The variables may be empty if the compiler does not need a special
14*da0073e9SAndroid Build Coastguard Worker# flag to support OpenMP.
15*da0073e9SAndroid Build Coastguard Worker#
16*da0073e9SAndroid Build Coastguard Worker# Variables
17*da0073e9SAndroid Build Coastguard Worker# ^^^^^^^^^
18*da0073e9SAndroid Build Coastguard Worker#
19*da0073e9SAndroid Build Coastguard Worker# The module exposes the components ``C``, ``CXX``, and ``Fortran``.
20*da0073e9SAndroid Build Coastguard Worker# Each of these controls the various languages to search OpenMP support for.
21*da0073e9SAndroid Build Coastguard Worker#
22*da0073e9SAndroid Build Coastguard Worker# Depending on the enabled components the following variables will be set:
23*da0073e9SAndroid Build Coastguard Worker#
24*da0073e9SAndroid Build Coastguard Worker# ``OpenMP_FOUND``
25*da0073e9SAndroid Build Coastguard Worker#   Variable indicating that OpenMP flags for all requested languages have been found.
26*da0073e9SAndroid Build Coastguard Worker#   If no components are specified, this is true if OpenMP settings for all enabled languages
27*da0073e9SAndroid Build Coastguard Worker#   were detected.
28*da0073e9SAndroid Build Coastguard Worker# ``OpenMP_VERSION``
29*da0073e9SAndroid Build Coastguard Worker#   Minimal version of the OpenMP standard detected among the requested languages,
30*da0073e9SAndroid Build Coastguard Worker#   or all enabled languages if no components were specified.
31*da0073e9SAndroid Build Coastguard Worker#
32*da0073e9SAndroid Build Coastguard Worker# This module will set the following variables per language in your
33*da0073e9SAndroid Build Coastguard Worker# project, where ``<lang>`` is one of C, CXX, or Fortran:
34*da0073e9SAndroid Build Coastguard Worker#
35*da0073e9SAndroid Build Coastguard Worker# ``OpenMP_<lang>_FOUND``
36*da0073e9SAndroid Build Coastguard Worker#   Variable indicating if OpenMP support for ``<lang>`` was detected.
37*da0073e9SAndroid Build Coastguard Worker# ``OpenMP_<lang>_FLAGS``
38*da0073e9SAndroid Build Coastguard Worker#   OpenMP compiler flags for ``<lang>``, separated by spaces.
39*da0073e9SAndroid Build Coastguard Worker#
40*da0073e9SAndroid Build Coastguard Worker# For linking with OpenMP code written in ``<lang>``, the following
41*da0073e9SAndroid Build Coastguard Worker# variables are provided:
42*da0073e9SAndroid Build Coastguard Worker#
43*da0073e9SAndroid Build Coastguard Worker# ``OpenMP_<lang>_LIB_NAMES``
44*da0073e9SAndroid Build Coastguard Worker#   :ref:`;-list <CMake Language Lists>` of libraries for OpenMP programs for ``<lang>``.
45*da0073e9SAndroid Build Coastguard Worker# ``OpenMP_<libname>_LIBRARY``
46*da0073e9SAndroid Build Coastguard Worker#   Location of the individual libraries needed for OpenMP support in ``<lang>``.
47*da0073e9SAndroid Build Coastguard Worker# ``OpenMP_<lang>_LIBRARIES``
48*da0073e9SAndroid Build Coastguard Worker#   A list of libraries needed to link with OpenMP code written in ``<lang>``.
49*da0073e9SAndroid Build Coastguard Worker#
50*da0073e9SAndroid Build Coastguard Worker# Additionally, the module provides :prop_tgt:`IMPORTED` targets:
51*da0073e9SAndroid Build Coastguard Worker#
52*da0073e9SAndroid Build Coastguard Worker# ``OpenMP::OpenMP_<lang>``
53*da0073e9SAndroid Build Coastguard Worker#   Target for using OpenMP from ``<lang>``.
54*da0073e9SAndroid Build Coastguard Worker#
55*da0073e9SAndroid Build Coastguard Worker# Specifically for Fortran, the module sets the following variables:
56*da0073e9SAndroid Build Coastguard Worker#
57*da0073e9SAndroid Build Coastguard Worker# ``OpenMP_Fortran_HAVE_OMPLIB_HEADER``
58*da0073e9SAndroid Build Coastguard Worker#   Boolean indicating if OpenMP is accessible through ``omp_lib.h``.
59*da0073e9SAndroid Build Coastguard Worker# ``OpenMP_Fortran_HAVE_OMPLIB_MODULE``
60*da0073e9SAndroid Build Coastguard Worker#   Boolean indicating if OpenMP is accessible through the ``omp_lib`` Fortran module.
61*da0073e9SAndroid Build Coastguard Worker#
62*da0073e9SAndroid Build Coastguard Worker# The module will also try to provide the OpenMP version variables:
63*da0073e9SAndroid Build Coastguard Worker#
64*da0073e9SAndroid Build Coastguard Worker# ``OpenMP_<lang>_SPEC_DATE``
65*da0073e9SAndroid Build Coastguard Worker#   Date of the OpenMP specification implemented by the ``<lang>`` compiler.
66*da0073e9SAndroid Build Coastguard Worker# ``OpenMP_<lang>_VERSION_MAJOR``
67*da0073e9SAndroid Build Coastguard Worker#   Major version of OpenMP implemented by the ``<lang>`` compiler.
68*da0073e9SAndroid Build Coastguard Worker# ``OpenMP_<lang>_VERSION_MINOR``
69*da0073e9SAndroid Build Coastguard Worker#   Minor version of OpenMP implemented by the ``<lang>`` compiler.
70*da0073e9SAndroid Build Coastguard Worker# ``OpenMP_<lang>_VERSION``
71*da0073e9SAndroid Build Coastguard Worker#   OpenMP version implemented by the ``<lang>`` compiler.
72*da0073e9SAndroid Build Coastguard Worker#
73*da0073e9SAndroid Build Coastguard Worker# The specification date is formatted as given in the OpenMP standard:
74*da0073e9SAndroid Build Coastguard Worker# ``yyyymm`` where ``yyyy`` and ``mm`` represents the year and month of
75*da0073e9SAndroid Build Coastguard Worker# the OpenMP specification implemented by the ``<lang>`` compiler.
76*da0073e9SAndroid Build Coastguard Worker
77*da0073e9SAndroid Build Coastguard Workercmake_policy(PUSH)
78*da0073e9SAndroid Build Coastguard Workercmake_policy(SET CMP0012 NEW) # if() recognizes numbers and booleans
79*da0073e9SAndroid Build Coastguard Workercmake_policy(SET CMP0054 NEW) # if() quoted variables not dereferenced
80*da0073e9SAndroid Build Coastguard Workercmake_policy(SET CMP0057 NEW) # if IN_LIST
81*da0073e9SAndroid Build Coastguard Worker
82*da0073e9SAndroid Build Coastguard Workerfunction(_OPENMP_FLAG_CANDIDATES LANG)
83*da0073e9SAndroid Build Coastguard Worker  if(NOT OpenMP_${LANG}_FLAG)
84*da0073e9SAndroid Build Coastguard Worker    unset(OpenMP_FLAG_CANDIDATES)
85*da0073e9SAndroid Build Coastguard Worker
86*da0073e9SAndroid Build Coastguard Worker    set(OMP_FLAG_GNU "-fopenmp")
87*da0073e9SAndroid Build Coastguard Worker    set(OMP_FLAG_Clang "-fopenmp=libomp" "-fopenmp=libiomp5" "-fopenmp")
88*da0073e9SAndroid Build Coastguard Worker
89*da0073e9SAndroid Build Coastguard Worker    if(WIN32)
90*da0073e9SAndroid Build Coastguard Worker      # Prefer Intel OpenMP header which can be provided by CMAKE_INCLUDE_PATH.
91*da0073e9SAndroid Build Coastguard Worker      # Note that CMAKE_INCLUDE_PATH is searched before CMAKE_SYSTEM_INCLUDE_PATH (MSVC path in this case)
92*da0073e9SAndroid Build Coastguard Worker      find_path(__header_dir "omp.h")
93*da0073e9SAndroid Build Coastguard Worker    else()
94*da0073e9SAndroid Build Coastguard Worker      # AppleClang may need a header file, search for omp.h with hints to brew
95*da0073e9SAndroid Build Coastguard Worker      # default include dir
96*da0073e9SAndroid Build Coastguard Worker      find_path(__header_dir "omp.h" HINTS "/usr/local/include")
97*da0073e9SAndroid Build Coastguard Worker    endif()
98*da0073e9SAndroid Build Coastguard Worker    set(OMP_FLAG_AppleClang "-Xpreprocessor -fopenmp" "-Xpreprocessor -fopenmp -I${__header_dir}")
99*da0073e9SAndroid Build Coastguard Worker
100*da0073e9SAndroid Build Coastguard Worker    set(OMP_FLAG_HP "+Oopenmp")
101*da0073e9SAndroid Build Coastguard Worker    if(WIN32)
102*da0073e9SAndroid Build Coastguard Worker      set(OMP_FLAG_Intel "-Qopenmp")
103*da0073e9SAndroid Build Coastguard Worker    elseif(CMAKE_${LANG}_COMPILER_ID STREQUAL "Intel" AND
104*da0073e9SAndroid Build Coastguard Worker           "${CMAKE_${LANG}_COMPILER_VERSION}" VERSION_LESS "15.0.0.20140528")
105*da0073e9SAndroid Build Coastguard Worker      set(OMP_FLAG_Intel "-openmp")
106*da0073e9SAndroid Build Coastguard Worker    else()
107*da0073e9SAndroid Build Coastguard Worker      set(OMP_FLAG_Intel "-qopenmp")
108*da0073e9SAndroid Build Coastguard Worker    endif()
109*da0073e9SAndroid Build Coastguard Worker    set(OMP_FLAG_MIPSpro "-mp")
110*da0073e9SAndroid Build Coastguard Worker    if(__header_dir MATCHES ".*Microsoft Visual Studio.*")
111*da0073e9SAndroid Build Coastguard Worker      # MSVC header. No need to pass it as additional include.
112*da0073e9SAndroid Build Coastguard Worker      set(OMP_FLAG_MSVC "-openmp:experimental" "-openmp")
113*da0073e9SAndroid Build Coastguard Worker    else()
114*da0073e9SAndroid Build Coastguard Worker      set(OMP_FLAG_MSVC "-openmp:experimental -I${__header_dir}" "-openmp -I${__header_dir}")
115*da0073e9SAndroid Build Coastguard Worker    endif()
116*da0073e9SAndroid Build Coastguard Worker    set(OMP_FLAG_PathScale "-openmp")
117*da0073e9SAndroid Build Coastguard Worker    set(OMP_FLAG_NAG "-openmp")
118*da0073e9SAndroid Build Coastguard Worker    set(OMP_FLAG_Absoft "-openmp")
119*da0073e9SAndroid Build Coastguard Worker    set(OMP_FLAG_PGI "-mp")
120*da0073e9SAndroid Build Coastguard Worker    set(OMP_FLAG_Flang "-fopenmp")
121*da0073e9SAndroid Build Coastguard Worker    set(OMP_FLAG_SunPro "-xopenmp")
122*da0073e9SAndroid Build Coastguard Worker    set(OMP_FLAG_XL "-qsmp=omp")
123*da0073e9SAndroid Build Coastguard Worker    # Cray compiler activate OpenMP with -h omp, which is enabled by default.
124*da0073e9SAndroid Build Coastguard Worker    set(OMP_FLAG_Cray " " "-h omp")
125*da0073e9SAndroid Build Coastguard Worker
126*da0073e9SAndroid Build Coastguard Worker    # If we know the correct flags, use those
127*da0073e9SAndroid Build Coastguard Worker    if(DEFINED OMP_FLAG_${CMAKE_${LANG}_COMPILER_ID})
128*da0073e9SAndroid Build Coastguard Worker      set(OpenMP_FLAG_CANDIDATES "${OMP_FLAG_${CMAKE_${LANG}_COMPILER_ID}}")
129*da0073e9SAndroid Build Coastguard Worker    # Fall back to reasonable default tries otherwise
130*da0073e9SAndroid Build Coastguard Worker    else()
131*da0073e9SAndroid Build Coastguard Worker      set(OpenMP_FLAG_CANDIDATES "-openmp" "-fopenmp" "-mp" " ")
132*da0073e9SAndroid Build Coastguard Worker    endif()
133*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_${LANG}_FLAG_CANDIDATES "${OpenMP_FLAG_CANDIDATES}" PARENT_SCOPE)
134*da0073e9SAndroid Build Coastguard Worker  else()
135*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_${LANG}_FLAG_CANDIDATES "${OpenMP_${LANG}_FLAG}" PARENT_SCOPE)
136*da0073e9SAndroid Build Coastguard Worker  endif()
137*da0073e9SAndroid Build Coastguard Workerendfunction()
138*da0073e9SAndroid Build Coastguard Worker
139*da0073e9SAndroid Build Coastguard Worker# sample openmp source code to test
140*da0073e9SAndroid Build Coastguard Workerset(OpenMP_C_CXX_TEST_SOURCE
141*da0073e9SAndroid Build Coastguard Worker"
142*da0073e9SAndroid Build Coastguard Worker#include <omp.h>
143*da0073e9SAndroid Build Coastguard Workerint main(void) {
144*da0073e9SAndroid Build Coastguard Worker#ifdef _OPENMP
145*da0073e9SAndroid Build Coastguard Worker  omp_get_max_threads();
146*da0073e9SAndroid Build Coastguard Worker  return 0;
147*da0073e9SAndroid Build Coastguard Worker#else
148*da0073e9SAndroid Build Coastguard Worker  breaks_on_purpose
149*da0073e9SAndroid Build Coastguard Worker#endif
150*da0073e9SAndroid Build Coastguard Worker}
151*da0073e9SAndroid Build Coastguard Worker")
152*da0073e9SAndroid Build Coastguard Worker
153*da0073e9SAndroid Build Coastguard Worker# in Fortran, an implementation may provide an omp_lib.h header
154*da0073e9SAndroid Build Coastguard Worker# or omp_lib module, or both (OpenMP standard, section 3.1)
155*da0073e9SAndroid Build Coastguard Worker# Furthmore !$ is the Fortran equivalent of #ifdef _OPENMP (OpenMP standard, 2.2.2)
156*da0073e9SAndroid Build Coastguard Worker# Without the conditional compilation, some compilers (e.g. PGI) might compile OpenMP code
157*da0073e9SAndroid Build Coastguard Worker# while not actually enabling OpenMP, building code sequentially
158*da0073e9SAndroid Build Coastguard Workerset(OpenMP_Fortran_TEST_SOURCE
159*da0073e9SAndroid Build Coastguard Worker  "
160*da0073e9SAndroid Build Coastguard Worker      program test
161*da0073e9SAndroid Build Coastguard Worker      @OpenMP_Fortran_INCLUDE_LINE@
162*da0073e9SAndroid Build Coastguard Worker  !$  integer :: n
163*da0073e9SAndroid Build Coastguard Worker      n = omp_get_num_threads()
164*da0073e9SAndroid Build Coastguard Worker      end program test
165*da0073e9SAndroid Build Coastguard Worker  "
166*da0073e9SAndroid Build Coastguard Worker)
167*da0073e9SAndroid Build Coastguard Worker
168*da0073e9SAndroid Build Coastguard Workerfunction(_OPENMP_WRITE_SOURCE_FILE LANG SRC_FILE_CONTENT_VAR SRC_FILE_NAME SRC_FILE_FULLPATH)
169*da0073e9SAndroid Build Coastguard Worker  set(WORK_DIR ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindOpenMP)
170*da0073e9SAndroid Build Coastguard Worker  if("${LANG}" STREQUAL "C")
171*da0073e9SAndroid Build Coastguard Worker    set(SRC_FILE "${WORK_DIR}/${SRC_FILE_NAME}.c")
172*da0073e9SAndroid Build Coastguard Worker    file(WRITE "${SRC_FILE}" "${OpenMP_C_CXX_${SRC_FILE_CONTENT_VAR}}")
173*da0073e9SAndroid Build Coastguard Worker  elseif("${LANG}" STREQUAL "CXX")
174*da0073e9SAndroid Build Coastguard Worker    set(SRC_FILE "${WORK_DIR}/${SRC_FILE_NAME}.cpp")
175*da0073e9SAndroid Build Coastguard Worker    file(WRITE "${SRC_FILE}" "${OpenMP_C_CXX_${SRC_FILE_CONTENT_VAR}}")
176*da0073e9SAndroid Build Coastguard Worker  elseif("${LANG}" STREQUAL "Fortran")
177*da0073e9SAndroid Build Coastguard Worker    set(SRC_FILE "${WORK_DIR}/${SRC_FILE_NAME}.f90")
178*da0073e9SAndroid Build Coastguard Worker    file(WRITE "${SRC_FILE}_in" "${OpenMP_Fortran_${SRC_FILE_CONTENT_VAR}}")
179*da0073e9SAndroid Build Coastguard Worker    configure_file("${SRC_FILE}_in" "${SRC_FILE}" @ONLY)
180*da0073e9SAndroid Build Coastguard Worker  endif()
181*da0073e9SAndroid Build Coastguard Worker  set(${SRC_FILE_FULLPATH} "${SRC_FILE}" PARENT_SCOPE)
182*da0073e9SAndroid Build Coastguard Workerendfunction()
183*da0073e9SAndroid Build Coastguard Worker
184*da0073e9SAndroid Build Coastguard Workerinclude(CMakeParseImplicitLinkInfo)
185*da0073e9SAndroid Build Coastguard Worker
186*da0073e9SAndroid Build Coastguard Workerfunction(_OPENMP_GET_FLAGS LANG FLAG_MODE OPENMP_FLAG_VAR OPENMP_LIB_NAMES_VAR)
187*da0073e9SAndroid Build Coastguard Worker  _OPENMP_FLAG_CANDIDATES("${LANG}")
188*da0073e9SAndroid Build Coastguard Worker  _OPENMP_WRITE_SOURCE_FILE("${LANG}" "TEST_SOURCE" OpenMPTryFlag _OPENMP_TEST_SRC)
189*da0073e9SAndroid Build Coastguard Worker
190*da0073e9SAndroid Build Coastguard Worker  unset(OpenMP_VERBOSE_COMPILE_OPTIONS)
191*da0073e9SAndroid Build Coastguard Worker  if(UNIX)
192*da0073e9SAndroid Build Coastguard Worker    separate_arguments(OpenMP_VERBOSE_OPTIONS UNIX_COMMAND "${CMAKE_${LANG}_VERBOSE_FLAG}")
193*da0073e9SAndroid Build Coastguard Worker  else()
194*da0073e9SAndroid Build Coastguard Worker    separate_arguments(OpenMP_VERBOSE_OPTIONS WINDOWS_COMMAND "${CMAKE_${LANG}_VERBOSE_FLAG}")
195*da0073e9SAndroid Build Coastguard Worker  endif()
196*da0073e9SAndroid Build Coastguard Worker  foreach(_VERBOSE_OPTION IN LISTS OpenMP_VERBOSE_OPTIONS)
197*da0073e9SAndroid Build Coastguard Worker    if(NOT _VERBOSE_OPTION MATCHES "^-Wl,")
198*da0073e9SAndroid Build Coastguard Worker      list(APPEND OpenMP_VERBOSE_COMPILE_OPTIONS ${_VERBOSE_OPTION})
199*da0073e9SAndroid Build Coastguard Worker    endif()
200*da0073e9SAndroid Build Coastguard Worker  endforeach()
201*da0073e9SAndroid Build Coastguard Worker
202*da0073e9SAndroid Build Coastguard Worker  foreach(OPENMP_FLAG IN LISTS OpenMP_${LANG}_FLAG_CANDIDATES)
203*da0073e9SAndroid Build Coastguard Worker    set(OPENMP_FLAGS_TEST "${OPENMP_FLAG}")
204*da0073e9SAndroid Build Coastguard Worker    if(OpenMP_VERBOSE_COMPILE_OPTIONS)
205*da0073e9SAndroid Build Coastguard Worker      string(APPEND OPENMP_FLAGS_TEST " ${OpenMP_VERBOSE_COMPILE_OPTIONS}")
206*da0073e9SAndroid Build Coastguard Worker    endif()
207*da0073e9SAndroid Build Coastguard Worker    string(REGEX REPLACE "[-/=+]" "" OPENMP_PLAIN_FLAG "${OPENMP_FLAG}")
208*da0073e9SAndroid Build Coastguard Worker
209*da0073e9SAndroid Build Coastguard Worker    # NOTE [ Linking both MKL and OpenMP ]
210*da0073e9SAndroid Build Coastguard Worker    #
211*da0073e9SAndroid Build Coastguard Worker    # It is crucial not to link two `libomp` libraries together, even when they
212*da0073e9SAndroid Build Coastguard Worker    # are both Intel or GNU. Otherwise, you will end up with this nasty error,
213*da0073e9SAndroid Build Coastguard Worker    # and may get incorrect results.
214*da0073e9SAndroid Build Coastguard Worker    #
215*da0073e9SAndroid Build Coastguard Worker    #   OMP: Error #15: Initializing libomp.dylib, but found libiomp5.dylib
216*da0073e9SAndroid Build Coastguard Worker    #   already initialized.
217*da0073e9SAndroid Build Coastguard Worker    #
218*da0073e9SAndroid Build Coastguard Worker    #   OMP: Hint This means that multiple copies of the OpenMP runtime have
219*da0073e9SAndroid Build Coastguard Worker    #   been linked into the program. That is dangerous, since it can degrade
220*da0073e9SAndroid Build Coastguard Worker    #   performance or cause incorrect results. The best thing to do is to
221*da0073e9SAndroid Build Coastguard Worker    #   ensure that only a single OpenMP runtime is linked into the process,
222*da0073e9SAndroid Build Coastguard Worker    #   e.g. by avoiding static linking of the OpenMP runtime in any library. As
223*da0073e9SAndroid Build Coastguard Worker    #   an unsafe, unsupported, undocumented workaround you can set the
224*da0073e9SAndroid Build Coastguard Worker    #   environment variable KMP_DUPLICATE_LIB_OK=TRUE to allow the program to
225*da0073e9SAndroid Build Coastguard Worker    #   continue to execute, but that may cause crashes or silently produce
226*da0073e9SAndroid Build Coastguard Worker    #   incorrect results. For more information, please see
227*da0073e9SAndroid Build Coastguard Worker    #   http://openmp.llvm.org/
228*da0073e9SAndroid Build Coastguard Worker    #
229*da0073e9SAndroid Build Coastguard Worker    # So here, before we test each flag combination, we first try directly
230*da0073e9SAndroid Build Coastguard Worker    # linking against any `libomp` MKL has linked to (if any and when MKL is
231*da0073e9SAndroid Build Coastguard Worker    # specified). This allows us to do sensible things in tricky (yet common)
232*da0073e9SAndroid Build Coastguard Worker    # conditions like:
233*da0073e9SAndroid Build Coastguard Worker    #   - using `clang` (so no native GNU OpenMP), and
234*da0073e9SAndroid Build Coastguard Worker    #   - having `brew` `libomp` installed at `/usr/local/`, and
235*da0073e9SAndroid Build Coastguard Worker    #   - having `conda` `mkl` installed at `$HOME/conda/`, with includes a copy
236*da0073e9SAndroid Build Coastguard Worker    #     of `libiomp5`.
237*da0073e9SAndroid Build Coastguard Worker    # Rather than blindly picking one, we pick what ever `FindMKL.cmake` chooses
238*da0073e9SAndroid Build Coastguard Worker    # to avoid conflicts.
239*da0073e9SAndroid Build Coastguard Worker    #
240*da0073e9SAndroid Build Coastguard Worker    # `FindMKL.cmake` calls `FindOpenMP.cmake` when trying to find `gomp` and
241*da0073e9SAndroid Build Coastguard Worker    # thus will cause infinite recursion if this is not taken care of. Therefore,
242*da0073e9SAndroid Build Coastguard Worker    # we record an internal flag to detect repeatedly inclusion.
243*da0073e9SAndroid Build Coastguard Worker
244*da0073e9SAndroid Build Coastguard Worker    if(NOT MKL_OPENMP_LIBRARY AND NOT IN_FIND_OMP AND BLAS STREQUAL "MKL")
245*da0073e9SAndroid Build Coastguard Worker      set(IN_FIND_OMP ON CACHE BOOL "" FORCE)
246*da0073e9SAndroid Build Coastguard Worker      find_package(MKL QUIET)
247*da0073e9SAndroid Build Coastguard Worker      unset(IN_FIND_OMP CACHE)
248*da0073e9SAndroid Build Coastguard Worker    endif()
249*da0073e9SAndroid Build Coastguard Worker
250*da0073e9SAndroid Build Coastguard Worker    if(MKL_OPENMP_LIBRARY)
251*da0073e9SAndroid Build Coastguard Worker      # If we already link OpenMP via MKL, use that. Otherwise at run-time
252*da0073e9SAndroid Build Coastguard Worker      # OpenMP will complain about being initialized twice (OMP: Error #15),
253*da0073e9SAndroid Build Coastguard Worker      # can may cause incorrect behavior.
254*da0073e9SAndroid Build Coastguard Worker      set(OpenMP_libomp_LIBRARY "${MKL_OPENMP_LIBRARY}" CACHE STRING "libomp location for OpenMP")
255*da0073e9SAndroid Build Coastguard Worker    endif()
256*da0073e9SAndroid Build Coastguard Worker
257*da0073e9SAndroid Build Coastguard Worker    if (NOT OpenMP_libomp_LIBRARY)
258*da0073e9SAndroid Build Coastguard Worker      find_library(OpenMP_libomp_LIBRARY
259*da0073e9SAndroid Build Coastguard Worker        NAMES omp gomp iomp5
260*da0073e9SAndroid Build Coastguard Worker        HINTS ${CMAKE_${LANG}_IMPLICIT_LINK_DIRECTORIES}
261*da0073e9SAndroid Build Coastguard Worker        DOC "libomp location for OpenMP"
262*da0073e9SAndroid Build Coastguard Worker      )
263*da0073e9SAndroid Build Coastguard Worker      mark_as_advanced(OpenMP_libomp_LIBRARY)
264*da0073e9SAndroid Build Coastguard Worker    endif()
265*da0073e9SAndroid Build Coastguard Worker
266*da0073e9SAndroid Build Coastguard Worker    if(OpenMP_libomp_LIBRARY MATCHES "iomp5")
267*da0073e9SAndroid Build Coastguard Worker      set(OpenMP_libiomp5_LIBRARY "${MKL_OPENMP_LIBRARY}" CACHE STRING "libiomp5 location for OpenMP")
268*da0073e9SAndroid Build Coastguard Worker      if("-fopenmp=libiomp5" IN_LIST OpenMP_${LANG}_FLAG_CANDIDATES)
269*da0073e9SAndroid Build Coastguard Worker        get_filename_component(iomp5_dir "${OpenMP_libomp_LIBRARY}" DIRECTORY)
270*da0073e9SAndroid Build Coastguard Worker        set(OPENMP_FLAGS_TEST "-fopenmp=libiomp5 -L${iomp5_dir}")
271*da0073e9SAndroid Build Coastguard Worker      endif()
272*da0073e9SAndroid Build Coastguard Worker    endif()
273*da0073e9SAndroid Build Coastguard Worker
274*da0073e9SAndroid Build Coastguard Worker    if(OpenMP_libomp_LIBRARY)
275*da0073e9SAndroid Build Coastguard Worker      message(STATUS "Check OMP with lib ${OpenMP_libomp_LIBRARY} and flags ${OPENMP_FLAGS_TEST}")
276*da0073e9SAndroid Build Coastguard Worker      try_compile( OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG} ${CMAKE_BINARY_DIR} ${_OPENMP_TEST_SRC}
277*da0073e9SAndroid Build Coastguard Worker        CMAKE_FLAGS "-DCOMPILE_DEFINITIONS:STRING=${OPENMP_FLAGS_TEST}"
278*da0073e9SAndroid Build Coastguard Worker        LINK_LIBRARIES ${CMAKE_${LANG}_VERBOSE_FLAG} ${OpenMP_libomp_LIBRARY}
279*da0073e9SAndroid Build Coastguard Worker        OUTPUT_VARIABLE OpenMP_TRY_COMPILE_OUTPUT
280*da0073e9SAndroid Build Coastguard Worker      )
281*da0073e9SAndroid Build Coastguard Worker      if(OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG})
282*da0073e9SAndroid Build Coastguard Worker        set("${OPENMP_FLAG_VAR}" "${OPENMP_FLAG}" PARENT_SCOPE)
283*da0073e9SAndroid Build Coastguard Worker        if(OpenMP_libomp_LIBRARY MATCHES "iomp5")
284*da0073e9SAndroid Build Coastguard Worker          set("${OPENMP_LIB_NAMES_VAR}" "libiomp5" PARENT_SCOPE)
285*da0073e9SAndroid Build Coastguard Worker        else()
286*da0073e9SAndroid Build Coastguard Worker          set("${OPENMP_LIB_NAMES_VAR}" "libomp" PARENT_SCOPE)
287*da0073e9SAndroid Build Coastguard Worker        endif()
288*da0073e9SAndroid Build Coastguard Worker        break()
289*da0073e9SAndroid Build Coastguard Worker      else()
290*da0073e9SAndroid Build Coastguard Worker        message(WARNING "Detecting ${LANG} OpenMP compiler ABI info compiled with the following output:\n${OpenMP_TRY_COMPILE_OUTPUT}")
291*da0073e9SAndroid Build Coastguard Worker      endif()
292*da0073e9SAndroid Build Coastguard Worker    endif()
293*da0073e9SAndroid Build Coastguard Worker
294*da0073e9SAndroid Build Coastguard Worker    try_compile( OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG} ${CMAKE_BINARY_DIR} ${_OPENMP_TEST_SRC}
295*da0073e9SAndroid Build Coastguard Worker      CMAKE_FLAGS "-DCOMPILE_DEFINITIONS:STRING=${OPENMP_FLAGS_TEST}"
296*da0073e9SAndroid Build Coastguard Worker      LINK_LIBRARIES ${CMAKE_${LANG}_VERBOSE_FLAG}
297*da0073e9SAndroid Build Coastguard Worker      OUTPUT_VARIABLE OpenMP_TRY_COMPILE_OUTPUT
298*da0073e9SAndroid Build Coastguard Worker    )
299*da0073e9SAndroid Build Coastguard Worker
300*da0073e9SAndroid Build Coastguard Worker    if(OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG})
301*da0073e9SAndroid Build Coastguard Worker      set("${OPENMP_FLAG_VAR}" "${OPENMP_FLAG}" PARENT_SCOPE)
302*da0073e9SAndroid Build Coastguard Worker
303*da0073e9SAndroid Build Coastguard Worker      if(CMAKE_${LANG}_VERBOSE_FLAG)
304*da0073e9SAndroid Build Coastguard Worker        unset(OpenMP_${LANG}_IMPLICIT_LIBRARIES)
305*da0073e9SAndroid Build Coastguard Worker        unset(OpenMP_${LANG}_IMPLICIT_LINK_DIRS)
306*da0073e9SAndroid Build Coastguard Worker        unset(OpenMP_${LANG}_IMPLICIT_FWK_DIRS)
307*da0073e9SAndroid Build Coastguard Worker        unset(OpenMP_${LANG}_LOG_VAR)
308*da0073e9SAndroid Build Coastguard Worker
309*da0073e9SAndroid Build Coastguard Worker        file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
310*da0073e9SAndroid Build Coastguard Worker        "Detecting ${LANG} OpenMP compiler ABI info compiled with the following output:\n${OpenMP_TRY_COMPILE_OUTPUT}\n\n")
311*da0073e9SAndroid Build Coastguard Worker
312*da0073e9SAndroid Build Coastguard Worker        cmake_parse_implicit_link_info("${OpenMP_TRY_COMPILE_OUTPUT}"
313*da0073e9SAndroid Build Coastguard Worker          OpenMP_${LANG}_IMPLICIT_LIBRARIES
314*da0073e9SAndroid Build Coastguard Worker          OpenMP_${LANG}_IMPLICIT_LINK_DIRS
315*da0073e9SAndroid Build Coastguard Worker          OpenMP_${LANG}_IMPLICIT_FWK_DIRS
316*da0073e9SAndroid Build Coastguard Worker          OpenMP_${LANG}_LOG_VAR
317*da0073e9SAndroid Build Coastguard Worker          "${CMAKE_${LANG}_IMPLICIT_OBJECT_REGEX}"
318*da0073e9SAndroid Build Coastguard Worker        )
319*da0073e9SAndroid Build Coastguard Worker
320*da0073e9SAndroid Build Coastguard Worker        file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
321*da0073e9SAndroid Build Coastguard Worker        "Parsed ${LANG} OpenMP implicit link information from above output:\n${OpenMP_${LANG}_LOG_VAR}\n\n")
322*da0073e9SAndroid Build Coastguard Worker
323*da0073e9SAndroid Build Coastguard Worker        unset(_OPENMP_LIB_NAMES)
324*da0073e9SAndroid Build Coastguard Worker        foreach(_OPENMP_IMPLICIT_LIB IN LISTS OpenMP_${LANG}_IMPLICIT_LIBRARIES)
325*da0073e9SAndroid Build Coastguard Worker          get_filename_component(_OPENMP_IMPLICIT_LIB_DIR "${_OPENMP_IMPLICIT_LIB}" DIRECTORY)
326*da0073e9SAndroid Build Coastguard Worker          get_filename_component(_OPENMP_IMPLICIT_LIB_NAME "${_OPENMP_IMPLICIT_LIB}" NAME)
327*da0073e9SAndroid Build Coastguard Worker          get_filename_component(_OPENMP_IMPLICIT_LIB_PLAIN "${_OPENMP_IMPLICIT_LIB}" NAME_WE)
328*da0073e9SAndroid Build Coastguard Worker          string(REGEX REPLACE "([][+.*?()^$])" "\\\\\\1" _OPENMP_IMPLICIT_LIB_PLAIN_ESC "${_OPENMP_IMPLICIT_LIB_PLAIN}")
329*da0073e9SAndroid Build Coastguard Worker          string(REGEX REPLACE "([][+.*?()^$])" "\\\\\\1" _OPENMP_IMPLICIT_LIB_PATH_ESC "${_OPENMP_IMPLICIT_LIB}")
330*da0073e9SAndroid Build Coastguard Worker          if(NOT ( "${_OPENMP_IMPLICIT_LIB}" IN_LIST CMAKE_${LANG}_IMPLICIT_LINK_LIBRARIES
331*da0073e9SAndroid Build Coastguard Worker            OR "${CMAKE_${LANG}_STANDARD_LIBRARIES}" MATCHES "(^| )(-Wl,)?(-l)?(${_OPENMP_IMPLICIT_LIB_PLAIN_ESC}|${_OPENMP_IMPLICIT_LIB_PATH_ESC})( |$)"
332*da0073e9SAndroid Build Coastguard Worker            OR "${CMAKE_${LANG}_LINK_EXECUTABLE}" MATCHES "(^| )(-Wl,)?(-l)?(${_OPENMP_IMPLICIT_LIB_PLAIN_ESC}|${_OPENMP_IMPLICIT_LIB_PATH_ESC})( |$)" ) )
333*da0073e9SAndroid Build Coastguard Worker            if(_OPENMP_IMPLICIT_LIB_DIR)
334*da0073e9SAndroid Build Coastguard Worker              set(OpenMP_${_OPENMP_IMPLICIT_LIB_PLAIN}_LIBRARY "${_OPENMP_IMPLICIT_LIB}" CACHE FILEPATH
335*da0073e9SAndroid Build Coastguard Worker                "Path to the ${_OPENMP_IMPLICIT_LIB_PLAIN} library for OpenMP")
336*da0073e9SAndroid Build Coastguard Worker            else()
337*da0073e9SAndroid Build Coastguard Worker              find_library(OpenMP_${_OPENMP_IMPLICIT_LIB_PLAIN}_LIBRARY
338*da0073e9SAndroid Build Coastguard Worker                NAMES "${_OPENMP_IMPLICIT_LIB_NAME}"
339*da0073e9SAndroid Build Coastguard Worker                DOC "Path to the ${_OPENMP_IMPLICIT_LIB_PLAIN} library for OpenMP"
340*da0073e9SAndroid Build Coastguard Worker                HINTS ${OpenMP_${LANG}_IMPLICIT_LINK_DIRS}
341*da0073e9SAndroid Build Coastguard Worker                CMAKE_FIND_ROOT_PATH_BOTH
342*da0073e9SAndroid Build Coastguard Worker                NO_DEFAULT_PATH
343*da0073e9SAndroid Build Coastguard Worker              )
344*da0073e9SAndroid Build Coastguard Worker            endif()
345*da0073e9SAndroid Build Coastguard Worker            mark_as_advanced(OpenMP_${_OPENMP_IMPLICIT_LIB_PLAIN}_LIBRARY)
346*da0073e9SAndroid Build Coastguard Worker            list(APPEND _OPENMP_LIB_NAMES ${_OPENMP_IMPLICIT_LIB_PLAIN})
347*da0073e9SAndroid Build Coastguard Worker          endif()
348*da0073e9SAndroid Build Coastguard Worker        endforeach()
349*da0073e9SAndroid Build Coastguard Worker        set("${OPENMP_LIB_NAMES_VAR}" "${_OPENMP_LIB_NAMES}" PARENT_SCOPE)
350*da0073e9SAndroid Build Coastguard Worker      else()
351*da0073e9SAndroid Build Coastguard Worker        # We do not know how to extract implicit OpenMP libraries for this compiler.
352*da0073e9SAndroid Build Coastguard Worker        # Assume that it handles them automatically, e.g. the Intel Compiler on
353*da0073e9SAndroid Build Coastguard Worker        # Windows should put the dependency in its object files.
354*da0073e9SAndroid Build Coastguard Worker        set("${OPENMP_LIB_NAMES_VAR}" "" PARENT_SCOPE)
355*da0073e9SAndroid Build Coastguard Worker      endif()
356*da0073e9SAndroid Build Coastguard Worker      break()
357*da0073e9SAndroid Build Coastguard Worker    elseif((CMAKE_${LANG}_COMPILER_ID STREQUAL "AppleClang") AND
358*da0073e9SAndroid Build Coastguard Worker           (NOT CMAKE_${LANG}_COMPILER_VERSION VERSION_LESS "7.0"))
359*da0073e9SAndroid Build Coastguard Worker
360*da0073e9SAndroid Build Coastguard Worker      # LLVM 3.7 supports OpenMP 3.1, and continues to add more features to
361*da0073e9SAndroid Build Coastguard Worker      # support newer OpenMP standards in new versions.
362*da0073e9SAndroid Build Coastguard Worker      # http://releases.llvm.org/3.7.0/tools/clang/docs/ReleaseNotes.html#openmp-support
363*da0073e9SAndroid Build Coastguard Worker      #
364*da0073e9SAndroid Build Coastguard Worker      # Apple Clang 7.0 is the first version based on LLVM 3.7 or later.
365*da0073e9SAndroid Build Coastguard Worker      # https://en.wikipedia.org/wiki/Xcode#Latest_versions
366*da0073e9SAndroid Build Coastguard Worker      #
367*da0073e9SAndroid Build Coastguard Worker      # Check for separate OpenMP library on AppleClang 7+
368*da0073e9SAndroid Build Coastguard Worker      find_library(OpenMP_libomp_LIBRARY
369*da0073e9SAndroid Build Coastguard Worker        NAMES omp gomp iomp5
370*da0073e9SAndroid Build Coastguard Worker        HINTS ${CMAKE_${LANG}_IMPLICIT_LINK_DIRECTORIES}
371*da0073e9SAndroid Build Coastguard Worker        DOC "libomp location for OpenMP"
372*da0073e9SAndroid Build Coastguard Worker      )
373*da0073e9SAndroid Build Coastguard Worker      mark_as_advanced(OpenMP_libomp_LIBRARY)
374*da0073e9SAndroid Build Coastguard Worker
375*da0073e9SAndroid Build Coastguard Worker      if(OpenMP_libomp_LIBRARY)
376*da0073e9SAndroid Build Coastguard Worker        try_compile( OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG} ${CMAKE_BINARY_DIR} ${_OPENMP_TEST_SRC}
377*da0073e9SAndroid Build Coastguard Worker          CMAKE_FLAGS "-DCOMPILE_DEFINITIONS:STRING=${OPENMP_FLAGS_TEST}"
378*da0073e9SAndroid Build Coastguard Worker          LINK_LIBRARIES ${CMAKE_${LANG}_VERBOSE_FLAG} ${OpenMP_libomp_LIBRARY}
379*da0073e9SAndroid Build Coastguard Worker          OUTPUT_VARIABLE OpenMP_TRY_COMPILE_OUTPUT
380*da0073e9SAndroid Build Coastguard Worker        )
381*da0073e9SAndroid Build Coastguard Worker        if(OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG})
382*da0073e9SAndroid Build Coastguard Worker          set("${OPENMP_FLAG_VAR}" "${OPENMP_FLAG}" PARENT_SCOPE)
383*da0073e9SAndroid Build Coastguard Worker          set("${OPENMP_LIB_NAMES_VAR}" "libomp" PARENT_SCOPE)
384*da0073e9SAndroid Build Coastguard Worker          break()
385*da0073e9SAndroid Build Coastguard Worker        endif()
386*da0073e9SAndroid Build Coastguard Worker      endif()
387*da0073e9SAndroid Build Coastguard Worker    else()
388*da0073e9SAndroid Build Coastguard Worker      file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
389*da0073e9SAndroid Build Coastguard Worker        "Detecting ${LANG} OpenMP failed with the following output:\n${OpenMP_TRY_COMPILE_OUTPUT}\n\n")
390*da0073e9SAndroid Build Coastguard Worker    endif()
391*da0073e9SAndroid Build Coastguard Worker    if (NOT ${OpenMP_${LANG}_FIND_QUIETLY})
392*da0073e9SAndroid Build Coastguard Worker      message(STATUS "OpenMP try_compile log:\n${OpenMP_TRY_COMPILE_OUTPUT}\n\n")
393*da0073e9SAndroid Build Coastguard Worker    endif()
394*da0073e9SAndroid Build Coastguard Worker    set("${OPENMP_LIB_NAMES_VAR}" "NOTFOUND" PARENT_SCOPE)
395*da0073e9SAndroid Build Coastguard Worker    set("${OPENMP_FLAG_VAR}" "NOTFOUND" PARENT_SCOPE)
396*da0073e9SAndroid Build Coastguard Worker  endforeach()
397*da0073e9SAndroid Build Coastguard Worker
398*da0073e9SAndroid Build Coastguard Worker  unset(OpenMP_VERBOSE_COMPILE_OPTIONS)
399*da0073e9SAndroid Build Coastguard Workerendfunction()
400*da0073e9SAndroid Build Coastguard Worker
401*da0073e9SAndroid Build Coastguard Workerset(OpenMP_C_CXX_CHECK_VERSION_SOURCE
402*da0073e9SAndroid Build Coastguard Worker"
403*da0073e9SAndroid Build Coastguard Worker#include <stdio.h>
404*da0073e9SAndroid Build Coastguard Worker#include <omp.h>
405*da0073e9SAndroid Build Coastguard Workerconst char ompver_str[] = { 'I', 'N', 'F', 'O', ':', 'O', 'p', 'e', 'n', 'M',
406*da0073e9SAndroid Build Coastguard Worker                            'P', '-', 'd', 'a', 't', 'e', '[',
407*da0073e9SAndroid Build Coastguard Worker                            ('0' + ((_OPENMP/100000)%10)),
408*da0073e9SAndroid Build Coastguard Worker                            ('0' + ((_OPENMP/10000)%10)),
409*da0073e9SAndroid Build Coastguard Worker                            ('0' + ((_OPENMP/1000)%10)),
410*da0073e9SAndroid Build Coastguard Worker                            ('0' + ((_OPENMP/100)%10)),
411*da0073e9SAndroid Build Coastguard Worker                            ('0' + ((_OPENMP/10)%10)),
412*da0073e9SAndroid Build Coastguard Worker                            ('0' + ((_OPENMP/1)%10)),
413*da0073e9SAndroid Build Coastguard Worker                            ']', '\\0' };
414*da0073e9SAndroid Build Coastguard Workerint main(void)
415*da0073e9SAndroid Build Coastguard Worker{
416*da0073e9SAndroid Build Coastguard Worker  puts(ompver_str);
417*da0073e9SAndroid Build Coastguard Worker  return 0;
418*da0073e9SAndroid Build Coastguard Worker}
419*da0073e9SAndroid Build Coastguard Worker")
420*da0073e9SAndroid Build Coastguard Worker
421*da0073e9SAndroid Build Coastguard Workerset(OpenMP_Fortran_CHECK_VERSION_SOURCE
422*da0073e9SAndroid Build Coastguard Worker"
423*da0073e9SAndroid Build Coastguard Worker      program omp_ver
424*da0073e9SAndroid Build Coastguard Worker      @OpenMP_Fortran_INCLUDE_LINE@
425*da0073e9SAndroid Build Coastguard Worker      integer, parameter :: zero = ichar('0')
426*da0073e9SAndroid Build Coastguard Worker      integer, parameter :: ompv = openmp_version
427*da0073e9SAndroid Build Coastguard Worker      character, dimension(24), parameter :: ompver_str =&
428*da0073e9SAndroid Build Coastguard Worker      (/ 'I', 'N', 'F', 'O', ':', 'O', 'p', 'e', 'n', 'M', 'P', '-',&
429*da0073e9SAndroid Build Coastguard Worker         'd', 'a', 't', 'e', '[',&
430*da0073e9SAndroid Build Coastguard Worker         char(zero + mod(ompv/100000, 10)),&
431*da0073e9SAndroid Build Coastguard Worker         char(zero + mod(ompv/10000, 10)),&
432*da0073e9SAndroid Build Coastguard Worker         char(zero + mod(ompv/1000, 10)),&
433*da0073e9SAndroid Build Coastguard Worker         char(zero + mod(ompv/100, 10)),&
434*da0073e9SAndroid Build Coastguard Worker         char(zero + mod(ompv/10, 10)),&
435*da0073e9SAndroid Build Coastguard Worker         char(zero + mod(ompv/1, 10)), ']' /)
436*da0073e9SAndroid Build Coastguard Worker      print *, ompver_str
437*da0073e9SAndroid Build Coastguard Worker      end program omp_ver
438*da0073e9SAndroid Build Coastguard Worker")
439*da0073e9SAndroid Build Coastguard Worker
440*da0073e9SAndroid Build Coastguard Workerfunction(_OPENMP_GET_SPEC_DATE LANG SPEC_DATE)
441*da0073e9SAndroid Build Coastguard Worker  _OPENMP_WRITE_SOURCE_FILE("${LANG}" "CHECK_VERSION_SOURCE" OpenMPCheckVersion _OPENMP_TEST_SRC)
442*da0073e9SAndroid Build Coastguard Worker
443*da0073e9SAndroid Build Coastguard Worker  set(BIN_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindOpenMP/ompver_${LANG}.bin")
444*da0073e9SAndroid Build Coastguard Worker  string(REGEX REPLACE "[-/=+]" "" OPENMP_PLAIN_FLAG "${OPENMP_FLAG}")
445*da0073e9SAndroid Build Coastguard Worker  try_compile(OpenMP_SPECTEST_${LANG}_${OPENMP_PLAIN_FLAG} "${CMAKE_BINARY_DIR}" "${_OPENMP_TEST_SRC}"
446*da0073e9SAndroid Build Coastguard Worker              CMAKE_FLAGS "-DCOMPILE_DEFINITIONS:STRING=${OpenMP_${LANG}_FLAGS}"
447*da0073e9SAndroid Build Coastguard Worker              COPY_FILE ${BIN_FILE}
448*da0073e9SAndroid Build Coastguard Worker              OUTPUT_VARIABLE OpenMP_TRY_COMPILE_OUTPUT)
449*da0073e9SAndroid Build Coastguard Worker
450*da0073e9SAndroid Build Coastguard Worker  if(${OpenMP_SPECTEST_${LANG}_${OPENMP_PLAIN_FLAG}})
451*da0073e9SAndroid Build Coastguard Worker    file(STRINGS ${BIN_FILE} specstr LIMIT_COUNT 1 REGEX "INFO:OpenMP-date")
452*da0073e9SAndroid Build Coastguard Worker    set(regex_spec_date ".*INFO:OpenMP-date\\[0*([^]]*)\\].*")
453*da0073e9SAndroid Build Coastguard Worker    if("${specstr}" MATCHES "${regex_spec_date}")
454*da0073e9SAndroid Build Coastguard Worker      set(${SPEC_DATE} "${CMAKE_MATCH_1}" PARENT_SCOPE)
455*da0073e9SAndroid Build Coastguard Worker    endif()
456*da0073e9SAndroid Build Coastguard Worker  else()
457*da0073e9SAndroid Build Coastguard Worker    file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
458*da0073e9SAndroid Build Coastguard Worker        "Detecting ${LANG} OpenMP version failed with the following output:\n${OpenMP_TRY_COMPILE_OUTPUT}\n\n")
459*da0073e9SAndroid Build Coastguard Worker  endif()
460*da0073e9SAndroid Build Coastguard Workerendfunction()
461*da0073e9SAndroid Build Coastguard Worker
462*da0073e9SAndroid Build Coastguard Workermacro(_OPENMP_SET_VERSION_BY_SPEC_DATE LANG)
463*da0073e9SAndroid Build Coastguard Worker  set(OpenMP_SPEC_DATE_MAP
464*da0073e9SAndroid Build Coastguard Worker    # Preview versions
465*da0073e9SAndroid Build Coastguard Worker    "201611=5.0" # OpenMP 5.0 preview 1
466*da0073e9SAndroid Build Coastguard Worker    # Combined versions, 2.5 onwards
467*da0073e9SAndroid Build Coastguard Worker    "201511=4.5"
468*da0073e9SAndroid Build Coastguard Worker    "201307=4.0"
469*da0073e9SAndroid Build Coastguard Worker    "201107=3.1"
470*da0073e9SAndroid Build Coastguard Worker    "200805=3.0"
471*da0073e9SAndroid Build Coastguard Worker    "200505=2.5"
472*da0073e9SAndroid Build Coastguard Worker    # C/C++ version 2.0
473*da0073e9SAndroid Build Coastguard Worker    "200203=2.0"
474*da0073e9SAndroid Build Coastguard Worker    # Fortran version 2.0
475*da0073e9SAndroid Build Coastguard Worker    "200011=2.0"
476*da0073e9SAndroid Build Coastguard Worker    # Fortran version 1.1
477*da0073e9SAndroid Build Coastguard Worker    "199911=1.1"
478*da0073e9SAndroid Build Coastguard Worker    # C/C++ version 1.0 (there's no 1.1 for C/C++)
479*da0073e9SAndroid Build Coastguard Worker    "199810=1.0"
480*da0073e9SAndroid Build Coastguard Worker    # Fortran version 1.0
481*da0073e9SAndroid Build Coastguard Worker    "199710=1.0"
482*da0073e9SAndroid Build Coastguard Worker  )
483*da0073e9SAndroid Build Coastguard Worker
484*da0073e9SAndroid Build Coastguard Worker  if(OpenMP_${LANG}_SPEC_DATE)
485*da0073e9SAndroid Build Coastguard Worker    string(REGEX MATCHALL "${OpenMP_${LANG}_SPEC_DATE}=([0-9]+)\\.([0-9]+)" _version_match "${OpenMP_SPEC_DATE_MAP}")
486*da0073e9SAndroid Build Coastguard Worker  else()
487*da0073e9SAndroid Build Coastguard Worker    set(_version_match "")
488*da0073e9SAndroid Build Coastguard Worker  endif()
489*da0073e9SAndroid Build Coastguard Worker  if(NOT _version_match STREQUAL "")
490*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_${LANG}_VERSION_MAJOR ${CMAKE_MATCH_1})
491*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_${LANG}_VERSION_MINOR ${CMAKE_MATCH_2})
492*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_${LANG}_VERSION "${OpenMP_${LANG}_VERSION_MAJOR}.${OpenMP_${LANG}_VERSION_MINOR}")
493*da0073e9SAndroid Build Coastguard Worker  else()
494*da0073e9SAndroid Build Coastguard Worker    unset(OpenMP_${LANG}_VERSION_MAJOR)
495*da0073e9SAndroid Build Coastguard Worker    unset(OpenMP_${LANG}_VERSION_MINOR)
496*da0073e9SAndroid Build Coastguard Worker    unset(OpenMP_${LANG}_VERSION)
497*da0073e9SAndroid Build Coastguard Worker  endif()
498*da0073e9SAndroid Build Coastguard Worker  unset(_version_match)
499*da0073e9SAndroid Build Coastguard Worker  unset(OpenMP_SPEC_DATE_MAP)
500*da0073e9SAndroid Build Coastguard Workerendmacro()
501*da0073e9SAndroid Build Coastguard Worker
502*da0073e9SAndroid Build Coastguard Workerforeach(LANG IN ITEMS C CXX)
503*da0073e9SAndroid Build Coastguard Worker  if(CMAKE_${LANG}_COMPILER_LOADED)
504*da0073e9SAndroid Build Coastguard Worker    if(NOT DEFINED OpenMP_${LANG}_FLAGS OR "${OpenMP_${LANG}_FLAGS}" STREQUAL "NOTFOUND"
505*da0073e9SAndroid Build Coastguard Worker      OR NOT DEFINED OpenMP_${LANG}_LIB_NAMES OR "${OpenMP_${LANG}_LIB_NAMES}" STREQUAL "NOTFOUND")
506*da0073e9SAndroid Build Coastguard Worker      _OPENMP_GET_FLAGS("${LANG}" "${LANG}" OpenMP_${LANG}_FLAGS_WORK OpenMP_${LANG}_LIB_NAMES_WORK)
507*da0073e9SAndroid Build Coastguard Worker    endif()
508*da0073e9SAndroid Build Coastguard Worker
509*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_${LANG}_FLAGS "${OpenMP_${LANG}_FLAGS_WORK}"
510*da0073e9SAndroid Build Coastguard Worker      CACHE STRING "${LANG} compiler flags for OpenMP parallelization")
511*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_${LANG}_LIB_NAMES "${OpenMP_${LANG}_LIB_NAMES_WORK}"
512*da0073e9SAndroid Build Coastguard Worker      CACHE STRING "${LANG} compiler libraries for OpenMP parallelization")
513*da0073e9SAndroid Build Coastguard Worker    mark_as_advanced(OpenMP_${LANG}_FLAGS OpenMP_${LANG}_LIB_NAMES)
514*da0073e9SAndroid Build Coastguard Worker  endif()
515*da0073e9SAndroid Build Coastguard Workerendforeach()
516*da0073e9SAndroid Build Coastguard Worker
517*da0073e9SAndroid Build Coastguard Workerif(CMAKE_Fortran_COMPILER_LOADED)
518*da0073e9SAndroid Build Coastguard Worker  if(NOT DEFINED OpenMP_Fortran_FLAGS OR "${OpenMP_Fortran_FLAGS}" STREQUAL "NOTFOUND"
519*da0073e9SAndroid Build Coastguard Worker    OR NOT DEFINED OpenMP_Fortran_LIB_NAMES OR "${OpenMP_Fortran_LIB_NAMES}" STREQUAL "NOTFOUND"
520*da0073e9SAndroid Build Coastguard Worker    OR NOT DEFINED OpenMP_Fortran_HAVE_OMPLIB_MODULE)
521*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_Fortran_INCLUDE_LINE "use omp_lib\n      implicit none")
522*da0073e9SAndroid Build Coastguard Worker    _OPENMP_GET_FLAGS("Fortran" "FortranHeader" OpenMP_Fortran_FLAGS_WORK OpenMP_Fortran_LIB_NAMES_WORK)
523*da0073e9SAndroid Build Coastguard Worker    if(OpenMP_Fortran_FLAGS_WORK)
524*da0073e9SAndroid Build Coastguard Worker      set(OpenMP_Fortran_HAVE_OMPLIB_MODULE TRUE CACHE BOOL INTERNAL "")
525*da0073e9SAndroid Build Coastguard Worker    endif()
526*da0073e9SAndroid Build Coastguard Worker
527*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_Fortran_FLAGS "${OpenMP_Fortran_FLAGS_WORK}"
528*da0073e9SAndroid Build Coastguard Worker      CACHE STRING "Fortran compiler flags for OpenMP parallelization")
529*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_Fortran_LIB_NAMES "${OpenMP_Fortran_LIB_NAMES_WORK}"
530*da0073e9SAndroid Build Coastguard Worker      CACHE STRING "Fortran compiler libraries for OpenMP parallelization")
531*da0073e9SAndroid Build Coastguard Worker    mark_as_advanced(OpenMP_Fortran_FLAGS OpenMP_Fortran_LIB_NAMES)
532*da0073e9SAndroid Build Coastguard Worker  endif()
533*da0073e9SAndroid Build Coastguard Worker
534*da0073e9SAndroid Build Coastguard Worker  if(NOT DEFINED OpenMP_Fortran_FLAGS OR "${OpenMP_Fortran_FLAGS}" STREQUAL "NOTFOUND"
535*da0073e9SAndroid Build Coastguard Worker    OR NOT DEFINED OpenMP_Fortran_LIB_NAMES OR "${OpenMP_Fortran_LIB_NAMES}" STREQUAL "NOTFOUND"
536*da0073e9SAndroid Build Coastguard Worker    OR NOT DEFINED OpenMP_Fortran_HAVE_OMPLIB_HEADER)
537*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_Fortran_INCLUDE_LINE "implicit none\n      include 'omp_lib.h'")
538*da0073e9SAndroid Build Coastguard Worker    _OPENMP_GET_FLAGS("Fortran" "FortranModule" OpenMP_Fortran_FLAGS_WORK OpenMP_Fortran_LIB_NAMES_WORK)
539*da0073e9SAndroid Build Coastguard Worker    if(OpenMP_Fortran_FLAGS_WORK)
540*da0073e9SAndroid Build Coastguard Worker      set(OpenMP_Fortran_HAVE_OMPLIB_HEADER TRUE CACHE BOOL INTERNAL "")
541*da0073e9SAndroid Build Coastguard Worker    endif()
542*da0073e9SAndroid Build Coastguard Worker
543*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_Fortran_FLAGS "${OpenMP_Fortran_FLAGS_WORK}"
544*da0073e9SAndroid Build Coastguard Worker      CACHE STRING "Fortran compiler flags for OpenMP parallelization")
545*da0073e9SAndroid Build Coastguard Worker
546*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_Fortran_LIB_NAMES "${OpenMP_Fortran_LIB_NAMES}"
547*da0073e9SAndroid Build Coastguard Worker      CACHE STRING "Fortran compiler libraries for OpenMP parallelization")
548*da0073e9SAndroid Build Coastguard Worker  endif()
549*da0073e9SAndroid Build Coastguard Worker
550*da0073e9SAndroid Build Coastguard Worker  if(OpenMP_Fortran_HAVE_OMPLIB_MODULE)
551*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_Fortran_INCLUDE_LINE "use omp_lib\n      implicit none")
552*da0073e9SAndroid Build Coastguard Worker  else()
553*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_Fortran_INCLUDE_LINE "implicit none\n      include 'omp_lib.h'")
554*da0073e9SAndroid Build Coastguard Worker  endif()
555*da0073e9SAndroid Build Coastguard Workerendif()
556*da0073e9SAndroid Build Coastguard Worker
557*da0073e9SAndroid Build Coastguard Workerif(NOT OpenMP_FIND_COMPONENTS)
558*da0073e9SAndroid Build Coastguard Worker  set(OpenMP_FINDLIST C CXX Fortran)
559*da0073e9SAndroid Build Coastguard Workerelse()
560*da0073e9SAndroid Build Coastguard Worker  set(OpenMP_FINDLIST ${OpenMP_FIND_COMPONENTS})
561*da0073e9SAndroid Build Coastguard Workerendif()
562*da0073e9SAndroid Build Coastguard Worker
563*da0073e9SAndroid Build Coastguard Workerunset(_OpenMP_MIN_VERSION)
564*da0073e9SAndroid Build Coastguard Worker
565*da0073e9SAndroid Build Coastguard Workerinclude(FindPackageHandleStandardArgs)
566*da0073e9SAndroid Build Coastguard Worker
567*da0073e9SAndroid Build Coastguard Workerforeach(LANG IN LISTS OpenMP_FINDLIST)
568*da0073e9SAndroid Build Coastguard Worker  if(CMAKE_${LANG}_COMPILER_LOADED)
569*da0073e9SAndroid Build Coastguard Worker    if (NOT OpenMP_${LANG}_SPEC_DATE AND OpenMP_${LANG}_FLAGS)
570*da0073e9SAndroid Build Coastguard Worker      _OPENMP_GET_SPEC_DATE("${LANG}" OpenMP_${LANG}_SPEC_DATE_INTERNAL)
571*da0073e9SAndroid Build Coastguard Worker      set(OpenMP_${LANG}_SPEC_DATE "${OpenMP_${LANG}_SPEC_DATE_INTERNAL}" CACHE
572*da0073e9SAndroid Build Coastguard Worker        INTERNAL "${LANG} compiler's OpenMP specification date")
573*da0073e9SAndroid Build Coastguard Worker      _OPENMP_SET_VERSION_BY_SPEC_DATE("${LANG}")
574*da0073e9SAndroid Build Coastguard Worker    endif()
575*da0073e9SAndroid Build Coastguard Worker
576*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_${LANG}_FIND_QUIETLY ${OpenMP_FIND_QUIETLY})
577*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_${LANG}_FIND_REQUIRED ${OpenMP_FIND_REQUIRED})
578*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_${LANG}_FIND_VERSION ${OpenMP_FIND_VERSION})
579*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_${LANG}_FIND_VERSION_EXACT ${OpenMP_FIND_VERSION_EXACT})
580*da0073e9SAndroid Build Coastguard Worker
581*da0073e9SAndroid Build Coastguard Worker    set(_OPENMP_${LANG}_REQUIRED_VARS OpenMP_${LANG}_FLAGS)
582*da0073e9SAndroid Build Coastguard Worker    if("${OpenMP_${LANG}_LIB_NAMES}" STREQUAL "NOTFOUND")
583*da0073e9SAndroid Build Coastguard Worker      set(_OPENMP_${LANG}_REQUIRED_LIB_VARS OpenMP_${LANG}_LIB_NAMES)
584*da0073e9SAndroid Build Coastguard Worker    else()
585*da0073e9SAndroid Build Coastguard Worker      foreach(_OPENMP_IMPLICIT_LIB IN LISTS OpenMP_${LANG}_LIB_NAMES)
586*da0073e9SAndroid Build Coastguard Worker        list(APPEND _OPENMP_${LANG}_REQUIRED_LIB_VARS OpenMP_${_OPENMP_IMPLICIT_LIB}_LIBRARY)
587*da0073e9SAndroid Build Coastguard Worker      endforeach()
588*da0073e9SAndroid Build Coastguard Worker    endif()
589*da0073e9SAndroid Build Coastguard Worker
590*da0073e9SAndroid Build Coastguard Worker    find_package_handle_standard_args(OpenMP_${LANG}
591*da0073e9SAndroid Build Coastguard Worker      REQUIRED_VARS OpenMP_${LANG}_FLAGS ${_OPENMP_${LANG}_REQUIRED_LIB_VARS}
592*da0073e9SAndroid Build Coastguard Worker      VERSION_VAR OpenMP_${LANG}_VERSION
593*da0073e9SAndroid Build Coastguard Worker    )
594*da0073e9SAndroid Build Coastguard Worker
595*da0073e9SAndroid Build Coastguard Worker    if(OpenMP_${LANG}_FOUND)
596*da0073e9SAndroid Build Coastguard Worker      if(DEFINED OpenMP_${LANG}_VERSION)
597*da0073e9SAndroid Build Coastguard Worker        if(NOT _OpenMP_MIN_VERSION OR _OpenMP_MIN_VERSION VERSION_GREATER OpenMP_${LANG}_VERSION)
598*da0073e9SAndroid Build Coastguard Worker          set(_OpenMP_MIN_VERSION OpenMP_${LANG}_VERSION)
599*da0073e9SAndroid Build Coastguard Worker        endif()
600*da0073e9SAndroid Build Coastguard Worker      endif()
601*da0073e9SAndroid Build Coastguard Worker      set(OpenMP_${LANG}_LIBRARIES "")
602*da0073e9SAndroid Build Coastguard Worker      foreach(_OPENMP_IMPLICIT_LIB IN LISTS OpenMP_${LANG}_LIB_NAMES)
603*da0073e9SAndroid Build Coastguard Worker        list(APPEND OpenMP_${LANG}_LIBRARIES "${OpenMP_${_OPENMP_IMPLICIT_LIB}_LIBRARY}")
604*da0073e9SAndroid Build Coastguard Worker      endforeach()
605*da0073e9SAndroid Build Coastguard Worker
606*da0073e9SAndroid Build Coastguard Worker      if(NOT TARGET OpenMP::OpenMP_${LANG})
607*da0073e9SAndroid Build Coastguard Worker        add_library(OpenMP::OpenMP_${LANG} INTERFACE IMPORTED)
608*da0073e9SAndroid Build Coastguard Worker      endif()
609*da0073e9SAndroid Build Coastguard Worker      if(OpenMP_${LANG}_FLAGS)
610*da0073e9SAndroid Build Coastguard Worker        if(UNIX)
611*da0073e9SAndroid Build Coastguard Worker          separate_arguments(_OpenMP_${LANG}_OPTIONS UNIX_COMMAND "${OpenMP_${LANG}_FLAGS}")
612*da0073e9SAndroid Build Coastguard Worker        else()
613*da0073e9SAndroid Build Coastguard Worker          separate_arguments(_OpenMP_${LANG}_OPTIONS WINDOWS_COMMAND "${OpenMP_${LANG}_FLAGS}")
614*da0073e9SAndroid Build Coastguard Worker        endif()
615*da0073e9SAndroid Build Coastguard Worker        set_property(TARGET OpenMP::OpenMP_${LANG} PROPERTY
616*da0073e9SAndroid Build Coastguard Worker          INTERFACE_COMPILE_OPTIONS "$<$<COMPILE_LANGUAGE:${LANG}>:${_OpenMP_${LANG}_OPTIONS}>")
617*da0073e9SAndroid Build Coastguard Worker        unset(_OpenMP_${LANG}_OPTIONS)
618*da0073e9SAndroid Build Coastguard Worker      endif()
619*da0073e9SAndroid Build Coastguard Worker      if(OpenMP_${LANG}_LIBRARIES)
620*da0073e9SAndroid Build Coastguard Worker        set_property(TARGET OpenMP::OpenMP_${LANG} PROPERTY
621*da0073e9SAndroid Build Coastguard Worker          INTERFACE_LINK_LIBRARIES "${OpenMP_${LANG}_LIBRARIES}")
622*da0073e9SAndroid Build Coastguard Worker      endif()
623*da0073e9SAndroid Build Coastguard Worker    endif()
624*da0073e9SAndroid Build Coastguard Worker  endif()
625*da0073e9SAndroid Build Coastguard Workerendforeach()
626*da0073e9SAndroid Build Coastguard Worker
627*da0073e9SAndroid Build Coastguard Workerunset(_OpenMP_REQ_VARS)
628*da0073e9SAndroid Build Coastguard Workerforeach(LANG IN ITEMS C CXX Fortran)
629*da0073e9SAndroid Build Coastguard Worker  if((NOT OpenMP_FIND_COMPONENTS AND CMAKE_${LANG}_COMPILER_LOADED) OR LANG IN_LIST OpenMP_FIND_COMPONENTS)
630*da0073e9SAndroid Build Coastguard Worker    list(APPEND _OpenMP_REQ_VARS "OpenMP_${LANG}_FOUND")
631*da0073e9SAndroid Build Coastguard Worker  endif()
632*da0073e9SAndroid Build Coastguard Workerendforeach()
633*da0073e9SAndroid Build Coastguard Worker
634*da0073e9SAndroid Build Coastguard Workerfind_package_handle_standard_args(OpenMP
635*da0073e9SAndroid Build Coastguard Worker    REQUIRED_VARS ${_OpenMP_REQ_VARS}
636*da0073e9SAndroid Build Coastguard Worker    VERSION_VAR ${_OpenMP_MIN_VERSION}
637*da0073e9SAndroid Build Coastguard Worker    HANDLE_COMPONENTS)
638*da0073e9SAndroid Build Coastguard Worker
639*da0073e9SAndroid Build Coastguard Workerset(OPENMP_FOUND ${OpenMP_FOUND})
640*da0073e9SAndroid Build Coastguard Worker
641*da0073e9SAndroid Build Coastguard Workerif(CMAKE_Fortran_COMPILER_LOADED AND OpenMP_Fortran_FOUND)
642*da0073e9SAndroid Build Coastguard Worker  if(NOT DEFINED OpenMP_Fortran_HAVE_OMPLIB_MODULE)
643*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_Fortran_HAVE_OMPLIB_MODULE FALSE CACHE BOOL INTERNAL "")
644*da0073e9SAndroid Build Coastguard Worker  endif()
645*da0073e9SAndroid Build Coastguard Worker  if(NOT DEFINED OpenMP_Fortran_HAVE_OMPLIB_HEADER)
646*da0073e9SAndroid Build Coastguard Worker    set(OpenMP_Fortran_HAVE_OMPLIB_HEADER FALSE CACHE BOOL INTERNAL "")
647*da0073e9SAndroid Build Coastguard Worker  endif()
648*da0073e9SAndroid Build Coastguard Workerendif()
649*da0073e9SAndroid Build Coastguard Worker
650*da0073e9SAndroid Build Coastguard Workerif(NOT ( CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED OR CMAKE_Fortran_COMPILER_LOADED ))
651*da0073e9SAndroid Build Coastguard Worker  message(SEND_ERROR "FindOpenMP requires the C, CXX or Fortran languages to be enabled")
652*da0073e9SAndroid Build Coastguard Workerendif()
653*da0073e9SAndroid Build Coastguard Worker
654*da0073e9SAndroid Build Coastguard Workerunset(OpenMP_C_CXX_TEST_SOURCE)
655*da0073e9SAndroid Build Coastguard Workerunset(OpenMP_Fortran_TEST_SOURCE)
656*da0073e9SAndroid Build Coastguard Workerunset(OpenMP_C_CXX_CHECK_VERSION_SOURCE)
657*da0073e9SAndroid Build Coastguard Workerunset(OpenMP_Fortran_CHECK_VERSION_SOURCE)
658*da0073e9SAndroid Build Coastguard Workerunset(OpenMP_Fortran_INCLUDE_LINE)
659*da0073e9SAndroid Build Coastguard Worker
660*da0073e9SAndroid Build Coastguard Workercmake_policy(POP)
661