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