diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4f3e337f2c98ad994743452e0e38b33436f2f392..25bcdffeb3e7694e5d297461248c8c11ad2896d1 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 204d6fa93a4eca84d7c22b1e0ff8da25e746a392..68c1dfb6e780952085683a8687dbd5c0ebf85851 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 5bea088560a764dbec14df183b01b1b7628d7b67..5c31bb4652457eeb1d26e7bfe63f04ac4f359134 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 7467130e97e9a3c35e9f86f32f7ba0ac817b5d56..dd88b0acef75c61def7137ee0b0746aacf5b4e34 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()