From 5b62fa944d4710f0e2729fdca9d5612c27a76fea Mon Sep 17 00:00:00 2001
From: Florent Pruvost <florent.pruvost@inria.fr>
Date: Tue, 12 May 2015 10:41:20 +0000
Subject: [PATCH] if hints are given by user to find libs (CMake option or env.
 var) --> do not use pkg-config

---
 cmake_modules/morse/find/FindCHAMELEON.cmake | 16 ++++++++---
 cmake_modules/morse/find/FindFXT.cmake       | 16 ++++++++---
 cmake_modules/morse/find/FindHWLOC.cmake     | 28 +++++++++++++++-----
 cmake_modules/morse/find/FindMAGMA.cmake     | 16 ++++++++---
 cmake_modules/morse/find/FindSTARPU.cmake    | 16 ++++++++---
 5 files changed, 69 insertions(+), 23 deletions(-)

diff --git a/cmake_modules/morse/find/FindCHAMELEON.cmake b/cmake_modules/morse/find/FindCHAMELEON.cmake
index e627f8f25..86f11b572 100644
--- a/cmake_modules/morse/find/FindCHAMELEON.cmake
+++ b/cmake_modules/morse/find/FindCHAMELEON.cmake
@@ -115,11 +115,19 @@ if( CHAMELEON_FIND_COMPONENTS )
     endforeach()
 endif()
 
+set(ENV_CHAMELEON_DIR "$ENV{CHAMELEON_DIR}")
+set(ENV_CHAMELEON_INCDIR "$ENV{CHAMELEON_INCDIR}")
+set(ENV_CHAMELEON_LIBDIR "$ENV{CHAMELEON_LIBDIR}")
+set(CHAMELEON_GIVEN_BY_USER "FALSE")
+if ( CHAMELEON_DIR OR ( CHAMELEON_INCDIR AND CHAMELEON_LIBDIR) OR ENV_CHAMELEON_DIR OR (ENV_CHAMELEON_INCDIR AND ENV_CHAMELEON_LIBDIR) )
+    set(CHAMELEON_GIVEN_BY_USER "TRUE")
+endif()
+
 # Optionally use pkg-config to detect include/library dirs (if pkg-config is available)
 # -------------------------------------------------------------------------------------
 include(FindPkgConfig)
 find_package(PkgConfig QUIET)
-if(PKG_CONFIG_EXECUTABLE)
+if(PKG_CONFIG_EXECUTABLE AND NOT CHAMELEON_GIVEN_BY_USER)
 
     pkg_search_module(CHAMELEON chameleon)
     if (NOT CHAMELEON_FIND_QUIETLY)
@@ -162,9 +170,9 @@ if(PKG_CONFIG_EXECUTABLE)
     set(CHAMELEON_LIBRARY_DIRS_DEP "${CHAMELEON_LIBRARY_DIRS}")
     set(CHAMELEON_LIBRARIES_DEP "${CHAMELEON_LIBRARIES}")
 
-endif()
+endif(PKG_CONFIG_EXECUTABLE AND NOT CHAMELEON_GIVEN_BY_USER)
 
-if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT CHAMELEON_FOUND) OR (CHAMELEON_DIR) )
+if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT CHAMELEON_FOUND) OR (CHAMELEON_GIVEN_BY_USER) )
 
     if (NOT CHAMELEON_FIND_QUIETLY)
         message(STATUS "Looking for CHAMELEON - PkgConfig not used")
@@ -755,7 +763,7 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT CHAMELEON_FOUN
         set(CMAKE_REQUIRED_LIBRARIES)
     endif(CHAMELEON_LIBRARIES)
 
-endif( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT CHAMELEON_FOUND) OR (CHAMELEON_DIR) )
+endif( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT CHAMELEON_FOUND) OR (CHAMELEON_GIVEN_BY_USER) )
 
 if (CHAMELEON_LIBRARIES)
     if (CHAMELEON_LIBRARY_DIRS)
diff --git a/cmake_modules/morse/find/FindFXT.cmake b/cmake_modules/morse/find/FindFXT.cmake
index 7aa0ef4e9..bfb4c8f79 100644
--- a/cmake_modules/morse/find/FindFXT.cmake
+++ b/cmake_modules/morse/find/FindFXT.cmake
@@ -52,11 +52,19 @@ if (NOT FXT_FOUND)
     endif()
 endif()
 
+set(ENV_FXT_DIR "$ENV{FXT_DIR}")
+set(ENV_FXT_INCDIR "$ENV{FXT_INCDIR}")
+set(ENV_FXT_LIBDIR "$ENV{FXT_LIBDIR}")
+set(FXT_GIVEN_BY_USER "FALSE")
+if ( FXT_DIR OR ( FXT_INCDIR AND FXT_LIBDIR) OR ENV_FXT_DIR OR (ENV_FXT_INCDIR AND ENV_FXT_LIBDIR) )
+    set(FXT_GIVEN_BY_USER "TRUE")
+endif()
+
 # Optionally use pkg-config to detect include/library dirs (if pkg-config is available)
 # -------------------------------------------------------------------------------------
 include(FindPkgConfig)
 find_package(PkgConfig QUIET)
-if(PKG_CONFIG_EXECUTABLE)
+if(PKG_CONFIG_EXECUTABLE AND NOT FXT_GIVEN_BY_USER)
 
     pkg_search_module(FXT fxt)
     if (NOT FXT_FIND_QUIETLY)
@@ -74,9 +82,9 @@ if(PKG_CONFIG_EXECUTABLE)
         endif()
     endif()
 
-endif()
+endif(PKG_CONFIG_EXECUTABLE AND NOT FXT_GIVEN_BY_USER)
 
-if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT FXT_FOUND) OR (FXT_DIR) )
+if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT FXT_FOUND) OR (FXT_GIVEN_BY_USER) )
 
     if (NOT FXT_FIND_QUIETLY)
         message(STATUS "Looking for FXT - PkgConfig not used")
@@ -269,7 +277,7 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT FXT_FOUND) OR
         set(CMAKE_REQUIRED_LIBRARIES)
     endif(FXT_LIBRARIES)
 
-endif( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT FXT_FOUND) OR (FXT_DIR) )
+endif( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT FXT_FOUND) OR (FXT_GIVEN_BY_USER) )
 
 if (FXT_LIBRARIES)
     if (FXT_LIBRARY_DIRS)
diff --git a/cmake_modules/morse/find/FindHWLOC.cmake b/cmake_modules/morse/find/FindHWLOC.cmake
index fd69aa4c9..213be5cb1 100644
--- a/cmake_modules/morse/find/FindHWLOC.cmake
+++ b/cmake_modules/morse/find/FindHWLOC.cmake
@@ -45,6 +45,8 @@
 # (To distribute this file outside of Morse, substitute the full
 #  License text for the above reference.)
 
+include(CheckStructHasMember)
+include(CheckCSourceCompiles)
 
 if (NOT HWLOC_FOUND)
     set(HWLOC_DIR "" CACHE PATH "Installation directory of HWLOC library")
@@ -53,11 +55,19 @@ if (NOT HWLOC_FOUND)
     endif()
 endif()
 
+set(ENV_HWLOC_DIR "$ENV{HWLOC_DIR}")
+set(ENV_HWLOC_INCDIR "$ENV{HWLOC_INCDIR}")
+set(ENV_HWLOC_LIBDIR "$ENV{HWLOC_LIBDIR}")
+set(HWLOC_GIVEN_BY_USER "FALSE")
+if ( HWLOC_DIR OR ( HWLOC_INCDIR AND HWLOC_LIBDIR) OR ENV_HWLOC_DIR OR (ENV_HWLOC_INCDIR AND ENV_HWLOC_LIBDIR) )
+    set(HWLOC_GIVEN_BY_USER "TRUE")
+endif()
+
 # Optionally use pkg-config to detect include/library dirs (if pkg-config is available)
 # -------------------------------------------------------------------------------------
 include(FindPkgConfig)
 find_package(PkgConfig QUIET)
-if(PKG_CONFIG_EXECUTABLE)
+if( PKG_CONFIG_EXECUTABLE AND NOT HWLOC_GIVEN_BY_USER )
 
     pkg_search_module(HWLOC hwloc)
     if (NOT HWLOC_FIND_QUIETLY)
@@ -75,9 +85,9 @@ if(PKG_CONFIG_EXECUTABLE)
         endif()
     endif()
 
-endif()
+endif( PKG_CONFIG_EXECUTABLE AND NOT HWLOC_GIVEN_BY_USER )
 
-if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT HWLOC_FOUND) OR (HWLOC_DIR) )
+if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT HWLOC_FOUND) OR (HWLOC_GIVEN_BY_USER) )
 
     if (NOT HWLOC_FIND_QUIETLY)
         message(STATUS "Looking for HWLOC - PkgConfig not used")
@@ -89,8 +99,6 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT HWLOC_FOUND) O
     # Add system include paths to search include
     # ------------------------------------------
     unset(_inc_env)
-    set(ENV_HWLOC_DIR "$ENV{HWLOC_DIR}")
-    set(ENV_HWLOC_INCDIR "$ENV{HWLOC_INCDIR}")
     if(ENV_HWLOC_INCDIR)
         list(APPEND _inc_env "${ENV_HWLOC_INCDIR}")
     elseif(ENV_HWLOC_DIR)
@@ -164,7 +172,6 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT HWLOC_FOUND) O
     # Add system library paths to search lib
     # --------------------------------------
     unset(_lib_env)
-    set(ENV_HWLOC_LIBDIR "$ENV{HWLOC_LIBDIR}")
     if(ENV_HWLOC_LIBDIR)
         list(APPEND _lib_env "${ENV_HWLOC_LIBDIR}")
     elseif(ENV_HWLOC_DIR)
@@ -263,6 +270,13 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT HWLOC_FOUND) O
         check_function_exists(hwloc_topology_init HWLOC_WORKS)
         mark_as_advanced(HWLOC_WORKS)
 
+        # test headers to guess the version
+        check_struct_has_member( "struct hwloc_obj" parent hwloc.h HAVE_HWLOC_PARENT_MEMBER )
+        check_struct_has_member( "struct hwloc_cache_attr_s" size hwloc.h HAVE_HWLOC_CACHE_ATTR )
+        check_c_source_compiles( "#include <hwloc.h>
+            int main(void) { hwloc_obj_t o; o->type = HWLOC_OBJ_PU; return 0;}" HAVE_HWLOC_OBJ_PU)
+        check_library_exists(${HWLOC_LIBRARIES} hwloc_bitmap_free "" HAVE_HWLOC_BITMAP)
+
         if(NOT HWLOC_WORKS)
             if(NOT HWLOC_FIND_QUIETLY)
                 message(STATUS "Looking for hwloc : test of hwloc_topology_init with hwloc library fails")
@@ -276,7 +290,7 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT HWLOC_FOUND) O
         set(CMAKE_REQUIRED_LIBRARIES)
     endif(HWLOC_LIBRARIES)
 
-endif( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT HWLOC_FOUND) OR (HWLOC_DIR) )
+endif( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT HWLOC_FOUND) OR (HWLOC_GIVEN_BY_USER) )
 
 if (HWLOC_LIBRARIES)
     if (HWLOC_LIBRARY_DIRS)
diff --git a/cmake_modules/morse/find/FindMAGMA.cmake b/cmake_modules/morse/find/FindMAGMA.cmake
index 0302ce5c0..e8bdd072d 100644
--- a/cmake_modules/morse/find/FindMAGMA.cmake
+++ b/cmake_modules/morse/find/FindMAGMA.cmake
@@ -100,11 +100,19 @@ if (NOT CBLAS_FOUND)
     endif()
 endif()
 
+set(ENV_MAGMA_DIR "$ENV{MAGMA_DIR}")
+set(ENV_MAGMA_INCDIR "$ENV{MAGMA_INCDIR}")
+set(ENV_MAGMA_LIBDIR "$ENV{MAGMA_LIBDIR}")
+set(MAGMA_GIVEN_BY_USER "FALSE")
+if ( MAGMA_DIR OR ( MAGMA_INCDIR AND MAGMA_LIBDIR) OR ENV_MAGMA_DIR OR (ENV_MAGMA_INCDIR AND ENV_MAGMA_LIBDIR) )
+    set(MAGMA_GIVEN_BY_USER "TRUE")
+endif()
+
 # Optionally use pkg-config to detect include/library dirs (if pkg-config is available)
 # -------------------------------------------------------------------------------------
 include(FindPkgConfig)
 find_package(PkgConfig QUIET)
-if(PKG_CONFIG_EXECUTABLE)
+if(PKG_CONFIG_EXECUTABLE AND NOT MAGMA_GIVEN_BY_USER)
 
     pkg_search_module(MAGMA magma)
     if (NOT MAGMA_FIND_QUIETLY)
@@ -155,10 +163,10 @@ if(PKG_CONFIG_EXECUTABLE)
     set(MAGMA_LIBRARY_DIRS_DEP "${MAGMA_LIBRARY_DIRS}")
     set(MAGMA_LIBRARIES_DEP "${MAGMA_LIBRARIES}")
 
-endif()
+endif(PKG_CONFIG_EXECUTABLE AND NOT MAGMA_GIVEN_BY_USER)
 
 # if MAGMA is not found using pkg-config
-if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT MAGMA_FOUND) OR (MAGMA_DIR) )
+if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT MAGMA_FOUND) OR (MAGMA_GIVEN_BY_USER) )
 
     if (NOT MAGMA_FIND_QUIETLY)
         message(STATUS "Looking for MAGMA - PkgConfig not used")
@@ -394,7 +402,7 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT MAGMA_FOUND) O
         set(CMAKE_REQUIRED_LIBRARIES)
     endif(MAGMA_LIBRARIES)
 
-endif( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT MAGMA_FOUND) OR (MAGMA_DIR) )
+endif( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT MAGMA_FOUND) OR (MAGMA_GIVEN_BY_USER) )
 
 if (MAGMA_LIBRARIES)
     if (MAGMA_LIBRARY_DIRS)
diff --git a/cmake_modules/morse/find/FindSTARPU.cmake b/cmake_modules/morse/find/FindSTARPU.cmake
index 11f39abc0..170fbf4fb 100644
--- a/cmake_modules/morse/find/FindSTARPU.cmake
+++ b/cmake_modules/morse/find/FindSTARPU.cmake
@@ -165,12 +165,20 @@ if (NOT FXT_FOUND AND STARPU_LOOK_FOR_FXT)
     endif()
 endif()
 
+set(ENV_STARPU_DIR "$ENV{STARPU_DIR}")
+set(ENV_STARPU_INCDIR "$ENV{STARPU_INCDIR}")
+set(ENV_STARPU_LIBDIR "$ENV{STARPU_LIBDIR}")
+set(STARPU_GIVEN_BY_USER "FALSE")
+if ( STARPU_DIR OR ( STARPU_INCDIR AND STARPU_LIBDIR) OR ENV_STARPU_DIR OR (ENV_STARPU_INCDIR AND ENV_STARPU_LIBDIR) )
+    set(STARPU_GIVEN_BY_USER "TRUE")
+endif()
+
 # Optionally use pkg-config to detect include/library dirs (if pkg-config is available)
 # -------------------------------------------------------------------------------------
 include(FindPkgConfig)
 find_package(PkgConfig QUIET)
 
-if(PKG_CONFIG_EXECUTABLE)
+if(PKG_CONFIG_EXECUTABLE AND NOT STARPU_GIVEN_BY_USER)
 
     pkg_search_module(STARPU_SHM libstarpu)
     set(STARPU_INCLUDE_DIRS "${STARPU_SHM_INCLUDE_DIRS}")
@@ -241,10 +249,10 @@ if(PKG_CONFIG_EXECUTABLE)
     if (STARPU_LOOK_FOR_MPI AND NOT STARPU_MPI_FOUND)
         set(STARPU_FOUND "FALSE")
     endif()
-endif()
+endif(PKG_CONFIG_EXECUTABLE AND NOT STARPU_GIVEN_BY_USER)
 
 
-if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT STARPU_FOUND) OR (STARPU_DIR) )
+if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT STARPU_FOUND) OR (STARPU_GIVEN_BY_USER) )
 
     # Looking for include
     # -------------------
@@ -793,7 +801,7 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT STARPU_FOUND)
         set(CMAKE_REQUIRED_LIBRARIES)
     endif(STARPU_LIBRARIES)
 
-endif( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT STARPU_FOUND) OR (STARPU_DIR) )
+endif( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT STARPU_FOUND) OR (STARPU_GIVEN_BY_USER) )
 
 if (STARPU_LIBRARIES)
     if (STARPU_LIBRARY_DIRS)
-- 
GitLab