From 1a9873a2b6b7a30778741d5fba39844fa47fb674 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Thu, 17 Oct 2024 19:06:21 +0200
Subject: [PATCH] Add cmake infrastructure to detect and use libslurm

---
 CMakeLists.txt               | 19 +++++++++++++
 cmake/FindSlurm.cmake        | 54 ++++++++++++++++++++++++++++++++++++
 src/utils/pugs_config.hpp.in |  1 +
 tests/CMakeLists.txt         |  2 ++
 4 files changed, 76 insertions(+)
 create mode 100644 cmake/FindSlurm.cmake

diff --git a/CMakeLists.txt b/CMakeLists.txt
index e37052808..cca562a86 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -244,6 +244,17 @@ else()
   unset(PUGS_HAS_HDF5)
 endif()
 
+#------------------------------------------------------
+# search for libslurm
+
+find_package(Slurm)
+
+set(PUGS_HAS_SLURM ${SLURM_FOUND})
+
+if (${SLURM_FOUND})
+  include_directories(SYSTEM "${SLURM_INCLUDE_DIR}")
+endif()
+
 #------------------------------------------------------
 # search for clang-format
 
@@ -620,6 +631,7 @@ target_link_libraries(
   ${OPENMP_LINK_FLAGS}
   ${PUGS_STD_LINK_FLAGS}
   ${HIGHFIVE_TARGET}
+  ${SLURM_LIBRARY}
   stdc++fs
   )
 
@@ -654,6 +666,7 @@ target_link_libraries(
   ${OPENMP_LINK_FLAGS}
   ${PUGS_STD_LINK_FLAGS}
   ${HIGHFIVE_TARGET}
+  ${SLURM_LIBRARY}
   stdc++fs
   )
 
@@ -746,6 +759,12 @@ else()
   endif()
 endif()
 
+if (SLURM_FOUND)
+  message(" SLURM library: ${SLURM_LIBRARY}")
+else()
+  message(" SLURM library: not found!")
+endif()
+
 message("----------- utilities ----------")
 
 if(CLANG_FORMAT)
diff --git a/cmake/FindSlurm.cmake b/cmake/FindSlurm.cmake
new file mode 100644
index 000000000..4904687ed
--- /dev/null
+++ b/cmake/FindSlurm.cmake
@@ -0,0 +1,54 @@
+# Looking for Slurm
+
+find_package(PkgConfig)
+pkg_check_modules(PC_SLURM QUIET SLURM)
+
+find_path(SLURM_INCLUDE_DIR
+  NAMES
+    "slurm/slurm.h"
+    "slurm/spank.h"
+  PATHS
+    ENV SLURM
+    ENV SLURM_PATH
+    ENV SLURM_ROOT
+    ENV CPATH
+    ENV C_INCLUDE_PATH
+    ENV CPLUS_INCLUDE_PATH
+  PATH_SUFFIXES
+    "include"
+  DOC
+  "Path to the SLURM include directory")
+
+find_library(SLURM_LIBRARY
+  NAMES
+    slurm
+  PATHS
+    ENV SLURM
+    ENV SLURM_PATH
+    ENV SLURM_ROOT
+    ENV LD_LIBRARY_PATH
+    ENV LIBRARY_PATH
+    ENV PATH
+  PATH_SUFFIXES
+    "lib"
+    "lib64"
+  DOC
+    "Path to the SLURM shared library")
+
+ if(EXISTS "${SLURM_INCLUDE_DIR}/slurm/slurm.h")
+   message(STATUS "Found slurm.h in ${SLURM_INCLUDE_DIR}")
+   if("${SLURM_LIBRARY}" STREQUAL "SLURM_LIBDIR-NOTFOUND")
+     message(WARNING "Could not find slurm library.")
+   endif()
+   message(STATUS "Found slurm library ${SLURM_LIBRARY}")
+ else()
+   message(WARNING "Could not find slurm include dir.")
+ endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(Slurm
+  FOUND_VAR
+    SLURM_FOUND
+  REQUIRED_VARS
+    SLURM_LIBRARY
+    SLURM_INCLUDE_DIR)
diff --git a/src/utils/pugs_config.hpp.in b/src/utils/pugs_config.hpp.in
index 4dc5babd4..7402a526d 100644
--- a/src/utils/pugs_config.hpp.in
+++ b/src/utils/pugs_config.hpp.in
@@ -6,6 +6,7 @@
 #cmakedefine PUGS_HAS_PETSC
 #cmakedefine PUGS_HAS_SLEPC
 #cmakedefine PUGS_HAS_HDF5
+#cmakedefine PUGS_HAS_SLURM
 
 #cmakedefine SYSTEM_IS_LINUX
 #cmakedefine SYSTEM_IS_DARWIN
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index aafe42013..f533f3194 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -276,6 +276,7 @@ target_link_libraries (unit_tests
   Catch2
   ${PUGS_STD_LINK_FLAGS}
   ${HIGHFIVE_TARGET}
+  ${SLURM_LIBRARY}
   stdc++fs
   )
 
@@ -307,5 +308,6 @@ target_link_libraries (mpi_unit_tests
   Catch2
   ${PUGS_STD_LINK_FLAGS}
   ${HIGHFIVE_TARGET}
+  ${SLURM_LIBRARY}
   stdc++fs
   )
-- 
GitLab