FindOpenMP.cmake 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file LICENSE.rst or https://cmake.org/licensing for details.
  3. #[=======================================================================[.rst:
  4. FindOpenMP
  5. ----------
  6. Finds Open Multi-Processing (OpenMP) support in a compiler:
  7. .. code-block:: cmake
  8. find_package(OpenMP [<version>] [COMPONENTS <components>...] [...])
  9. If the compiler supports OpenMP, the flags required to compile with OpenMP
  10. support are returned in variables for the different languages. The variables
  11. may be empty if the compiler does not need a special flag to support OpenMP.
  12. .. versionadded:: 3.5
  13. Clang support.
  14. Components
  15. ^^^^^^^^^^
  16. This module supports components that can be specified using the standard
  17. syntax:
  18. .. code-block:: cmake
  19. find_package(OpenMP [COMPONENTS <components>...])
  20. Each of these components controls the various languages to search OpenMP
  21. support for. The following components are exposed:
  22. ``C``
  23. .. versionadded:: 3.10
  24. ``CXX``
  25. .. versionadded:: 3.10
  26. ``Fortran``
  27. .. versionadded:: 3.10
  28. ``CUDA``
  29. .. versionadded:: 3.31
  30. The ``CUDA`` language component is supported when using a CUDA compiler
  31. that supports OpenMP on the host.
  32. If no components are specified, module checks for all of them automatically.
  33. Imported Targets
  34. ^^^^^^^^^^^^^^^^
  35. This module provides the following :ref:`Imported Targets`:
  36. ``OpenMP::OpenMP_<lang>``
  37. .. versionadded:: 3.9
  38. Target encapsulating the OpenMP usage requirements for language ``<lang>``.
  39. Input Variables
  40. ^^^^^^^^^^^^^^^
  41. The following variables may be set to influence this module's behavior:
  42. ``OpenMP_RUNTIME_MSVC``
  43. .. versionadded:: 3.30
  44. Specify the `OpenMP Runtime <msvc-openmp_>`_ when compiling with MSVC.
  45. If set to a non-empty value, such as ``experimental`` or ``llvm``, it
  46. will be passed as the value of the ``-openmp:`` flag.
  47. .. _`msvc-openmp`: https://learn.microsoft.com/en-us/cpp/build/reference/openmp-enable-openmp-2-0-support
  48. Result Variables
  49. ^^^^^^^^^^^^^^^^
  50. This module defines the following variables:
  51. ``OpenMP_FOUND``
  52. Boolean variable indicating that OpenMP flags for all requested languages
  53. have been found. If no components are specified, this is true if OpenMP
  54. settings for all enabled languages were detected.
  55. ``OpenMP_VERSION``
  56. Minimal version of the OpenMP standard detected among the requested
  57. languages, or all enabled languages if no components were specified.
  58. This module will set the following variables per language in the
  59. project, where ``<lang>`` is one of C, CXX, CUDA, or Fortran:
  60. ``OpenMP_<lang>_FOUND``
  61. Variable indicating if OpenMP support for ``<lang>`` was detected.
  62. ``OpenMP_<lang>_FLAGS``
  63. OpenMP compiler flags for ``<lang>``, separated by spaces.
  64. ``OpenMP_<lang>_INCLUDE_DIRS``
  65. Directories that must be added to the header search path for ``<lang>``
  66. when using OpenMP.
  67. For linking with OpenMP code written in ``<lang>``, the following
  68. variables are provided:
  69. ``OpenMP_<lang>_LIB_NAMES``
  70. :ref:`semicolon-separated list <CMake Language Lists>` of libraries for
  71. OpenMP programs for ``<lang>``.
  72. ``OpenMP_<libname>_LIBRARY``
  73. Location of the individual libraries needed for OpenMP support in
  74. ``<lang>``.
  75. ``OpenMP_<lang>_LIBRARIES``
  76. A list of libraries needed to link with OpenMP code written in ``<lang>``.
  77. Specifically for Fortran, the module sets the following variables:
  78. ``OpenMP_Fortran_HAVE_OMPLIB_HEADER``
  79. Boolean indicating if OpenMP is accessible through ``omp_lib.h``.
  80. ``OpenMP_Fortran_HAVE_OMPLIB_MODULE``
  81. Boolean indicating if OpenMP is accessible through the ``omp_lib`` Fortran
  82. module.
  83. The module will also try to provide the OpenMP version variables:
  84. ``OpenMP_<lang>_SPEC_DATE``
  85. .. versionadded:: 3.7
  86. Date of the OpenMP specification implemented by the ``<lang>`` compiler.
  87. ``OpenMP_<lang>_VERSION_MAJOR``
  88. Major version of OpenMP implemented by the ``<lang>`` compiler.
  89. ``OpenMP_<lang>_VERSION_MINOR``
  90. Minor version of OpenMP implemented by the ``<lang>`` compiler.
  91. ``OpenMP_<lang>_VERSION``
  92. OpenMP version implemented by the ``<lang>`` compiler.
  93. The specification date is formatted as given in the OpenMP standard:
  94. ``yyyymm`` where ``yyyy`` and ``mm`` represents the year and month of
  95. the OpenMP specification implemented by the ``<lang>`` compiler.
  96. For some compilers, it may be necessary to add a header search path to find
  97. the relevant OpenMP headers. This location may be language-specific. Where
  98. this is needed, the module may attempt to find the location, but it can be
  99. provided directly by setting the ``OpenMP_<lang>_INCLUDE_DIR`` cache variable.
  100. Note that this variable is an _input_ control to the module. Project code
  101. should use the ``OpenMP_<lang>_INCLUDE_DIRS`` _output_ variable if it needs
  102. to know what include directories are needed.
  103. Examples
  104. ^^^^^^^^
  105. Finding OpenMP support and linking the imported target to a project target
  106. using the C language component:
  107. .. code-block:: cmake
  108. find_package(OpenMP)
  109. target_link_libraries(project_target PRIVATE OpenMP::OpenMP_C)
  110. #]=======================================================================]
  111. cmake_policy(PUSH)
  112. cmake_policy(SET CMP0159 NEW) # file(STRINGS) with REGEX updates CMAKE_MATCH_<n>
  113. function(_OPENMP_FLAG_CANDIDATES LANG)
  114. if(NOT OpenMP_${LANG}_FLAG)
  115. unset(OpenMP_FLAG_CANDIDATES)
  116. set(OMP_FLAG_GNU "-fopenmp")
  117. set(OMP_FLAG_LCC "-fopenmp")
  118. set(OMP_FLAG_Clang "-fopenmp=libomp" "-fopenmp=libiomp5" "-fopenmp" "-Xclang -fopenmp")
  119. set(OMP_FLAG_AppleClang "-Xclang -fopenmp")
  120. set(OMP_FLAG_HP "+Oopenmp")
  121. if(WIN32)
  122. set(OMP_FLAG_Intel "-Qopenmp")
  123. elseif(CMAKE_${LANG}_COMPILER_ID STREQUAL "Intel" AND
  124. "${CMAKE_${LANG}_COMPILER_VERSION}" VERSION_LESS "15.0.0.20140528")
  125. set(OMP_FLAG_Intel "-openmp")
  126. else()
  127. set(OMP_FLAG_Intel "-qopenmp")
  128. endif()
  129. if(CMAKE_${LANG}_COMPILER_ID STREQUAL "IntelLLVM" AND
  130. "x${CMAKE_${LANG}_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC")
  131. set(OMP_FLAG_IntelLLVM "-Qiopenmp")
  132. else()
  133. set(OMP_FLAG_IntelLLVM "-fiopenmp")
  134. endif()
  135. if(OpenMP_RUNTIME_MSVC)
  136. set(OMP_FLAG_MSVC "-openmp:${OpenMP_RUNTIME_MSVC}")
  137. else()
  138. set(OMP_FLAG_MSVC "-openmp")
  139. endif()
  140. set(OMP_FLAG_PathScale "-openmp")
  141. set(OMP_FLAG_NAG "-openmp")
  142. set(OMP_FLAG_Absoft "-openmp")
  143. set(OMP_FLAG_NVHPC "-mp")
  144. set(OMP_FLAG_PGI "-mp")
  145. set(OMP_FLAG_Flang "-fopenmp")
  146. set(OMP_FLAG_LLVMFlang "-fopenmp")
  147. set(OMP_FLAG_SunPro "-xopenmp")
  148. set(OMP_FLAG_XL "-qsmp=omp")
  149. # Cray compiler activate OpenMP with -h omp, which is enabled by default.
  150. set(OMP_FLAG_Cray " " "-h omp")
  151. set(OMP_FLAG_CrayClang "-fopenmp")
  152. set(OMP_FLAG_Fujitsu "-Kopenmp" "-KOMP")
  153. set(OMP_FLAG_FujitsuClang "-fopenmp" "-Kopenmp")
  154. if(CMAKE_${LANG}_COMPILER_ID STREQUAL "NVIDIA" AND CMAKE_${LANG}_HOST_COMPILER_ID)
  155. set(compiler_id "${CMAKE_${LANG}_HOST_COMPILER_ID}")
  156. else()
  157. set(compiler_id "${CMAKE_${LANG}_COMPILER_ID}")
  158. endif()
  159. # If we know the correct flags, use those
  160. if(DEFINED OMP_FLAG_${compiler_id})
  161. set(OpenMP_FLAG_CANDIDATES "${OMP_FLAG_${compiler_id}}")
  162. else()
  163. # Fall back to reasonable default tries otherwise
  164. set(OpenMP_FLAG_CANDIDATES "-openmp" "-fopenmp" "-mp" " ")
  165. endif()
  166. set(OpenMP_${LANG}_FLAG_CANDIDATES "${OpenMP_FLAG_CANDIDATES}" PARENT_SCOPE)
  167. else()
  168. set(OpenMP_${LANG}_FLAG_CANDIDATES "${OpenMP_${LANG}_FLAG}" PARENT_SCOPE)
  169. endif()
  170. endfunction()
  171. # sample openmp source code to test
  172. set(OpenMP_C_CXX_TEST_SOURCE
  173. "
  174. #include <omp.h>
  175. int main(void) {
  176. #ifdef _OPENMP
  177. omp_get_max_threads();
  178. #elif !defined(__CUDA_ARCH__) && !defined(__HIP_DEVICE_COMPILE__)
  179. # error \"_OPENMP not defined!\"
  180. #endif
  181. return 0;
  182. }
  183. ")
  184. # in Fortran, an implementation may provide an omp_lib.h header
  185. # or omp_lib module, or both (OpenMP standard, section 3.1)
  186. # Furthmore !$ is the Fortran equivalent of #ifdef _OPENMP (OpenMP standard, 2.2.2)
  187. # Without the conditional compilation, some compilers (e.g. PGI) might compile OpenMP code
  188. # while not actually enabling OpenMP, building code sequentially
  189. set(OpenMP_Fortran_TEST_SOURCE
  190. "
  191. program test
  192. @OpenMP_Fortran_INCLUDE_LINE@
  193. !$ integer :: n
  194. n = omp_get_num_threads()
  195. end program test
  196. "
  197. )
  198. macro(_OPENMP_PREPARE_SOURCE LANG CONTENT_ID NAME_PREFIX FULLNAME_VAR CONTENT_VAR)
  199. if("${LANG}" STREQUAL "C")
  200. set(${FULLNAME_VAR} "${NAME_PREFIX}.c")
  201. set(${CONTENT_VAR} "${OpenMP_C_CXX_${CONTENT_ID}}")
  202. elseif("${LANG}" STREQUAL "CXX")
  203. set(${FULLNAME_VAR} "${NAME_PREFIX}.cpp")
  204. set(${CONTENT_VAR} "${OpenMP_C_CXX_${CONTENT_ID}}")
  205. elseif("${LANG}" STREQUAL "CUDA")
  206. set(${FULLNAME_VAR} "${NAME_PREFIX}.cu")
  207. set(${CONTENT_VAR} "${OpenMP_C_CXX_${CONTENT_ID}}")
  208. elseif("${LANG}" STREQUAL "Fortran")
  209. set(${FULLNAME_VAR} "${NAME_PREFIX}.F90")
  210. string(CONFIGURE "${OpenMP_Fortran_${CONTENT_ID}}" ${CONTENT_VAR} @ONLY)
  211. endif()
  212. endmacro()
  213. include(${CMAKE_CURRENT_LIST_DIR}/CMakeParseImplicitLinkInfo.cmake)
  214. function(_OPENMP_GET_FLAGS LANG FLAG_MODE OPENMP_FLAG_VAR OPENMP_LIB_NAMES_VAR)
  215. _OPENMP_FLAG_CANDIDATES("${LANG}")
  216. _OPENMP_PREPARE_SOURCE("${LANG}" TEST_SOURCE OpenMPTryFlag
  217. _OPENMP_TEST_SRC_NAME _OPENMP_TEST_SRC_CONTENT)
  218. separate_arguments(OpenMP_VERBOSE_OPTIONS NATIVE_COMMAND "${CMAKE_${LANG}_VERBOSE_FLAG}")
  219. foreach(OPENMP_FLAG IN LISTS OpenMP_${LANG}_FLAG_CANDIDATES)
  220. string(REGEX REPLACE "[-/=+]" "" OPENMP_PLAIN_FLAG "${OPENMP_FLAG}")
  221. unset(_includeDirFlags)
  222. if(OpenMP_${LANG}_INCLUDE_DIR)
  223. set(_includeDirFlags "-DINCLUDE_DIRECTORIES:STRING=${OpenMP_${LANG}_INCLUDE_DIR}")
  224. endif()
  225. if(CMAKE_${LANG}_COMPILER_ID STREQUAL "NVIDIA")
  226. # With NVCC we drive linking directly through the host compiler, but
  227. # without language-wide flags since they may be specific to nvcc.
  228. # Pass the candidate OpenMP flag to the host compiler when linking.
  229. set(_OpenMP_LINK_OPTIONS "${OPENMP_FLAG}")
  230. # Exclude CUDA runtime libraries that we may add ourselves.
  231. # See the Compiler/NVIDIA module. Do not exclude pthread,
  232. # as that is typically a dependency of OpenMP too.
  233. set(_OpenMP_EXCLUDE_IMPLICIT_LIBS cudart cudart_static cudadevrt rt dl)
  234. else()
  235. set(_OpenMP_LINK_OPTIONS "")
  236. set(_OpenMP_EXCLUDE_IMPLICIT_LIBS "")
  237. endif()
  238. try_compile( OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG}
  239. SOURCE_FROM_VAR "${_OPENMP_TEST_SRC_NAME}" _OPENMP_TEST_SRC_CONTENT
  240. LOG_DESCRIPTION "Detecting ${LANG} OpenMP compiler info"
  241. CMAKE_FLAGS "-DCOMPILE_DEFINITIONS:STRING=${OPENMP_FLAG}" ${_includeDirFlags}
  242. LINK_OPTIONS ${OpenMP_VERBOSE_OPTIONS} ${_OpenMP_LINK_OPTIONS}
  243. OUTPUT_VARIABLE OpenMP_TRY_COMPILE_OUTPUT
  244. )
  245. if(OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG} AND
  246. NOT "${CMAKE_${LANG}_COMPILER_ID};${CMAKE_${LANG}_SIMULATE_ID}" STREQUAL "Clang;MSVC")
  247. set("${OPENMP_FLAG_VAR}" "${OPENMP_FLAG}" PARENT_SCOPE)
  248. if(CMAKE_${LANG}_VERBOSE_FLAG)
  249. unset(OpenMP_${LANG}_IMPLICIT_LIBRARIES)
  250. unset(OpenMP_${LANG}_IMPLICIT_LINK_DIRS)
  251. unset(OpenMP_${LANG}_IMPLICIT_FWK_DIRS)
  252. unset(OpenMP_${LANG}_LOG_VAR)
  253. cmake_parse_implicit_link_info("${OpenMP_TRY_COMPILE_OUTPUT}"
  254. OpenMP_${LANG}_IMPLICIT_LIBRARIES
  255. OpenMP_${LANG}_IMPLICIT_LINK_DIRS
  256. OpenMP_${LANG}_IMPLICIT_FWK_DIRS
  257. OpenMP_${LANG}_LOG_VAR
  258. "${CMAKE_${LANG}_IMPLICIT_OBJECT_REGEX}"
  259. LANGUAGE ${LANG}
  260. )
  261. # For LCC we should additionally alanyze -print-search-dirs output
  262. # to check for additional implicit_dirs.
  263. # Note: This won't work if CMP0129 policy is set to OLD!
  264. if("${CMAKE_${LANG}_COMPILER_ID}" STREQUAL "LCC")
  265. execute_process(
  266. COMMAND ${CMAKE_${LANG}_COMPILER} -print-search-dirs
  267. OUTPUT_VARIABLE output_lines
  268. COMMAND_ERROR_IS_FATAL ANY
  269. ERROR_QUIET)
  270. if("${output_lines}" MATCHES ".*\nlibraries:[ \t]+(.*:)\n.*")
  271. string(REPLACE ":" ";" implicit_dirs_addon "${CMAKE_MATCH_1}")
  272. list(PREPEND OpenMP_${LANG}_IMPLICIT_LINK_DIRS ${implicit_dirs_addon})
  273. string(APPEND OpenMP_${LANG}_LOG_VAR
  274. " Extended OpenMP library search paths: [${implicit_dirs}]\n")
  275. endif()
  276. endif()
  277. message(CONFIGURE_LOG
  278. "Parsed ${LANG} OpenMP implicit link information from above output:\n${OpenMP_${LANG}_LOG_VAR}\n\n")
  279. unset(_OPENMP_LIB_NAMES)
  280. foreach(_OPENMP_IMPLICIT_LIB IN LISTS OpenMP_${LANG}_IMPLICIT_LIBRARIES)
  281. get_filename_component(_OPENMP_IMPLICIT_LIB_DIR "${_OPENMP_IMPLICIT_LIB}" DIRECTORY)
  282. get_filename_component(_OPENMP_IMPLICIT_LIB_NAME "${_OPENMP_IMPLICIT_LIB}" NAME)
  283. get_filename_component(_OPENMP_IMPLICIT_LIB_PLAIN "${_OPENMP_IMPLICIT_LIB}" NAME_WE)
  284. string(REGEX REPLACE "([][+.*?()^$])" "\\\\\\1" _OPENMP_IMPLICIT_LIB_PLAIN_ESC "${_OPENMP_IMPLICIT_LIB_PLAIN}")
  285. string(REGEX REPLACE "([][+.*?()^$])" "\\\\\\1" _OPENMP_IMPLICIT_LIB_PATH_ESC "${_OPENMP_IMPLICIT_LIB}")
  286. if(NOT ( "${_OPENMP_IMPLICIT_LIB}" IN_LIST CMAKE_${LANG}_IMPLICIT_LINK_LIBRARIES
  287. OR "${_OPENMP_IMPLICIT_LIB}" IN_LIST _OpenMP_EXCLUDE_IMPLICIT_LIBS
  288. OR "${CMAKE_${LANG}_STANDARD_LIBRARIES}" MATCHES "(^| )(-Wl,)?(-l)?(${_OPENMP_IMPLICIT_LIB_PLAIN_ESC}|${_OPENMP_IMPLICIT_LIB_PATH_ESC})( |$)"
  289. OR "${CMAKE_${LANG}_LINK_EXECUTABLE}" MATCHES "(^| )(-Wl,)?(-l)?(${_OPENMP_IMPLICIT_LIB_PLAIN_ESC}|${_OPENMP_IMPLICIT_LIB_PATH_ESC})( |$)" ) )
  290. if(_OPENMP_IMPLICIT_LIB_DIR)
  291. set(OpenMP_${_OPENMP_IMPLICIT_LIB_PLAIN}_LIBRARY "${_OPENMP_IMPLICIT_LIB}" CACHE FILEPATH
  292. "Path to the ${_OPENMP_IMPLICIT_LIB_PLAIN} library for OpenMP")
  293. else()
  294. find_library(OpenMP_${_OPENMP_IMPLICIT_LIB_PLAIN}_LIBRARY
  295. NAMES "${_OPENMP_IMPLICIT_LIB_NAME}"
  296. DOC "Path to the ${_OPENMP_IMPLICIT_LIB_PLAIN} library for OpenMP"
  297. HINTS ${OpenMP_${LANG}_IMPLICIT_LINK_DIRS}
  298. CMAKE_FIND_ROOT_PATH_BOTH
  299. NO_PACKAGE_ROOT_PATH
  300. NO_CMAKE_PATH
  301. NO_CMAKE_ENVIRONMENT_PATH
  302. )
  303. endif()
  304. mark_as_advanced(OpenMP_${_OPENMP_IMPLICIT_LIB_PLAIN}_LIBRARY)
  305. list(APPEND _OPENMP_LIB_NAMES ${_OPENMP_IMPLICIT_LIB_PLAIN})
  306. endif()
  307. endforeach()
  308. list(REVERSE _OPENMP_LIB_NAMES)
  309. list(REMOVE_DUPLICATES _OPENMP_LIB_NAMES)
  310. list(REVERSE _OPENMP_LIB_NAMES)
  311. set("${OPENMP_LIB_NAMES_VAR}" "${_OPENMP_LIB_NAMES}" PARENT_SCOPE)
  312. else()
  313. # We do not know how to extract implicit OpenMP libraries for this compiler.
  314. # Assume that it handles them automatically, e.g. the Intel Compiler on
  315. # Windows should put the dependency in its object files.
  316. set("${OPENMP_LIB_NAMES_VAR}" "" PARENT_SCOPE)
  317. endif()
  318. break()
  319. elseif((CMAKE_${LANG}_COMPILER_ID STREQUAL "AppleClang"
  320. AND CMAKE_${LANG}_COMPILER_VERSION VERSION_GREATER_EQUAL "7.0") OR
  321. (CMAKE_${LANG}_COMPILER_ID STREQUAL "Clang" AND APPLE))
  322. # Check for separate OpenMP library on AppleClang 7+
  323. find_library(OpenMP_libomp_LIBRARY
  324. NAMES omp gomp iomp5
  325. HINTS ${CMAKE_${LANG}_IMPLICIT_LINK_DIRECTORIES}
  326. )
  327. mark_as_advanced(OpenMP_libomp_LIBRARY)
  328. if(OpenMP_libomp_LIBRARY)
  329. # Try without specifying include directory first. We only want to
  330. # explicitly add a search path if the header can't be found on the
  331. # default header search path already.
  332. try_compile( OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG}
  333. SOURCE_FROM_VAR "${_OPENMP_TEST_SRC_NAME}" _OPENMP_TEST_SRC_CONTENT
  334. LOG_DESCRIPTION "Trying ${LANG} OpenMP compiler with '${OpenMP_libomp_LIBRARY}'"
  335. COMPILE_DEFINITIONS ${OPENMP_FLAG}
  336. LINK_LIBRARIES ${OpenMP_libomp_LIBRARY}
  337. )
  338. if(NOT OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG})
  339. find_path(OpenMP_${LANG}_INCLUDE_DIR omp.h)
  340. mark_as_advanced(OpenMP_${LANG}_INCLUDE_DIR)
  341. set(OpenMP_${LANG}_INCLUDE_DIR "${OpenMP_${LANG}_INCLUDE_DIR}" PARENT_SCOPE)
  342. if(OpenMP_${LANG}_INCLUDE_DIR)
  343. try_compile( OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG}
  344. SOURCE_FROM_VAR "${_OPENMP_TEST_SRC_NAME}" _OPENMP_TEST_SRC_CONTENT
  345. LOG_DESCRIPTION "Trying ${LANG} OpenMP compiler with '${OpenMP_libomp_LIBRARY}' and '${OpenMP_${LANG}_INCLUDE_DIR}'"
  346. CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${OpenMP_${LANG}_INCLUDE_DIR}"
  347. COMPILE_DEFINITIONS ${OPENMP_FLAG}
  348. LINK_LIBRARIES ${OpenMP_libomp_LIBRARY}
  349. )
  350. endif()
  351. endif()
  352. if(OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG})
  353. set("${OPENMP_FLAG_VAR}" "${OPENMP_FLAG}" PARENT_SCOPE)
  354. set("${OPENMP_LIB_NAMES_VAR}" "libomp" PARENT_SCOPE)
  355. break()
  356. endif()
  357. endif()
  358. elseif(CMAKE_${LANG}_COMPILER_ID STREQUAL "LLVMFlang" AND WIN32)
  359. find_library(OpenMP_libomp_LIBRARY
  360. NAMES omp
  361. HINTS ${CMAKE_${LANG}_IMPLICIT_LINK_DIRECTORIES}
  362. )
  363. mark_as_advanced(OpenMP_libomp_LIBRARY)
  364. if(OpenMP_libomp_LIBRARY)
  365. # Try without specifying include directory first. We only want to
  366. # explicitly add a search path if the header can't be found on the
  367. # default header search path already.
  368. try_compile( OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG}
  369. SOURCE_FROM_VAR "${_OPENMP_TEST_SRC_NAME}" _OPENMP_TEST_SRC_CONTENT
  370. LOG_DESCRIPTION "Trying ${LANG} OpenMP compiler with '${OpenMP_libomp_LIBRARY}'"
  371. COMPILE_DEFINITIONS ${OPENMP_FLAG}
  372. LINK_LIBRARIES ${OpenMP_libomp_LIBRARY}
  373. )
  374. if(NOT OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG})
  375. find_path(OpenMP_${LANG}_INCLUDE_DIR omp_lib.mod)
  376. mark_as_advanced(OpenMP_${LANG}_INCLUDE_DIR)
  377. set(OpenMP_${LANG}_INCLUDE_DIR "${OpenMP_${LANG}_INCLUDE_DIR}" PARENT_SCOPE)
  378. if(OpenMP_${LANG}_INCLUDE_DIR)
  379. try_compile( OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG}
  380. SOURCE_FROM_VAR "${_OPENMP_TEST_SRC_NAME}" _OPENMP_TEST_SRC_CONTENT
  381. LOG_DESCRIPTION "Trying ${LANG} OpenMP compiler with '${OpenMP_libomp_LIBRARY}' and '${OpenMP_${LANG}_INCLUDE_DIR}'"
  382. CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${OpenMP_${LANG}_INCLUDE_DIR}"
  383. COMPILE_DEFINITIONS ${OPENMP_FLAG}
  384. LINK_LIBRARIES ${OpenMP_libomp_LIBRARY}
  385. )
  386. endif()
  387. endif()
  388. if(OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG})
  389. set("${OPENMP_FLAG_VAR}" "${OPENMP_FLAG}" PARENT_SCOPE)
  390. set("${OPENMP_LIB_NAMES_VAR}" "libomp" PARENT_SCOPE)
  391. break()
  392. endif()
  393. endif()
  394. elseif(CMAKE_${LANG}_COMPILER_ID STREQUAL "Clang" AND WIN32)
  395. # Check for separate OpenMP library for Clang on Windows
  396. find_library(OpenMP_libomp_LIBRARY
  397. NAMES libomp libgomp libiomp5
  398. HINTS ${CMAKE_${LANG}_IMPLICIT_LINK_DIRECTORIES}
  399. )
  400. mark_as_advanced(OpenMP_libomp_LIBRARY)
  401. if(OpenMP_libomp_LIBRARY)
  402. try_compile( OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG}
  403. SOURCE_FROM_VAR "${_OPENMP_TEST_SRC_NAME}" _OPENMP_TEST_SRC_CONTENT
  404. LOG_DESCRIPTION "Trying ${LANG} OpenMP compiler with '${OpenMP_libomp_LIBRARY}'"
  405. COMPILE_DEFINITIONS ${OPENMP_FLAG}
  406. LINK_LIBRARIES ${OpenMP_libomp_LIBRARY}
  407. )
  408. if(OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG})
  409. set("${OPENMP_FLAG_VAR}" "${OPENMP_FLAG}" PARENT_SCOPE)
  410. set("${OPENMP_LIB_NAMES_VAR}" "libomp" PARENT_SCOPE)
  411. break()
  412. endif()
  413. endif()
  414. endif()
  415. set("${OPENMP_LIB_NAMES_VAR}" "NOTFOUND" PARENT_SCOPE)
  416. set("${OPENMP_FLAG_VAR}" "NOTFOUND" PARENT_SCOPE)
  417. endforeach()
  418. endfunction()
  419. set(OpenMP_C_CXX_CHECK_VERSION_SOURCE
  420. "
  421. #include <stdio.h>
  422. #include <omp.h>
  423. const char ompver_str[] = { 'I', 'N', 'F', 'O', ':', 'O', 'p', 'e', 'n', 'M',
  424. 'P', '-', 'd', 'a', 't', 'e', '[',
  425. ('0' + ((_OPENMP/100000)%10)),
  426. ('0' + ((_OPENMP/10000)%10)),
  427. ('0' + ((_OPENMP/1000)%10)),
  428. ('0' + ((_OPENMP/100)%10)),
  429. ('0' + ((_OPENMP/10)%10)),
  430. ('0' + ((_OPENMP/1)%10)),
  431. ']', '\\0' };
  432. int main(void)
  433. {
  434. puts(ompver_str);
  435. return 0;
  436. }
  437. ")
  438. set(OpenMP_Fortran_CHECK_VERSION_SOURCE
  439. "
  440. program omp_ver
  441. @OpenMP_Fortran_INCLUDE_LINE@
  442. integer, parameter :: zero = ichar('0')
  443. integer, parameter :: ompv = openmp_version
  444. character, dimension(24), parameter :: ompver_str =&
  445. (/ 'I', 'N', 'F', 'O', ':', 'O', 'p', 'e', 'n', 'M', 'P', '-',&
  446. 'd', 'a', 't', 'e', '[',&
  447. char(zero + mod(ompv/100000, 10)),&
  448. char(zero + mod(ompv/10000, 10)),&
  449. char(zero + mod(ompv/1000, 10)),&
  450. char(zero + mod(ompv/100, 10)),&
  451. char(zero + mod(ompv/10, 10)),&
  452. char(zero + mod(ompv/1, 10)), ']' /)
  453. print *, ompver_str
  454. end program omp_ver
  455. ")
  456. function(_OPENMP_GET_SPEC_DATE LANG SPEC_DATE)
  457. _OPENMP_PREPARE_SOURCE("${LANG}" CHECK_VERSION_SOURCE OpenMPCheckVersion
  458. _OPENMP_TEST_SRC_NAME _OPENMP_TEST_SRC_CONTENT)
  459. unset(_includeDirFlags)
  460. if(OpenMP_${LANG}_INCLUDE_DIR)
  461. set(_includeDirFlags "-DINCLUDE_DIRECTORIES:STRING=${OpenMP_${LANG}_INCLUDE_DIR}")
  462. endif()
  463. set(BIN_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindOpenMP/ompver_${LANG}.bin")
  464. string(REGEX REPLACE "[-/=+]" "" OPENMP_PLAIN_FLAG "${OPENMP_FLAG}")
  465. try_compile(OpenMP_SPECTEST_${LANG}_${OPENMP_PLAIN_FLAG}
  466. SOURCE_FROM_VAR "${_OPENMP_TEST_SRC_NAME}" _OPENMP_TEST_SRC_CONTENT
  467. LOG_DESCRIPTION "Detecting ${LANG} OpenMP version"
  468. CMAKE_FLAGS "-DCOMPILE_DEFINITIONS:STRING=${OpenMP_${LANG}_FLAGS}" ${_includeDirFlags}
  469. COPY_FILE "${BIN_FILE}"
  470. )
  471. if(${OpenMP_SPECTEST_${LANG}_${OPENMP_PLAIN_FLAG}})
  472. file(STRINGS ${BIN_FILE} specstr LIMIT_COUNT 1 REGEX "INFO:OpenMP-date")
  473. set(regex_spec_date ".*INFO:OpenMP-date\\[0*([^]]*)\\].*")
  474. if("${specstr}" MATCHES "${regex_spec_date}")
  475. set(${SPEC_DATE} "${CMAKE_MATCH_1}" PARENT_SCOPE)
  476. endif()
  477. endif()
  478. endfunction()
  479. macro(_OPENMP_SET_VERSION_BY_SPEC_DATE LANG)
  480. set(OpenMP_SPEC_DATE_MAP
  481. "202111=5.2"
  482. "202011=5.1"
  483. # Preview versions
  484. "201611=5.0" # OpenMP 5.0 preview 1
  485. # Combined versions, 2.5 onwards
  486. "201811=5.0"
  487. "201511=4.5"
  488. "201307=4.0"
  489. "201107=3.1"
  490. "200805=3.0"
  491. "200505=2.5"
  492. # C/C++ version 2.0
  493. "200203=2.0"
  494. # Fortran version 2.0
  495. "200011=2.0"
  496. # Fortran version 1.1
  497. "199911=1.1"
  498. # C/C++ version 1.0 (there's no 1.1 for C/C++)
  499. "199810=1.0"
  500. # Fortran version 1.0
  501. "199710=1.0"
  502. )
  503. if(MSVC)
  504. list(APPEND OpenMP_SPEC_DATE_MAP "2019=2.0")
  505. endif()
  506. if(OpenMP_${LANG}_SPEC_DATE)
  507. string(REGEX MATCHALL "${OpenMP_${LANG}_SPEC_DATE}=([0-9]+)\\.([0-9]+)" _version_match "${OpenMP_SPEC_DATE_MAP}")
  508. else()
  509. set(_version_match "")
  510. endif()
  511. if(NOT _version_match STREQUAL "")
  512. set(OpenMP_${LANG}_VERSION_MAJOR ${CMAKE_MATCH_1})
  513. set(OpenMP_${LANG}_VERSION_MINOR ${CMAKE_MATCH_2})
  514. set(OpenMP_${LANG}_VERSION "${OpenMP_${LANG}_VERSION_MAJOR}.${OpenMP_${LANG}_VERSION_MINOR}")
  515. else()
  516. unset(OpenMP_${LANG}_VERSION_MAJOR)
  517. unset(OpenMP_${LANG}_VERSION_MINOR)
  518. unset(OpenMP_${LANG}_VERSION)
  519. endif()
  520. unset(_version_match)
  521. unset(OpenMP_SPEC_DATE_MAP)
  522. endmacro()
  523. foreach(LANG IN ITEMS C CXX CUDA)
  524. if(CMAKE_${LANG}_COMPILER_LOADED)
  525. if(NOT DEFINED OpenMP_${LANG}_FLAGS OR "${OpenMP_${LANG}_FLAGS}" STREQUAL "NOTFOUND"
  526. OR NOT DEFINED OpenMP_${LANG}_LIB_NAMES OR "${OpenMP_${LANG}_LIB_NAMES}" STREQUAL "NOTFOUND")
  527. _OPENMP_GET_FLAGS("${LANG}" "${LANG}" OpenMP_${LANG}_FLAGS_WORK OpenMP_${LANG}_LIB_NAMES_WORK)
  528. if(NOT DEFINED OpenMP_${LANG}_FLAGS OR "${OpenMP_${LANG}_FLAGS}" STREQUAL "NOTFOUND")
  529. set(OpenMP_${LANG}_FLAGS "${OpenMP_${LANG}_FLAGS_WORK}"
  530. CACHE STRING "${LANG} compiler flags for OpenMP parallelization" FORCE)
  531. endif()
  532. if(NOT DEFINED OpenMP_${LANG}_LIB_NAMES OR "${OpenMP_${LANG}_LIB_NAMES}" STREQUAL "NOTFOUND")
  533. set(OpenMP_${LANG}_LIB_NAMES "${OpenMP_${LANG}_LIB_NAMES_WORK}"
  534. CACHE STRING "${LANG} compiler libraries for OpenMP parallelization" FORCE)
  535. endif()
  536. mark_as_advanced(OpenMP_${LANG}_FLAGS OpenMP_${LANG}_LIB_NAMES)
  537. endif()
  538. endif()
  539. endforeach()
  540. if(CMAKE_Fortran_COMPILER_LOADED)
  541. if(NOT DEFINED OpenMP_Fortran_FLAGS OR "${OpenMP_Fortran_FLAGS}" STREQUAL "NOTFOUND"
  542. OR NOT DEFINED OpenMP_Fortran_LIB_NAMES OR "${OpenMP_Fortran_LIB_NAMES}" STREQUAL "NOTFOUND"
  543. OR NOT DEFINED OpenMP_Fortran_HAVE_OMPLIB_MODULE)
  544. set(OpenMP_Fortran_INCLUDE_LINE "use omp_lib\n implicit none")
  545. _OPENMP_GET_FLAGS("Fortran" "FortranHeader" OpenMP_Fortran_FLAGS_WORK OpenMP_Fortran_LIB_NAMES_WORK)
  546. if(OpenMP_Fortran_FLAGS_WORK)
  547. set(OpenMP_Fortran_HAVE_OMPLIB_MODULE TRUE CACHE BOOL INTERNAL "")
  548. endif()
  549. if(NOT DEFINED OpenMP_Fortran_FLAGS OR "${OpenMP_Fortran_FLAGS}" STREQUAL "NOTFOUND")
  550. set(OpenMP_Fortran_FLAGS "${OpenMP_Fortran_FLAGS_WORK}"
  551. CACHE STRING "Fortran compiler flags for OpenMP parallelization" FORCE)
  552. endif()
  553. if(NOT DEFINED OpenMP_Fortran_LIB_NAMES OR "${OpenMP_Fortran_LIB_NAMES}" STREQUAL "NOTFOUND")
  554. set(OpenMP_Fortran_LIB_NAMES "${OpenMP_Fortran_LIB_NAMES_WORK}"
  555. CACHE STRING "Fortran compiler libraries for OpenMP parallelization" FORCE)
  556. endif()
  557. mark_as_advanced(OpenMP_Fortran_FLAGS OpenMP_Fortran_LIB_NAMES)
  558. endif()
  559. if(NOT DEFINED OpenMP_Fortran_FLAGS OR "${OpenMP_Fortran_FLAGS}" STREQUAL "NOTFOUND"
  560. OR NOT DEFINED OpenMP_Fortran_LIB_NAMES OR "${OpenMP_Fortran_LIB_NAMES}" STREQUAL "NOTFOUND"
  561. OR NOT DEFINED OpenMP_Fortran_HAVE_OMPLIB_HEADER)
  562. set(OpenMP_Fortran_INCLUDE_LINE "implicit none\n include 'omp_lib.h'")
  563. _OPENMP_GET_FLAGS("Fortran" "FortranModule" OpenMP_Fortran_FLAGS_WORK OpenMP_Fortran_LIB_NAMES_WORK)
  564. if(OpenMP_Fortran_FLAGS_WORK)
  565. set(OpenMP_Fortran_HAVE_OMPLIB_HEADER TRUE CACHE BOOL INTERNAL "")
  566. endif()
  567. if(NOT DEFINED OpenMP_Fortran_FLAGS OR "${OpenMP_Fortran_FLAGS}" STREQUAL "NOTFOUND")
  568. set(OpenMP_Fortran_FLAGS "${OpenMP_Fortran_FLAGS_WORK}"
  569. CACHE STRING "Fortran compiler flags for OpenMP parallelization" FORCE)
  570. endif()
  571. if(NOT DEFINED OpenMP_Fortran_LIB_NAMES OR "${OpenMP_Fortran_LIB_NAMES}" STREQUAL "NOTFOUND")
  572. set(OpenMP_Fortran_LIB_NAMES "${OpenMP_Fortran_LIB_NAMES_WORK}"
  573. CACHE STRING "Fortran compiler libraries for OpenMP parallelization" FORCE)
  574. endif()
  575. endif()
  576. if(OpenMP_Fortran_HAVE_OMPLIB_MODULE)
  577. set(OpenMP_Fortran_INCLUDE_LINE "use omp_lib\n implicit none")
  578. else()
  579. set(OpenMP_Fortran_INCLUDE_LINE "implicit none\n include 'omp_lib.h'")
  580. endif()
  581. endif()
  582. if(NOT OpenMP_FIND_COMPONENTS)
  583. set(OpenMP_FINDLIST C CXX CUDA Fortran)
  584. else()
  585. set(OpenMP_FINDLIST ${OpenMP_FIND_COMPONENTS})
  586. endif()
  587. unset(_OpenMP_MIN_VERSION)
  588. include(FindPackageHandleStandardArgs)
  589. foreach(LANG IN LISTS OpenMP_FINDLIST)
  590. if(CMAKE_${LANG}_COMPILER_LOADED)
  591. if (NOT OpenMP_${LANG}_SPEC_DATE AND OpenMP_${LANG}_FLAGS)
  592. _OPENMP_GET_SPEC_DATE("${LANG}" OpenMP_${LANG}_SPEC_DATE_INTERNAL)
  593. set(OpenMP_${LANG}_SPEC_DATE "${OpenMP_${LANG}_SPEC_DATE_INTERNAL}" CACHE
  594. INTERNAL "${LANG} compiler's OpenMP specification date")
  595. endif()
  596. _OPENMP_SET_VERSION_BY_SPEC_DATE("${LANG}")
  597. set(OpenMP_${LANG}_FIND_QUIETLY ${OpenMP_FIND_QUIETLY})
  598. set(OpenMP_${LANG}_FIND_REQUIRED ${OpenMP_FIND_REQUIRED})
  599. set(OpenMP_${LANG}_FIND_VERSION ${OpenMP_FIND_VERSION})
  600. set(OpenMP_${LANG}_FIND_VERSION_EXACT ${OpenMP_FIND_VERSION_EXACT})
  601. set(_OPENMP_${LANG}_REQUIRED_VARS OpenMP_${LANG}_FLAGS)
  602. if("${OpenMP_${LANG}_LIB_NAMES}" STREQUAL "NOTFOUND")
  603. set(_OPENMP_${LANG}_REQUIRED_LIB_VARS OpenMP_${LANG}_LIB_NAMES)
  604. else()
  605. foreach(_OPENMP_IMPLICIT_LIB IN LISTS OpenMP_${LANG}_LIB_NAMES)
  606. list(APPEND _OPENMP_${LANG}_REQUIRED_LIB_VARS OpenMP_${_OPENMP_IMPLICIT_LIB}_LIBRARY)
  607. endforeach()
  608. endif()
  609. find_package_handle_standard_args(OpenMP_${LANG}
  610. NAME_MISMATCHED
  611. REQUIRED_VARS OpenMP_${LANG}_FLAGS ${_OPENMP_${LANG}_REQUIRED_LIB_VARS}
  612. VERSION_VAR OpenMP_${LANG}_VERSION
  613. )
  614. if(OpenMP_${LANG}_FOUND)
  615. if(DEFINED OpenMP_${LANG}_VERSION)
  616. if(NOT _OpenMP_MIN_VERSION OR _OpenMP_MIN_VERSION VERSION_GREATER OpenMP_${LANG}_VERSION)
  617. set(_OpenMP_MIN_VERSION OpenMP_${LANG}_VERSION)
  618. endif()
  619. endif()
  620. set(OpenMP_${LANG}_LIBRARIES "")
  621. foreach(_OPENMP_IMPLICIT_LIB IN LISTS OpenMP_${LANG}_LIB_NAMES)
  622. list(APPEND OpenMP_${LANG}_LIBRARIES "${OpenMP_${_OPENMP_IMPLICIT_LIB}_LIBRARY}")
  623. endforeach()
  624. if(OpenMP_${LANG}_INCLUDE_DIR)
  625. set(OpenMP_${LANG}_INCLUDE_DIRS ${OpenMP_${LANG}_INCLUDE_DIR})
  626. else()
  627. set(OpenMP_${LANG}_INCLUDE_DIRS "")
  628. endif()
  629. if(NOT TARGET OpenMP::OpenMP_${LANG})
  630. add_library(OpenMP::OpenMP_${LANG} INTERFACE IMPORTED)
  631. endif()
  632. if(OpenMP_${LANG}_FLAGS)
  633. set_property(TARGET OpenMP::OpenMP_${LANG} PROPERTY
  634. INTERFACE_COMPILE_OPTIONS "$<$<COMPILE_LANGUAGE:${LANG}>:SHELL:${OpenMP_${LANG}_FLAGS}>")
  635. if(CMAKE_${LANG}_COMPILER_ID STREQUAL "Fujitsu"
  636. OR ${CMAKE_${LANG}_COMPILER_ID} STREQUAL "IntelLLVM"
  637. OR CMAKE_${LANG}_COMPILER_ID MATCHES "^(Cray|CrayClang)$")
  638. set_property(TARGET OpenMP::OpenMP_${LANG} PROPERTY
  639. INTERFACE_LINK_OPTIONS "SHELL:${OpenMP_${LANG}_FLAGS}")
  640. endif()
  641. endif()
  642. if(OpenMP_${LANG}_INCLUDE_DIRS)
  643. set_property(TARGET OpenMP::OpenMP_${LANG} PROPERTY
  644. INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${OpenMP_${LANG}_INCLUDE_DIRS}>")
  645. endif()
  646. if(OpenMP_${LANG}_LIBRARIES)
  647. set_property(TARGET OpenMP::OpenMP_${LANG} PROPERTY
  648. INTERFACE_LINK_LIBRARIES "${OpenMP_${LANG}_LIBRARIES}")
  649. endif()
  650. endif()
  651. endif()
  652. endforeach()
  653. unset(_OpenMP_REQ_VARS)
  654. foreach(LANG IN ITEMS C CXX CUDA Fortran)
  655. if((NOT OpenMP_FIND_COMPONENTS AND CMAKE_${LANG}_COMPILER_LOADED) OR LANG IN_LIST OpenMP_FIND_COMPONENTS)
  656. list(APPEND _OpenMP_REQ_VARS "OpenMP_${LANG}_FOUND")
  657. endif()
  658. endforeach()
  659. find_package_handle_standard_args(OpenMP
  660. REQUIRED_VARS ${_OpenMP_REQ_VARS}
  661. VERSION_VAR ${_OpenMP_MIN_VERSION}
  662. HANDLE_COMPONENTS)
  663. if(CMAKE_Fortran_COMPILER_LOADED AND OpenMP_Fortran_FOUND)
  664. if(NOT DEFINED OpenMP_Fortran_HAVE_OMPLIB_MODULE)
  665. set(OpenMP_Fortran_HAVE_OMPLIB_MODULE FALSE CACHE BOOL INTERNAL "")
  666. endif()
  667. if(NOT DEFINED OpenMP_Fortran_HAVE_OMPLIB_HEADER)
  668. set(OpenMP_Fortran_HAVE_OMPLIB_HEADER FALSE CACHE BOOL INTERNAL "")
  669. endif()
  670. endif()
  671. if(NOT ( CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED OR CMAKE_CUDA_COMPILER_LOADED OR CMAKE_Fortran_COMPILER_LOADED ))
  672. message(SEND_ERROR "FindOpenMP requires the C, CXX, CUDA, or Fortran languages to be enabled")
  673. endif()
  674. unset(OpenMP_C_CXX_TEST_SOURCE)
  675. unset(OpenMP_Fortran_TEST_SOURCE)
  676. unset(OpenMP_C_CXX_CHECK_VERSION_SOURCE)
  677. unset(OpenMP_Fortran_CHECK_VERSION_SOURCE)
  678. unset(OpenMP_Fortran_INCLUDE_LINE)
  679. cmake_policy(POP)