From b0ea36b82a905a654ff93db8f870df3e78c5d428 Mon Sep 17 00:00:00 2001
From: Martin Schneider <martin.schneider@iws.uni-stuttgart.de>
Date: Mon, 14 Nov 2016 14:29:51 +0100
Subject: [PATCH] [cmake] Add NLOPT and GLPK cmake find scripts

The NLOPT and GLPK are libraries for nonlinear and linear
optimization algorithms.
---
 cmake/modules/DumuxMacros.cmake |  2 +
 cmake/modules/FindGLPK.cmake    | 96 +++++++++++++++++++++++++++++++++
 cmake/modules/FindNLOPT.cmake   | 96 +++++++++++++++++++++++++++++++++
 3 files changed, 194 insertions(+)
 create mode 100644 cmake/modules/FindGLPK.cmake
 create mode 100644 cmake/modules/FindNLOPT.cmake

diff --git a/cmake/modules/DumuxMacros.cmake b/cmake/modules/DumuxMacros.cmake
index b3e7328fe3..97ea267aa2 100644
--- a/cmake/modules/DumuxMacros.cmake
+++ b/cmake/modules/DumuxMacros.cmake
@@ -4,9 +4,11 @@ include(AddInputFileLinks)
 include(DumuxDoxygen)
 include(DumuxTestMacros)
 
+find_package(GLPK)
 find_package(Gstat)
 find_package(Gnuplot)
 set(HAVE_GNUPLOT ${GNUPLOT_FOUND})
 
+find_package(NLOPT)
 find_package(Valgrind)
 find_package(PTScotch)
diff --git a/cmake/modules/FindGLPK.cmake b/cmake/modules/FindGLPK.cmake
new file mode 100644
index 0000000000..9883ba2868
--- /dev/null
+++ b/cmake/modules/FindGLPK.cmake
@@ -0,0 +1,96 @@
+#
+# Module that checks whether GLPK is available and usable.
+#
+# Variables used by this module which you may want to set:
+# GLPK_ROOT         Path list to search for GLPK
+#
+# Sets the follwing variable:
+#
+# GLPK_FOUND           True if GLPK available and usable.
+# GLPK_INCLUDE_DIRS    Path to the GLPK include dirs.
+# GLPK_LIBRARIES       Name to the GLPK library.
+#
+
+# look for header files, only at positions given by the user
+find_path(GLPK_INCLUDE_DIR
+  NAMES glpk.h
+  PATHS ${GLPK_PREFIX} ${GLPK_ROOT}
+  PATH_SUFFIXES "glpk" "include/glpk" "include" "SRC" "src"
+  NO_DEFAULT_PATH
+)
+
+# look for header files, including default paths
+find_path(GLPK_INCLUDE_DIR
+  NAMES glpk.h
+  PATH_SUFFIXES "glpk" "include/glpk" "include" "SRC" "src"
+)
+
+# look for library, only at positions given by the user
+find_library(GLPK_LIBRARY
+  NAMES "glpk"
+  PATHS ${GLPK_PREFIX} ${GLPK_ROOT} ${GLPK_ROOT}/src/ ${GLPK_ROOT}/src/.libs/
+  PATH_SUFFIXES "lib" "lib32" "lib64" "libglpk"
+  NO_DEFAULT_PATH
+)
+
+# look for library files, including default paths
+find_library(GLPK_LIBRARY
+  NAMES "glpk"
+  PATH_SUFFIXES "lib" "lib32" "lib64" "libglpk"
+)
+
+# check version specific macros
+include(CheckCSourceCompiles)
+include(CMakePushCheckState)
+cmake_push_check_state()
+
+# we need if clauses here because variable is set variable-NOTFOUND
+#
+if(GLPK_INCLUDE_DIR)
+  set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${GLPK_INCLUDE_DIR})
+endif(GLPK_INCLUDE_DIR)
+if(GLPK_LIBRARY)
+  set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${GLPK_LIBRARY})
+endif(GLPK_LIBRARY)
+
+# handle package arguments
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(
+  "GLPK"
+  DEFAULT_MSG
+  GLPK_INCLUDE_DIR
+  GLPK_LIBRARY
+)
+
+mark_as_advanced(GLPK_INCLUDE_DIR GLPK_LIBRARY)
+
+# if both headers and library are found, store results
+if(GLPK_FOUND)
+  set(GLPK_INCLUDE_DIRS ${GLPK_INCLUDE_DIR})
+  set(GLPK_LIBRARIES    ${GLPK_LIBRARY})
+  # log result
+  file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
+    "Determining location of GLPK succeeded:\n"
+    "Include directory: ${GLPK_INCLUDE_DIRS}\n"
+    "Library directory: ${GLPK_LIBRARIES}\n\n")
+  set(GLPK_DUNE_COMPILE_FLAGS "${GLPK_INCLUDE_DIRS}"
+    CACHE STRING "Compile flags used by DUNE when compiling GLPK programs")
+  set(GLPK_DUNE_LIBRARIES ${GLPK_LIBRARIES}
+    CACHE STRING "Libraries used by DUNE when linking GLPK programs")
+else(GLPK_FOUND)
+  # log errornous result
+  file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
+    "Determining location of GLPK failed:\n"
+    "Include directory: ${GLPK_INCLUDE_DIRS}\n"
+    "Library directory: ${GLPK_LIBRARIES}\n\n")
+endif(GLPK_FOUND)
+
+# set HAVE_GLPK for config.h
+set(HAVE_GLPK ${GLPK_FOUND})
+
+# register all GLPK related flags
+if(GLPK_FOUND)
+  dune_register_package_flags(COMPILE_DEFINITIONS "ENABLE_GLPK=1"
+                              LIBRARIES "${GLPK_DUNE_LIBRARIES}"
+                              INCLUDE_DIRS "${GLPK_INCLUDE_DIRS}")
+endif()
diff --git a/cmake/modules/FindNLOPT.cmake b/cmake/modules/FindNLOPT.cmake
new file mode 100644
index 0000000000..e2a83e7b98
--- /dev/null
+++ b/cmake/modules/FindNLOPT.cmake
@@ -0,0 +1,96 @@
+#
+# Module that checks whether NLOPT is available and usable.
+#
+# Variables used by this module which you may want to set:
+# NLOPT_ROOT         Path list to search for NLOPT
+#
+# Sets the follwing variable:
+#
+# NLOPT_FOUND           True if NLOPT available and usable.
+# NLOPT_INCLUDE_DIRS    Path to the NLOPT include dirs.
+# NLOPT_LIBRARIES       Name to the NLOPT library.
+#
+
+# look for header files, only at positions given by the user
+find_path(NLOPT_INCLUDE_DIR
+  NAMES nlopt.h
+  PATHS ${NLOPT_PREFIX} ${NLOPT_ROOT}
+  PATH_SUFFIXES "nlopt" "include/nlopt" "include" "SRC" "src" "api"
+  NO_DEFAULT_PATH
+)
+
+# look for header files, including default paths
+find_path(NLOPT_INCLUDE_DIR
+  NAMES nlopt.h
+  PATH_SUFFIXES "nlopt" "include/nlopt" "include" "SRC" "src"
+)
+
+# look for library, only at positions given by the user
+find_library(NLOPT_LIBRARY
+  NAMES "nlopt"
+  PATHS ${NLOPT_PREFIX} ${NLOPT_ROOT} ${NLOPT_ROOT}/.libs/
+  PATH_SUFFIXES "lib" "lib32" "lib64" "libnlopt"
+  NO_DEFAULT_PATH
+)
+
+# look for library files, including default paths
+find_library(NLOPT_LIBRARY
+  NAMES "nlopt"
+  PATH_SUFFIXES "lib" "lib32" "lib64" "libnlopt"
+)
+
+# check version specific macros
+include(CheckCSourceCompiles)
+include(CMakePushCheckState)
+cmake_push_check_state()
+
+# we need if clauses here because variable is set variable-NOTFOUND
+#
+if(NLOPT_INCLUDE_DIR)
+  set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${NLOPT_INCLUDE_DIR})
+endif(NLOPT_INCLUDE_DIR)
+if(NLOPT_LIBRARY)
+  set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${NLOPT_LIBRARY})
+endif(NLOPT_LIBRARY)
+
+# behave like a CMake module is supposed to behave
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(
+  "NLOPT"
+  DEFAULT_MSG
+  NLOPT_INCLUDE_DIR
+  NLOPT_LIBRARY
+)
+
+mark_as_advanced(NLOPT_INCLUDE_DIR NLOPT_LIBRARY)
+
+# if both headers and library are found, store results
+if(NLOPT_FOUND)
+  set(NLOPT_INCLUDE_DIRS ${NLOPT_INCLUDE_DIR})
+  set(NLOPT_LIBRARIES    ${NLOPT_LIBRARY})
+  # log result
+  file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
+    "Determining location of NLOPT succeeded:\n"
+    "Include directory: ${NLOPT_INCLUDE_DIRS}\n"
+    "Library directory: ${NLOPT_LIBRARIES}\n\n")
+  set(NLOPT_DUNE_COMPILE_FLAGS "${NLOPT_INCLUDE_DIRS}"
+    CACHE STRING "Compile flags used by DUNE when compiling NLOPT programs")
+  set(NLOPT_DUNE_LIBRARIES ${NLOPT_LIBRARIES}
+    CACHE STRING "Libraries used by DUNE when linking NLOPT programs")
+else(NLOPT_FOUND)
+  # log errornous result
+  file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
+    "Determining location of NLOPT failed:\n"
+    "Include directory: ${NLOPT_INCLUDE_DIRS}\n"
+    "Library directory: ${NLOPT_LIBRARIES}\n\n")
+endif(NLOPT_FOUND)
+
+# set HAVE_NLOPT for config.h
+set(HAVE_NLOPT ${NLOPT_FOUND})
+
+# register all NLOPT related flags
+if(NLOPT_FOUND)
+  dune_register_package_flags(COMPILE_DEFINITIONS "ENABLE_NLOPT=1"
+                              LIBRARIES "${NLOPT_DUNE_LIBRARIES}"
+                              INCLUDE_DIRS "${NLOPT_INCLUDE_DIRS}")
+endif()
-- 
GitLab