From 6ebe62228eccc8935e3147e08c85852cc35ec49a Mon Sep 17 00:00:00 2001
From: Jonathan Lambrechts <jonathan.lambrechts@uclouvain.be>
Date: Mon, 26 Sep 2011 10:17:20 +0000
Subject: [PATCH] CMakeList : find petsc (and slepc) without
 PETSC_ARCH/PETS_DIR (SLEPC_ARCH SLEPC_DIR) when symlinks exist in standard
 path (e.g /usr/lib/libpetsc.so /usr/include/petsc/petsc.h). This is the case
 for debian/ubuntu pacakages.

---
 CMakeLists.txt | 52 ++++++++++++++++++++++++++++++--------------------
 1 file changed, 31 insertions(+), 21 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2d3b4b8351..57224a081d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -621,12 +621,6 @@ endif(ENABLE_TAUCS)
 if(ENABLE_PETSC)
   set(ENV_PETSC_DIR $ENV{PETSC_DIR})
   set(ENV_PETSC_ARCH $ENV{PETSC_ARCH})
-  if(NOT ENV_PETSC_DIR)
-     message("WARNING: Export PETSC_DIR before calling cmake")
-  endif(NOT ENV_PETSC_DIR)
-  if(NOT ENV_PETSC_ARCH)
-     message("WARNING: Export PETSC_ARCH before calling cmake")
-  endif(NOT ENV_PETSC_ARCH)
   if(EXISTS ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/conf/petscvariables)
     set_config_option(HAVE_PETSC "PETSc")
     file(STRINGS ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/conf/petscvariables 
@@ -653,22 +647,8 @@ if(ENABLE_PETSC)
                        ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib "")
     # petsc 3.1 creates only one library (libpetsc)
     if(NOT PETSC_LIBS)
-      find_library(PETSC_LIBS petsc PATHS ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib)
+      find_library(PETSC_LIBS petsc PATHS ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib PATH_SUFFIXES)
     endif(NOT PETSC_LIBS)
-    # find slepc
-    if(ENABLE_SLEPC)
-      set(ENV_SLEPC_DIR $ENV{SLEPC_DIR})
-      if(NOT ENV_SLEPC_DIR)
-         message("WARNING: Export SLEPC_DIR before calling cmake")
-      endif(NOT ENV_SLEPC_DIR)
-      find_library(SLEPC_LIB slepc PATHS ${ENV_SLEPC_DIR}/${ENV_PETSC_ARCH}/lib)
-      if(SLEPC_LIB)
-        set_config_option(HAVE_SLEPC "SLEPc")
-        list(APPEND EXTERNAL_LIBRARIES ${SLEPC_LIB})
-        list(APPEND EXTERNAL_INCLUDES ${ENV_SLEPC_DIR}/include 
-             ${ENV_SLEPC_DIR}/${ENV_PETSC_ARCH}/include)
-      endif(SLEPC_LIB)
-    endif(ENABLE_SLEPC)
     list(APPEND EXTERNAL_LIBRARIES ${PETSC_LIBS})
     # find additional libraries to link with
     string(REGEX MATCH "PACKAGES_LIBS = [^\n\r]*" PLIBS ${PETSC_VARIABLES})
@@ -683,8 +663,38 @@ if(ENABLE_PETSC)
       string(STRIP ${LLIBS} LLIBS)
       list(APPEND EXTERNAL_LIBRARIES "${LLIBS}")
     endif(LLIBS)
+  else(EXISTS ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/conf/petscvariables)
+    find_library(PETSC_LIBS petsc)
+    find_path(PETSC_INC "petsc.h" PATH_SUFFIXES include/petsc)
+    if(PETSC_LIBS AND PETSC_INC)
+      set_config_option(HAVE_PETSC "PETSc")
+      list(APPEND EXTERNAL_LIBRARIES ${PETSC_LIBS})
+      list(APPEND EXTERNAL_INCLUDES ${PETSC_INC}) 
+    endif(PETSC_LIBS AND PETSC_INC)
   endif(EXISTS ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/conf/petscvariables)
+  if(NOT HAVE_PETSC AND NOT ENV_PETSC_DIR)
+     message("WARNING: Export PETSC_DIR before calling cmake")
+  endif(NOT HAVE_PETSC AND NOT ENV_PETSC_DIR)
+  if(NOT HAVE_PETSC AND NOT ENV_PETSC_ARCH)
+     message("WARNING: Export PETSC_ARCH before calling cmake")
+  endif(NOT HAVE_PETSC AND NOT ENV_PETSC_ARCH)
 endif(ENABLE_PETSC)
+# find slepc
+if(ENABLE_SLEPC AND HAVE_PETSC)
+  set(ENV_SLEPC_DIR $ENV{SLEPC_DIR})
+  find_library(SLEPC_LIB slepc PATHS ${ENV_SLEPC_DIR}/${ENV_PETSC_ARCH}/lib)
+  if(SLEPC_LIB)
+    find_path(SLPEC_INC "slepc.h" PATHS ${ENV_SLEPC_DIR}/${ENV_SLEPC_ARCH} PATH_SUFFIXES include include/slepc)
+    if(SLEPC_INC)
+      set_config_option(HAVE_SLEPC "SLEPc")
+      list(APPEND EXTERNAL_LIBRARIES ${SLEPC_LIB})
+      list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC}) 
+    endif(SLEPC_INC)
+  endif(SLEPC_LIB)
+  if(NOT HAVE_SLEPC AND NOT ENV_SLEPC_DIR)
+     message("WARNING: Export SLEPC_DIR before calling cmake")
+  endif(NOT HAVE_SLEPC AND NOT ENV_SLEPC_DIR)
+endif(ENABLE_SLEPC AND HAVE_PETSC)
 
 if(ENABLE_OCC)
   if(WIN32)
-- 
GitLab