aboutsummaryrefslogtreecommitdiff
path: root/devel/cmake/files/patch-Modules_FindOpenMP.cmake
blob: bed38ca7823f2f8429029303482cf58af47e7971 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
Avoid looking for pthread by simply asserting that it is there.
Otherwise openmp can't be found because the pthread library
lives in /usr/lib and CMake 3.11 doesn't look there anymore
while looking for openmp. PR 223678.

Look for omp.h in LOCALBASE and pass suitable -I and -L flags
if those are necessary. Also use OpenMP flags when linking.
PR 223678 and PR 234050.

--- Modules/FindOpenMP.cmake.orig	2019-04-03 08:45:25 UTC
+++ Modules/FindOpenMP.cmake
@@ -80,6 +80,33 @@ cmake_policy(SET CMP0012 NEW) # if() recognizes number
 cmake_policy(SET CMP0054 NEW) # if() quoted variables not dereferenced
 cmake_policy(SET CMP0057 NEW) # if IN_LIST
 
+set(OpenMP_pthread_LIBRARY -lpthread)
+
+# If the compiler itself has support for OpenMP, then omp.h is hidden
+# away somewhere and it won't be found here; but if the support comes
+# from an external package, it needs to have the right -I and -L flags.
+find_file(_path_to_omp_h omp.h)
+if(NOT _path_to_omp_h)
+  find_file(_path_to_omp_h omp.h
+    HINTS $ENV{LOCALBASE}/include /usr/local/include)
+endif()
+if(_path_to_omp_h)
+  get_filename_component(OpenMP_INCLUDE_DIR ${_path_to_omp_h} DIRECTORY)
+else()
+  set(OpenMP_INCLUDE_DIR "omp_h-NOTFOUND")
+endif()
+
+find_library(_path_to_omp_lib omp)
+if(NOT _path_to_omp_lib)
+  find_library(_path_to_omp_lib omp
+    PATHS $ENV{LOCALBASE}/lib /usr/local/lib)
+endif()
+if(_path_to_omp_lib)
+  get_filename_component(OpenMP_LIB_DIR ${_path_to_omp_lib} DIRECTORY)
+else()
+  set(OpenMP_LIB_DIR "omp_lib-NOTFOUND")
+endif()
+
 function(_OPENMP_FLAG_CANDIDATES LANG)
   if(NOT OpenMP_${LANG}_FLAG)
     unset(OpenMP_FLAG_CANDIDATES)
@@ -185,6 +212,15 @@ function(_OPENMP_GET_FLAGS LANG FLAG_MODE OPENMP_FLAG_
     if(OpenMP_VERBOSE_COMPILE_OPTIONS)
       string(APPEND OPENMP_FLAGS_TEST " ${OpenMP_VERBOSE_COMPILE_OPTIONS}")
     endif()
+    set(_extra_flag "")
+    if(OpenMP_INCLUDE_DIR)
+      string(APPEND _extra_flag " -I${OpenMP_INCLUDE_DIR}")
+    endif()
+    if(OpenMP_LIB_DIR)
+      string(APPEND _extra_flag " -L${OpenMP_LIB_DIR}")
+    endif()
+    set(_need_extra FALSE)
+
     string(REGEX REPLACE "[-/=+]" "" OPENMP_PLAIN_FLAG "${OPENMP_FLAG}")
     try_compile( OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG} ${CMAKE_BINARY_DIR} ${_OPENMP_TEST_SRC}
       CMAKE_FLAGS "-DCOMPILE_DEFINITIONS:STRING=${OPENMP_FLAGS_TEST}"
@@ -192,8 +228,23 @@ function(_OPENMP_GET_FLAGS LANG FLAG_MODE OPENMP_FLAG_
       OUTPUT_VARIABLE OpenMP_TRY_COMPILE_OUTPUT
     )
 
+    # Might need that -I -L after all..
+    if(NOT OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG})
+      unset(OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG})
+      try_compile( OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG} ${CMAKE_BINARY_DIR} ${_OPENMP_TEST_SRC}
+        CMAKE_FLAGS "-DCOMPILE_DEFINITIONS:STRING=${OPENMP_FLAGS_TEST} ${_extra_flag}"
+        LINK_LIBRARIES ${CMAKE_${LANG}_VERBOSE_FLAG}
+        OUTPUT_VARIABLE OpenMP_TRY_COMPILE_OUTPUT
+      )
+      set(_need_extra TRUE)
+    endif()
+
     if(OpenMP_COMPILE_RESULT_${FLAG_MODE}_${OPENMP_PLAIN_FLAG})
-      set("${OPENMP_FLAG_VAR}" "${OPENMP_FLAG}" PARENT_SCOPE)
+      if(_need_extra)
+        set("${OPENMP_FLAG_VAR}" "${OPENMP_FLAG} ${_extra_flag}" PARENT_SCOPE)
+      else()
+        set("${OPENMP_FLAG_VAR}" "${OPENMP_FLAG}" PARENT_SCOPE)
+      endif()
 
       if(CMAKE_${LANG}_VERBOSE_FLAG)
         unset(OpenMP_${LANG}_IMPLICIT_LIBRARIES)
@@ -491,9 +542,16 @@ foreach(LANG IN LISTS OpenMP_FINDLIST)
         add_library(OpenMP::OpenMP_${LANG} INTERFACE IMPORTED)
       endif()
       if(OpenMP_${LANG}_FLAGS)
-        separate_arguments(_OpenMP_${LANG}_OPTIONS NATIVE_COMMAND "${OpenMP_${LANG}_FLAGS}")
+        # All the options except -L..
+        separate_arguments(_OpenMP_${LANG}_COMPILE_OPTIONS NATIVE_COMMAND "${OpenMP_${LANG}_FLAGS}")
+        list(FILTER _OpenMP_${LANG}_COMPILE_OPTIONS EXCLUDE REGEX "^-L/")
+        # All the options except -I..
+        separate_arguments(_OpenMP_${LANG}_LINK_OPTIONS NATIVE_COMMAND "${OpenMP_${LANG}_FLAGS}")
+        list(FILTER _OpenMP_${LANG}_LINK_OPTIONS EXCLUDE REGEX "^-I/")
         set_property(TARGET OpenMP::OpenMP_${LANG} PROPERTY
-          INTERFACE_COMPILE_OPTIONS "$<$<COMPILE_LANGUAGE:${LANG}>:${_OpenMP_${LANG}_OPTIONS}>")
+          INTERFACE_COMPILE_OPTIONS "$<$<COMPILE_LANGUAGE:${LANG}>:${_OpenMP_${LANG}_COMPILE_OPTIONS}>")
+        set_property(TARGET OpenMP::OpenMP_${LANG} PROPERTY
+          INTERFACE_LINK_OPTIONS "$<$<COMPILE_LANGUAGE:${LANG}>:${_OpenMP_${LANG}_LINK_OPTIONS}>")
         unset(_OpenMP_${LANG}_OPTIONS)
       endif()
       if(OpenMP_${LANG}_LIBRARIES)