From 1579a6d4e6e17a3484d68fe597ac1765e386e25f Mon Sep 17 00:00:00 2001
From: Lars Bilke <lars.bilke@ufz.de>
Date: Wed, 16 Feb 2022 11:59:50 +0100
Subject: [PATCH] [cmake] Use a better FindMKL.cmake which includes also linker
 flags.

Environment variable MKLROOT is required!

Detection is based on mkl_link_tool.
---
 CMakeLists.txt                 | 16 ++++++++++++++--
 MathLib/CMakeLists.txt         |  4 +++-
 scripts/cmake/CMakeSetup.cmake |  9 +++++++++
 scripts/cmake/Find.cmake       | 22 ++++++++++++++++++++++
 4 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4f3e337f2c9..25bcdffeb3e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -67,6 +67,18 @@ if(MSVC)
     set(CMD_COMMAND "cmd;/c")
 endif()
 
+option(OGS_USE_MKL "Use Intel MKL" OFF)
+if(OGS_USE_MKL)
+    option(MKL_USE_parallel "Use MKL parallel" True)
+    option(MKL_USE_sdl "Single Dynamic Library or static/dynamic" False)
+    set(MKL_USE_interface
+        "lp64"
+        CACHE
+            STRING
+            "for Intel(R)64 compatible arch: ilp64/lp64 or for ia32 arch: cdecl/stdcall"
+    )
+endif()
+
 # ---- CMake includes ----
 include(Versions)
 include(GitSetup)
@@ -144,8 +156,6 @@ else()
 endif()
 # Eigen End
 
-option(OGS_USE_MKL "Use Intel MKL" OFF)
-
 # Debug
 option(OGS_FATAL_ABORT "Abort in OGS_FATAL" OFF)
 
@@ -274,3 +284,5 @@ unset(PRE_INSTALL_RUN CACHE)
 include(Features)
 
 printEnabledProcesses()
+
+printMKLUsage()
diff --git a/MathLib/CMakeLists.txt b/MathLib/CMakeLists.txt
index 204d6fa93a4..68c1dfb6e78 100644
--- a/MathLib/CMakeLists.txt
+++ b/MathLib/CMakeLists.txt
@@ -41,7 +41,9 @@ if(OGS_USE_LIS)
 endif()
 if(OGS_USE_MKL)
     target_include_directories(MathLib PRIVATE ${MKL_INCLUDE_DIR})
-    target_link_libraries(MathLib PUBLIC ${MKL_LIBRARIES})
+    target_link_libraries(MathLib PRIVATE ${MKL_LIBRARIES})
+    target_link_options(MathLib PUBLIC ${MKL_LINK_FLAGS})
+    target_compile_definitions(MathLib PRIVATE ${MKL_DEFINITIONS})
 endif()
 
 target_compile_definitions(
diff --git a/scripts/cmake/CMakeSetup.cmake b/scripts/cmake/CMakeSetup.cmake
index 5bea088560a..5c31bb46524 100644
--- a/scripts/cmake/CMakeSetup.cmake
+++ b/scripts/cmake/CMakeSetup.cmake
@@ -16,11 +16,20 @@ CPMAddPackage(
     GIT_TAG d98828f54f6974717798e63195cfbf08fe2daad0
     DOWNLOAD_ONLY YES
 )
+# To be replaced later. See
+# https://gitlab.kitware.com/cmake/cmake/-/issues/22831
+CPMAddPackage(
+    NAME findmkl_cmake
+    GITHUB_REPOSITORY bilke/findmkl_cmake
+    GIT_TAG c8a6db75ae33b580cfc7d09d5b68493229793c33
+    DOWNLOAD_ONLY YES
+)
 set(CMAKE_MODULE_PATH
     ${CMAKE_MODULE_PATH}
     "${PROJECT_SOURCE_DIR}/scripts/cmake"
     "${PROJECT_SOURCE_DIR}/scripts/cmake/jedbrown"
     "${PROJECT_SOURCE_DIR}/scripts/cmake/vector-of-bool"
+    "${findmkl_cmake_SOURCE_DIR}/cmake"
     "${cmake-modules_SOURCE_DIR}"
 )
 
diff --git a/scripts/cmake/Find.cmake b/scripts/cmake/Find.cmake
index 7467130e97e..dd88b0acef7 100644
--- a/scripts/cmake/Find.cmake
+++ b/scripts/cmake/Find.cmake
@@ -101,9 +101,31 @@ find_package(GEOTIFF)
 
 if(OGS_USE_MKL)
     find_package(MKL REQUIRED)
+    find_file(MKL_SETVARS setvars.sh PATHS ${MKL_ROOT_DIR} ${MKL_ROOT_DIR}/..
+                                           ${MKL_ROOT_DIR}/../..
+              NO_DEFAULT_PATH
+    )
 endif()
 
 # Check MPI package
 if(OGS_USE_MPI)
     find_package(MPI REQUIRED)
 endif()
+
+# Prints instructions for setting MKL runtime environment.
+function(printMKLUsage)
+    if(NOT OGS_USE_MKL)
+        return()
+    endif()
+    if(MKL_SETVARS)
+        message(
+            STATUS
+                "NOTE: Please run `source ${MKL_SETVARS}` to set LD_LIBRARY_PATH for MKL!\n"
+        )
+    else()
+        message(
+            STATUS
+                "NOTE: Please set LD_LIBRARY_PATH with `export LD_LIBRARY_PATH=${MKL_LIBRARY_DIR}`!\n"
+        )
+    endif()
+endfunction()
-- 
GitLab