From bb84a71dba9303fae409e369cb3957675c175859 Mon Sep 17 00:00:00 2001
From: Florian Uhlig <f.uhlig@gsi.de>
Date: Tue, 23 Feb 2021 09:51:18 +0100
Subject: [PATCH] Fix usage of OpenMP on macosx

On macosx one needs a openmp installation which does not come with the system,
at least the omp.h header file is missing. brew has a package libomp which
installs the header and a library. Both are found by the cmake module
FindOpenMP and properly used during the compilation and linking.
In themoment there is still a runtime error when executing the L1 tracking
with OpenMP support on macosx, so switch off OpenMP for the time being.
The problem is investigated already. refs #2028.

Cleanup OpenMP handling in the build system. Move check for OpenMP to top
level. Remove OpenMP usage from all libs were it is not needed.
---
 CMakeLists.txt                         |  7 ++++
 analysis/detectors/sts/CMakeLists.txt  |  9 ----
 reco/L1/CMakeLists.txt                 | 58 +++++++++++++++++---------
 reco/detectors/sts/CMakeLists.txt      | 10 ++---
 reco/tracking/lx/Simple/CMakeLists.txt |  2 -
 reco/tracking/lxTriplet/CMakeLists.txt |  6 ---
 sim/detectors/sts/CMakeLists.txt       |  9 ----
 7 files changed, 51 insertions(+), 50 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 56c454c052..13772c164f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -302,6 +302,13 @@ else(CBMROOT_MINIMAL)
       set(FairMQ_HAS_StateMachine FALSE)
     endif()
   endif()
+
+  # For the time being don't use OpenMP on APPLE
+  # There are runtime problems with L1 (Redmine #2028)
+  if(NOT APPLE)
+    find_package(OpenMP)
+  endif()
+
 endif(CBMROOT_MINIMAL)
 
 # set a variable which should be used in all CMakeLists.txt
diff --git a/analysis/detectors/sts/CMakeLists.txt b/analysis/detectors/sts/CMakeLists.txt
index 8b9e9c0139..fb9724d2ac 100644
--- a/analysis/detectors/sts/CMakeLists.txt
+++ b/analysis/detectors/sts/CMakeLists.txt
@@ -49,15 +49,6 @@ set(LINKDEF ${LIBRARY_NAME}LinkDef.h)
 # ---------------------------------------------------------
 
 
-# ---- Enable OpenMP  -------------------------------------
-find_package(OpenMP)
-if (OPENMP_FOUND)
-  set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
-  set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
-endif()
-# ---------------------------------------------------------
-
-
 # -----  Let cmake do the job   ---------------------------
 include_directories( ${INCLUDE_DIRECTORIES})
 include_directories(SYSTEM ${SYSTEM_INCLUDE_DIRECTORIES})
diff --git a/reco/L1/CMakeLists.txt b/reco/L1/CMakeLists.txt
index 96810c9529..468e2f35e1 100644
--- a/reco/L1/CMakeLists.txt
+++ b/reco/L1/CMakeLists.txt
@@ -53,6 +53,19 @@ Set(SYSTEM_INCLUDE_DIRECTORIES
   ${KFParticle_INCLUDE_DIR}
 )
 
+# For the time being don't use OpenMP on APPLE
+# There are runtime problems with L1 (Redmine #2028)
+if(NOT APPLE)
+  if (OPENMP_FOUND)
+    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
+    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
+    set(SYSTEM_INCLUDE_DIRECTORIES
+      ${SYSTEM_INCLUDE_DIRECTORIES}
+      ${OpenMP_CXX_INCLUDE_DIRS}
+    )
+  endif()
+endif()
+
 Include_Directories(SYSTEM ${SYSTEM_INCLUDE_DIRECTORIES})
 
 set(LINK_DIRECTORIES
@@ -62,6 +75,14 @@ ${ROOT_LIBRARY_DIR}
 ${FAIRROOT_LIBRARY_DIR}
 ${Boost_LIBRARY_DIRS}
 )
+
+if (OPENMP_FOUND AND APPLE)
+  get_filename_component(OpenMP_CXX_LIBRARY_DIR ${OpenMP_CXX_LIBRARIES} DIRECTORY)
+  Set(LINK_DIRECTORIES
+    ${LINK_DIRECTORIES}
+    ${OpenMP_CXX_LIBRARY_DIR}
+  )
+endif()
  
 link_directories( ${LINK_DIRECTORIES})
 
@@ -140,11 +161,6 @@ OffLineInterface/CbmL1StsTrackFinder.h
 
 
 
-find_package(OpenMP)
-if (OPENMP_FOUND)
-  set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
-  set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
-endif()
 
 If(APPLE)
   ADD_DEFINITIONS(-Wall -Wsign-promo -Wctor-dtor-privacy -Wreorder -Wno-deprecated -Wno-parentheses -DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -DUSE_TIMERS) #   -Weffc++ -Wnon-virtual-dtor -Woverloaded-virtual -Wold-style-cast : wait for other parts of cbmroot\root. 
@@ -162,17 +178,6 @@ If(APPLE)
     ADD_DEFINITIONS(-Wno-non-template-friend)
   EndIf()
 
-  if (OPENMP_FOUND)
-    Execute_Process(COMMAND clang++ -print-prog-name=clang++
-                  OUTPUT_VARIABLE _Exe)
-    Get_Filename_Component(link_directory ${_Exe} DIRECTORY)
-    Set(link_directory "${link_directory}/../lib") 
-    Set(LINK_DIRECTORIES
-      ${LINK_DIRECTORIES}
-      ${link_directory}
-    )
-    link_directories( ${LINK_DIRECTORIES})
-  endif()
 
 Else()
   
@@ -194,10 +199,16 @@ ENDIF (SSE_FOUND)
 
 set(LINKDEF L1LinkDef.h)
 Set(LIBRARY_NAME L1)
-Set(DEPENDENCIES
-    #Rich 
+if (OPENMP_FOUND AND APPLE)
+  Set(DEPENDENCIES
+    KF CbmMuchBase CbmTrdBase CbmStsBase CbmRecoBase CbmBase CbmData CbmRecoSts Base boost_regex ${OpenMP_CXX_LIBRARIES}
+#   KF CbmMuchBase CbmTrdBase CbmStsBase CbmRecoBase CbmBase CbmData CbmRecoSts Base boost_regex omp
+  )
+else()
+  Set(DEPENDENCIES
     KF CbmMuchBase CbmTrdBase CbmStsBase CbmRecoBase CbmBase CbmData CbmRecoSts Base boost_regex
-)
+  )
+endif()
 
 GENERATE_LIBRARY()
 
@@ -205,3 +216,12 @@ Install(FILES CbmL1Counters.h
               L1Algo/L1EventEfficiencies.h
         DESTINATION include
        )
+
+# Test to check if OpenMP is working on APPLE
+#set(EXE_NAME test_openmp)
+#set(SRCS test.cxx)
+#set(DEPENDENCIES
+#  ${DEPENDENCIES}
+#  omp
+#)
+#GENERATE_EXECUTABLE()
diff --git a/reco/detectors/sts/CMakeLists.txt b/reco/detectors/sts/CMakeLists.txt
index 7a22abb28b..0dc91bcde2 100644
--- a/reco/detectors/sts/CMakeLists.txt
+++ b/reco/detectors/sts/CMakeLists.txt
@@ -78,11 +78,11 @@ set(LINKDEF ${LIBRARY_NAME}LinkDef.h)
 
 
 # ---- Enable OpenMP  -------------------------------------
-find_package(OpenMP)
-if (OPENMP_FOUND)
-  set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
-  set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
-endif()
+# Comented since the OpenMP code is also commented in the moment
+#if (OPENMP_FOUND)
+#  set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
+#  set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
+#endif()
 # ---------------------------------------------------------
 
 
diff --git a/reco/tracking/lx/Simple/CMakeLists.txt b/reco/tracking/lx/Simple/CMakeLists.txt
index 04410405d9..5b53647a12 100644
--- a/reco/tracking/lx/Simple/CMakeLists.txt
+++ b/reco/tracking/lx/Simple/CMakeLists.txt
@@ -39,8 +39,6 @@ Set(SRCS
   LxTrackAna.cxx
 )
 
-find_package(OpenMP)
-
 If (OPENMP_FOUND)
   Set(SRCS ${SRCS} LxParall.cxx)
 EndIf (OPENMP_FOUND)
diff --git a/reco/tracking/lxTriplet/CMakeLists.txt b/reco/tracking/lxTriplet/CMakeLists.txt
index 6ac0362d64..e0599c6c9e 100644
--- a/reco/tracking/lxTriplet/CMakeLists.txt
+++ b/reco/tracking/lxTriplet/CMakeLists.txt
@@ -39,8 +39,6 @@ Set(SRCS
   LxTrackAna.cxx
 )
 
-find_package(OpenMP)
-
 Set(NO_DICT_SRCS
   LxCATriplets.cxx
   LxEff.cxx
@@ -49,10 +47,6 @@ Set(NO_DICT_SRCS
   LxUtils.cxx
 )
 
-If (OPENMP_FOUND)
-  Set( CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -mavx -fopenmp" )
-EndIf (OPENMP_FOUND)
-
 set(LINKDEF LxLinkDef.h)
 Set(LIBRARY_NAME LxTrackTripplet)
 Set(DEPENDENCIES
diff --git a/sim/detectors/sts/CMakeLists.txt b/sim/detectors/sts/CMakeLists.txt
index df54d5e358..d573e16743 100644
--- a/sim/detectors/sts/CMakeLists.txt
+++ b/sim/detectors/sts/CMakeLists.txt
@@ -78,15 +78,6 @@ set(LINKDEF ${LIBRARY_NAME}LinkDef.h)
 # ---------------------------------------------------------
 
 
-# ---- Enable OpenMP  -------------------------------------
-find_package(OpenMP)
-if (OPENMP_FOUND)
-  set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
-  set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
-endif()
-# ---------------------------------------------------------
-
-
 # -----  Create the library  ------------------------------
 include_directories( ${INCLUDE_DIRECTORIES})
 include_directories(SYSTEM ${SYSTEM_INCLUDE_DIRECTORIES})
-- 
GitLab