From e090b61c5f7fe0307bc4b15ee1970bfe3cd8dcf6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20Gr=C3=BCninger?= <gruenich@dune-project.org>
Date: Fri, 2 Nov 2012 16:24:11 +0000
Subject: [PATCH] [FindParMETIS.cmake] Improve ParMETIS test, tested with
 dune-istl and ParMETIS versions 3.2.0 and 4.0.2.

[[Imported from SVN: r7054]]
---
 cmake/modules/FindParMETIS.cmake | 147 +++++++++++++++++--------------
 1 file changed, 79 insertions(+), 68 deletions(-)

diff --git a/cmake/modules/FindParMETIS.cmake b/cmake/modules/FindParMETIS.cmake
index 85f2b0fb0..aa71114a1 100644
--- a/cmake/modules/FindParMETIS.cmake
+++ b/cmake/modules/FindParMETIS.cmake
@@ -2,18 +2,18 @@
 #
 # Accepts the following variables:
 #
-# ParMETIS_DIR: Prefix where ParMETIS is installed.
+# PARMETIS_DIR: Prefix where ParMETIS is installed.
 # METIS_LIB_NAME: Name of the METIS library (default: metis).
 # PARMETIS_LIB_NAME: Name of the ParMETIS library (default: parmetis).
 # METIS_LIBRARY: Full path of the METIS library.
-# ParMETIS_LIBRARY: Full path of the ParMETIS library
+# PARMETIS_LIBRARY: Full path of the ParMETIS library
 
 # Sets the following variables:
 #
 # METIS_LIBRARY: Full path of the METIS library.
-# ParMETIS_LIBRARY: Full path of the ParMETIS library.
-# ParMETIS_FOUND: True if ParMETIS was found.
-# ParMETIS_LIBRARIES: List of all libraries needed for linking with ParMETIS,
+# PARMETIS_LIBRARY: Full path of the ParMETIS library.
+# PARMETIS_FOUND: True if ParMETIS was found.
+# PARMETIS_LIBRARIES: List of all libraries needed for linking with ParMETIS,
 #
 # Provides the following macros:
 #
@@ -26,89 +26,100 @@
 #
 # Adds the necessary flags to comile and link TARGETS with ParMETIS support.
 #
-include(DuneMPI)
-
-# search for file parmetis.h
-find_path(ParMETIS_INCLUDE_DIRS parmetis.h
-          PATHS ${PARMETIS_DIR}
-          PATH_SUFFIXES include parmetis
-          DOC "path for file parmetis.h"
-          NO_DEFAULT_PATH)
 
-# Search in default paths (omitted because of precedence above.
-find_path(ParMETIS_INCLUDE_DIRS parmetis.h
-          PATH_SUFFIXES include parmetis
-          DOC "path for file parmetis.h")
+# adds ParMETIS flags to the targets
+function(add_dune_parmetis_flags _targets)
+  if(PARMETIS_FOUND)
+    foreach(_target ${_targets})
+      target_link_libraries(${_target} ${PARMETIS_LIBRARY} ${METIS_LIBRARY})
+      GET_TARGET_PROPERTY(_props ${_target} COMPILE_FLAGS)
+      string(REPLACE "_props-NOTFOUND" "" _props "${_props}")
+      SET_TARGET_PROPERTIES(${_target} PROPERTIES COMPILE_FLAGS
+        "${_props} ${PARMETIS_COMPILE_FLAGS} -DENABLE_PARMETS=1")
+    endforeach(_target ${_targets})
+    add_dune_mpi_flags(${_targets})
+  endif(PARMETIS_FOUND)
+endfunction(add_dune_parmetis_flags)
 
-set(METIS_LIB_NAME metis CACHE STRING "Name of the METIS library (default: metis).")
-set(PARMETIS_LIB_NAME parmetis CACHE STRING "Name of the ParMETIS library (default: parmetis).")
-set(METIS_LIBRARY METIS_LIBRARY-NOTFOUND CACHE FILEPATH "Full path of the METIS library")
-set(ParMETIS_LIBRARY ParMETIS_LIBRARY-NOTFOUND CACHE FILEPATH "Full path of the ParMETIS library")
 
-# save old variables
-set(CMAKE_REQUIRED_INCLUDES_SAVE ${CMAKE_REQUIRED_INCLUDES})
-set(CMAKE_REQUIRED_FLAGS_SAVE    ${CMAKE_REQUIRED_FLAGS})
-set(CMAKE_REQUIRED_LIBRARIES_SAVE ${CMAKE_REQUIRED_LIBRARIES})
+include(DuneMPI)
 
-set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${MPI_DUNE_INCLUDE_PATH} ${ParMETIS_INCLUDE_DIRS})
+# search for header parmetis.h
+find_path(PARMETIS_INCLUDE_DIR parmetis.h
+          PATHS ${PARMETIS_DIR}
+          PATH_SUFFIXES include parmetis
+          NO_DEFAULT_PATH
+          DOC "Include directory of ParMETIS")
+find_path(PARMETIS_INCLUDE_DIR parmetis.h
+          PATH_SUFFIXES include parmetis)
+
+set(METIS_LIB_NAME metis
+    CACHE STRING "Name of the METIS library (default: metis).")
+set(PARMETIS_LIB_NAME parmetis
+    CACHE STRING "Name of the ParMETIS library (default: parmetis).")
+set(METIS_LIBRARY METIS_LIBRARY-NOTFOUND
+    CACHE FILEPATH "Full path of the METIS library")
+set(PARMETIS_LIBRARY ParMETIS_LIBRARY-NOTFOUND
+    CACHE FILEPATH "Full path of the ParMETIS library")
+
+# check METIS and ParMETIS headers
+include(CMakePushCheckState)
+cmake_push_check_state() # Save variables
+set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${MPI_DUNE_INCLUDE_PATH} ${PARMETIS_INCLUDE_DIR})
 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${MPI_DUNE_COMPILE_FLAGS}")
+check_include_file(metis.h METIS_FOUND)
+check_include_file(parmetis.h PARMETIS_FOUND)
 
-if(ParMETIS_INCLUDE_DIRS)
-  check_include_file(parmetis.h ParMETIS_FOUND)
-endif(ParMETIS_INCLUDE_DIRS)
-
-if(ParMETIS_FOUND)
+if(PARMETIS_FOUND)
   set(ParMETIS_INCLUDE_PATH ${CMAKE_REQUIRED_INCLUDES})
   set(ParMETIS_COMPILE_FLAGS "${CMAKE_REQUIRED_FLAGS} -DENABLE_PARMETIS=1")
 
-  find_library(METIS_LIBRARY metis PATHS ${ParMETIS_DIR} PATH_SUFFIXES lib NO_DEFAULT_PATH)
+  # search METIS library
+  find_library(METIS_LIBRARY metis
+               PATHS ${PARMETIS_DIR}
+               PATH_SUFFIXES lib
+               NO_DEFAULT_PATH)
   find_library(METIS_LIBRARY metis)
 
-  find_library(ParMETIS_LIBRARY parmetis PATHS ${ParMETIS_DIR} PATH_SUFFIXES lib NO_DEFAULT_PATH)
-  find_library(ParMETIS_LIBRARY parmetis)
+  # search ParMETIS library
+  find_library(PARMETIS_LIBRARY parmetis
+               PATHS ${PARMETIS_DIR}
+               PATH_SUFFIXES lib
+               NO_DEFAULT_PATH)
+  find_library(PARMETIS_LIBRARY parmetis)
 
-  if(ParMETIS_LIBRARY)
-    list(APPEND CMAKE_REQUIRED_LIBRARIES ${ParMETIS_LIBRARY} ${METIS_LIBRARY} ${MPI_DUNE_LIBRARIES})
+  # check ParMETIS library
+  if(PARMETIS_LIBRARY)
+    list(APPEND CMAKE_REQUIRED_LIBRARIES ${PARMETIS_LIBRARY} ${METIS_LIBRARY} ${MPI_DUNE_LIBRARIES})
     include(CheckSymbolExists)
-    check_symbol_exists(parmetis_v3_partkway parmetis.h ParMETIS_FOUND)
-  endif(ParMETIS_LIBRARY)
-
-  if(ParMETIS_FOUND)
-    set(ParMETIS_LIBRARIES "${ParMETIS_LIBRARY};${METIS_LIBRARY};${MPI_DUNE_LIBRARIES}"
-      CACHE FILEPATH "ParMETIS libraries needed for linking")
-    set(ParMETIS_LINK_FLAGS "${DUNE_MPI_LINK_FLAGS}" CACHE STRING "ParMETIS link flags")
-  else(ParMETIS_FOUND)
-    set(ParMETIS_LIBRARIES "" CACHE FILEPATH "ParMETIS libraries needed for linking")
-    set(ParMETIS_LINK_FLAGS "" CACHE STRING "ParMETIS link flags")
-  endif(ParMETIS_FOUND)
-endif(ParMETIS_FOUND)
+    check_symbol_exists(parmetis_v3_partkway parmetis.h PARMETIS_FOUND)
+  endif(PARMETIS_LIBRARY)
+endif(PARMETIS_FOUND)
 
 # behave like a CMake module is supposed to behave
 include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args(
-  "ParMetis"
+  "ParMETIS"
   DEFAULT_MSG
-  ParMETIS_INCLUDE_DIRS
-  ParMETIS_LIBRARY
+  PARMETIS_INCLUDE_DIR
+  PARMETIS_LIBRARY
+  PARMETIS_FOUND
 )
 
-mark_as_advanced(ParMETIS_INCLUDE_DIRS ParMETIS_LIBRARIES ParMETIS_LINK_FLAGS)
+mark_as_advanced(PARMETIS_INCLUDE_DIR METIS_LIBRARY PARMETIS_LIBRARY METIS_LIB_NAME PARMETIS_LIB_NAME)
 
 #restore old values
-set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_SAVE})
-set(CMAKE_REQUIRED_FLAGS    ${CMAKE_REQUIRED_FLAGS_SAVE})
-set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES_SAVE})
+cmake_pop_check_state()
 
-# adds ParMETIS flags to the targets
-function(add_dune_parmetis_flags _targets)
-  if(ParMETIS_FOUND)
-    foreach(_target ${_targets})
-      target_link_libraries(${_target} ${ParMETIS_LIBRARY} ${METIS_LIBRARY})
-      GET_TARGET_PROPERTY(_props ${_target} COMPILE_FLAGS)
-      string(REPLACE "_props-NOTFOUND" "" _props "${_props}")
-      SET_TARGET_PROPERTIES(${_target} PROPERTIES COMPILE_FLAGS
-        "${_props} ${PARMETIS_COMPILE_FLAGS} -DENABLE_PARMETS=1")
-    endforeach(_target ${_targets})
-    add_dune_mpi_flags(${_targets})
-  endif(ParMETIS_FOUND)
-endfunction(add_dune_parmetis_flags)
+if(PARMETIS_FOUND)
+  set(PARMETIS_INCLUDE_DIRS ${PARMETIS_INCLUDE_DIR})
+  set(PARMETIS_LIBRARIES "${PARMETIS_LIBRARY};${METIS_LIBRARY};${MPI_DUNE_LIBRARIES}"
+      CACHE FILEPATH "ParMETIS libraries needed for linking")
+  set(PARMETIS_LINK_FLAGS "${DUNE_MPI_LINK_FLAGS}"
+      CACHE STRING "ParMETIS link flags")
+  # log result
+  file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
+    "Determing location of ParMETIS succeded:\n"
+    "Include directory: ${PARMETIS_INCLUDE_DIRS}\n"
+    "Library directory: ${PARMETIS_LIBRARIES}\n\n")
+endif(PARMETIS_FOUND)
-- 
GitLab