From e08337bfd521f65185dccd8010459b681d6ba5f4 Mon Sep 17 00:00:00 2001 From: Florent Pruvost Date: Mon, 23 Apr 2018 17:45:34 +0200 Subject: [PATCH] use FindPTSCOTCH from morse cmake (more complete) --- CMakeLists.txt | 21 +- CMakeScripts/FindPTSCOTCH.cmake | 507 ++++++++++++++++++++--- CMakeScripts/FindSCOTCH.cmake | 413 +++++++++++++++--- CMakeScripts/LibrariesAbsolutePath.cmake | 68 +++ doc/user_pages/doc_02_compil.txt | 4 +- ext/CMakeLists.txt | 5 - src/pampa-remesh/CMakeLists.txt | 10 +- 7 files changed, 888 insertions(+), 140 deletions(-) create mode 100644 CMakeScripts/LibrariesAbsolutePath.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 0fc98c6..8c598c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,12 +7,12 @@ ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 3 of the License, or ## any later version. -## +## ## PaMPA is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. -## +## ## In this respect, the user's attention is drawn to the risks associated ## with loading, using, modifying and/or developing or reproducing the ## software by the user in light of its specific status of free software, @@ -23,7 +23,7 @@ ## their requirements in conditions enabling the security of their ## systems and/or data to be ensured and, more generally, to use and ## operate it in the same conditions as regards security. -## +## ## The fact that you are presently reading this means that you have had ## knowledge of the GPLv3 license and that you accept its terms. ## @@ -75,6 +75,8 @@ include(CheckSymbolExists) set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMakeScripts) +# To transform relative path into absolute for a list of libraries +include(LibrariesAbsolutePath) set(CMAKE_Fortran_MODULE_DIRECTORY ${PROJECT_BINARY_DIR}/MOD) # Define some variables which will be fill in with ccmake or cmake-gui @@ -205,11 +207,8 @@ endif (COMMON_COMPRESSION) option (PTSCOTCH "Build PaMPA with PT-Scotch dependencies" ON) if (PTSCOTCH) add_definitions (-DPTSCOTCH) - set(PTSCOTCH_HOME "" CACHE PATH "PT-Scotch home directory") find_package(PTSCOTCH REQUIRED) - - file(STRINGS "${PTSCOTCH_INCLUDE_DIR}/scotch.h" CHECK_SCOTCH_VERSION REGEX "^[ \t]*#define[ \t]+SCOTCH_[A-Z]+[ \t]+[0-9]+.*$") - + file(STRINGS "${PTSCOTCH_INCLUDE_DIRS}/scotch.h" CHECK_SCOTCH_VERSION REGEX "^[ \t]*#define[ \t]+SCOTCH_[A-Z]+[ \t]+[0-9]+.*$") foreach(item IN ITEMS VERSION RELEASE PATCHLEVEL) string(REGEX REPLACE ".*#define[ \t]+SCOTCH_${item}[ \t]+([0-9]+).*" "\\1" XYZ ${CHECK_SCOTCH_VERSION}) set (SCOTCH_${item} ${XYZ}) @@ -218,9 +217,7 @@ if (PTSCOTCH) #if (${SCOTCH_VERSION}.${SCOTCH_RELEASE}.${SCOTCH_PATCHLEVEL} VERSION_LESS 6.0.4) # message (FATAL_ERROR "PT-Scotch version must be greater than or equal to 6.0.4") #endif () - include_directories(${PTSCOTCH_INCLUDE_DIR}) -else () - unset (PTSCOTCH_HOME CACHE) + include_directories(${PTSCOTCH_INCLUDE_DIRS}) endif () @@ -362,9 +359,7 @@ add_subdirectory(${PAMPA_SOURCE_DIR}/src/libpampa) # Add dependency on PT-Scotch if (PTSCOTCH) - list (APPEND PAMPA_DEPENDENCIES ${PTSCOTCH_LIBRARY}) - list (APPEND PAMPA_DEPENDENCIES ${SCOTCH_LIBRARY}) - list (APPEND PAMPA_DEPENDENCIES ${PTSCOTCH_EXTRA_LIBRARY}) + list (APPEND PAMPA_DEPENDENCIES ${PTSCOTCH_LIBRARIES_DEP}) endif () diff --git a/CMakeScripts/FindPTSCOTCH.cmake b/CMakeScripts/FindPTSCOTCH.cmake index 30da0a4..bc10873 100755 --- a/CMakeScripts/FindPTSCOTCH.cmake +++ b/CMakeScripts/FindPTSCOTCH.cmake @@ -1,73 +1,444 @@ -## Copyright 2009-2016 Inria -## -## This file is part of the PaMPA software package for parallel -## mesh partitioning and adaptation. -## -## PaMPA is free software: you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation, either version 3 of the License, or -## any later version. -## -## PaMPA is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## In this respect, the user's attention is drawn to the risks associated -## with loading, using, modifying and/or developing or reproducing the -## software by the user in light of its specific status of free software, -## that may mean that it is complicated to manipulate, and that also -## therefore means that it is reserved for developers and experienced -## professionals having in-depth computer knowledge. Users are therefore -## encouraged to load and test the software's suitability as regards -## their requirements in conditions enabling the security of their -## systems and/or data to be ensured and, more generally, to use and -## operate it in the same conditions as regards security. -## -## The fact that you are presently reading this means that you have had -## knowledge of the GPLv3 license and that you accept its terms. -## -############################################################# -## -## \file FindPTSCOTCH.cmake -## -## \authors Cedric Lachat -## -## \brief This file is a part of the configuration -## to build PaMPA with CMake -## -## \date Version 1.0: from: 6 Jun 2011 -## to: 30 Jun 2014 -## -############################################################# -if (NOT ${PTSCOTCH_PATH} STREQUAL ${PTSCOTCH_HOME}) - set (PTSCOTCH_LIBRARY "NOTFOUND") - set (SCOTCH_LIBRARY "NOTFOUND") - set (PTSCOTCH_EXTRA_LIBRARY "NOTFOUND") - set (PTSCOTCH_INCLUDE_DIR "NOTFOUND") +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2016 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find PTSCOTCH include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(PTSCOTCH +# [REQUIRED] # Fail with error if ptscotch is not found +# [COMPONENTS ...] # dependencies +# ) +# +# PTSCOTCH depends on the following libraries: +# - Threads +# - MPI +# +# COMPONENTS can be some of the following: +# - ESMUMPS: to activate detection of PT-Scotch with the esmumps interface +# +# This module finds headers and ptscotch library. +# Results are reported in variables: +# PTSCOTCH_FOUND - True if headers and requested libraries were found +# PTSCOTCH_CFLAGS_OTHER - ptscotch compiler flags without headers paths +# PTSCOTCH_LDFLAGS_OTHER - ptscotch linker flags without libraries +# PTSCOTCH_INCLUDE_DIRS - ptscotch include directories +# PTSCOTCH_LIBRARY_DIRS - ptscotch link directories +# PTSCOTCH_LIBRARIES - ptscotch libraries to be linked (absolute path) +# PTSCOTCH_CFLAGS_OTHER_DEP - ptscotch + dependencies compiler flags without headers paths +# PTSCOTCH_LDFLAGS_OTHER_DEP - ptscotch + dependencies linker flags without libraries +# PTSCOTCH_INCLUDE_DIRS_DEP - ptscotch + dependencies include directories +# PTSCOTCH_LIBRARY_DIRS_DEP - ptscotch + dependencies link directories +# PTSCOTCH_LIBRARIES_DEP - ptscotch + dependencies libraries +# PTSCOTCH_INTSIZE - Number of octets occupied by a SCOTCH_Num +# +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DPTSCOTCH=path/to/ptscotch): +# PTSCOTCH_DIR - Where to find the base directory of ptscotch +# PTSCOTCH_INCDIR - Where to find the header files +# PTSCOTCH_LIBDIR - Where to find the library files +# The module can also look for the following environment variables if paths +# are not given as cmake variable: PTSCOTCH_DIR, PTSCOTCH_INCDIR, PTSCOTCH_LIBDIR + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013-2016 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + +if (NOT PTSCOTCH_FOUND) + set(PTSCOTCH_DIR "" CACHE PATH "Installation directory of PTSCOTCH library") + if (NOT PTSCOTCH_FIND_QUIETLY) + message(STATUS "A cache variable, namely PTSCOTCH_DIR, has been set to specify the install directory of PTSCOTCH") + endif() +endif() + +# Set the version to find +set(PTSCOTCH_LOOK_FOR_ESMUMPS OFF) + +if( PTSCOTCH_FIND_COMPONENTS ) + foreach( component ${PTSCOTCH_FIND_COMPONENTS} ) + if (${component} STREQUAL "ESMUMPS") + # means we look for esmumps library + set(PTSCOTCH_LOOK_FOR_ESMUMPS ON) + endif() + endforeach() +endif() + +# PTSCOTCH depends on Threads, try to find it +if (PTSCOTCH_FIND_REQUIRED) + find_package(Threads REQUIRED) +else() + find_package(Threads) +endif() +if( THREADS_FOUND ) + libraries_absolute_path(CMAKE_THREAD_LIBS_INIT "") endif () -set (PTSCOTCH_PATH ${PTSCOTCH_HOME} CACHE INTERNAL "") -find_path (PTSCOTCH_INCLUDE_DIR ptscotch${PTSCOTCH_SUFFIX}.h HINTS ${PTSCOTCH_PATH} PATH_SUFFIXES include) +# PTSCOTCH depends on MPI, try to find it +if (PTSCOTCH_FIND_REQUIRED) + find_package(MPI REQUIRED) +else() + find_package(MPI) +endif() -find_library (PTSCOTCH_LIBRARY NAMES ptscotch${PTSCOTCH_SUFFIX} HINTS ${PTSCOTCH_PATH} PATH_SUFFIXES lib) -find_library (SCOTCH_LIBRARY NAMES scotch${PTSCOTCH_SUFFIX} HINTS ${PTSCOTCH_PATH} PATH_SUFFIXES lib) -find_library (PTSCOTCH_EXTRA_LIBRARY NAMES ptscotcherr${PTSCOTCH_SUFFIX} HINTS ${PTSCOTCH_PATH} PATH_SUFFIXES lib) -if (PTSCOTCH_INCLUDE_DIR AND PTSCOTCH_LIBRARY AND SCOTCH_LIBRARY AND PTSCOTCH_EXTRA_LIBRARY) - set (PTSCOTCH_FOUND TRUE) -endif (PTSCOTCH_INCLUDE_DIR AND PTSCOTCH_LIBRARY AND SCOTCH_LIBRARY AND - PTSCOTCH_EXTRA_LIBRARY) +# Looking for include +# ------------------- +# Add system include paths to search include +# ------------------------------------------ +unset(_inc_env) +set(ENV_PTSCOTCH_DIR "$ENV{PTSCOTCH_DIR}") +set(ENV_PTSCOTCH_INCDIR "$ENV{PTSCOTCH_INCDIR}") +if(ENV_PTSCOTCH_INCDIR) + list(APPEND _inc_env "${ENV_PTSCOTCH_INCDIR}") +elseif(ENV_PTSCOTCH_DIR) + list(APPEND _inc_env "${ENV_PTSCOTCH_DIR}") + list(APPEND _inc_env "${ENV_PTSCOTCH_DIR}/include") + list(APPEND _inc_env "${ENV_PTSCOTCH_DIR}/include/ptscotch") +else() + if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") + else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + endif() +endif() +list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") +list(REMOVE_DUPLICATES _inc_env) -if (PTSCOTCH_FOUND) - if (NOT PTSCOTCH_FIND_QUIETLY) - message (STATUS "Found PTSCOTCH : ${PTSCOTCH_LIBRARY}") - endif (NOT PTSCOTCH_FIND_QUIETLY) -else (PTSCOTCH_FOUND) - if (PTSCOTCH_FIND_REQUIRED) - message (FATAL_ERROR "Could not find PTSCOTCH. You have to define variable PTSCOTCH_HOME") - endif (PTSCOTCH_FIND_REQUIRED) -endif (PTSCOTCH_FOUND) - -mark_as_advanced (PTSCOTCH_INCLUDE_DIR PTSCOTCH_LIBRARY SCOTCH_LIBRARY - PTSCOTCH_EXTRA_LIBRARY PTSCOTCH_SUFFIX) + +# Try to find the ptscotch header in the given paths +# ------------------------------------------------- + +set(PTSCOTCH_hdrs_to_find "ptscotch.h;scotch.h") + +# call cmake macro to find the header path +if(PTSCOTCH_INCDIR) + foreach(ptscotch_hdr ${PTSCOTCH_hdrs_to_find}) + set(PTSCOTCH_${ptscotch_hdr}_DIRS "PTSCOTCH_${ptscotch_hdr}_DIRS-NOTFOUND") + find_path(PTSCOTCH_${ptscotch_hdr}_DIRS + NAMES ${ptscotch_hdr} + HINTS ${PTSCOTCH_INCDIR}) + mark_as_advanced(PTSCOTCH_${ptscotch_hdr}_DIRS) + endforeach() +else() + if(PTSCOTCH_DIR) + foreach(ptscotch_hdr ${PTSCOTCH_hdrs_to_find}) + set(PTSCOTCH_${ptscotch_hdr}_DIRS "PTSCOTCH_${ptscotch_hdr}_DIRS-NOTFOUND") + find_path(PTSCOTCH_${ptscotch_hdr}_DIRS + NAMES ${ptscotch_hdr} + HINTS ${PTSCOTCH_DIR} + PATH_SUFFIXES "include" "include/scotch") + mark_as_advanced(PTSCOTCH_${ptscotch_hdr}_DIRS) + endforeach() + else() + foreach(ptscotch_hdr ${PTSCOTCH_hdrs_to_find}) + set(PTSCOTCH_${ptscotch_hdr}_DIRS "PTSCOTCH_${ptscotch_hdr}_DIRS-NOTFOUND") + find_path(PTSCOTCH_${ptscotch_hdr}_DIRS + NAMES ${ptscotch_hdr} + HINTS ${_inc_env} + PATH_SUFFIXES "scotch") + mark_as_advanced(PTSCOTCH_${ptscotch_hdr}_DIRS) + endforeach() + endif() +endif() + +# If found, add path to cmake variable +# ------------------------------------ +foreach(ptscotch_hdr ${PTSCOTCH_hdrs_to_find}) + if (PTSCOTCH_${ptscotch_hdr}_DIRS) + list(APPEND PTSCOTCH_INCLUDE_DIRS "${PTSCOTCH_${ptscotch_hdr}_DIRS}") + else () + set(PTSCOTCH_INCLUDE_DIRS "PTSCOTCH_INCLUDE_DIRS-NOTFOUND") + if (NOT PTSCOTCH_FIND_QUIETLY) + message(STATUS "Looking for ptscotch -- ${ptscotch_hdr} not found") + endif() + endif() +endforeach() +list(REMOVE_DUPLICATES PTSCOTCH_INCLUDE_DIRS) + +# Looking for lib +# --------------- + +# Add system library paths to search lib +# -------------------------------------- +unset(_lib_env) +set(ENV_PTSCOTCH_LIBDIR "$ENV{PTSCOTCH_LIBDIR}") +if(ENV_PTSCOTCH_LIBDIR) + list(APPEND _lib_env "${ENV_PTSCOTCH_LIBDIR}") +elseif(ENV_PTSCOTCH_DIR) + list(APPEND _lib_env "${ENV_PTSCOTCH_DIR}") + list(APPEND _lib_env "${ENV_PTSCOTCH_DIR}/lib") +else() + if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") + else() + if(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") + endif() +endif() +list(REMOVE_DUPLICATES _lib_env) + +# Try to find the ptscotch lib in the given paths +# ---------------------------------------------- + +set(PTSCOTCH_libs_to_find "ptscotch;ptscotcherr") +if (PTSCOTCH_LOOK_FOR_ESMUMPS) + list(INSERT PTSCOTCH_libs_to_find 0 "ptesmumps") + list(APPEND PTSCOTCH_libs_to_find "esmumps" ) +endif() +list(APPEND PTSCOTCH_libs_to_find "scotch;scotcherr") + +# call cmake macro to find the lib path +if(PTSCOTCH_LIBDIR) + foreach(ptscotch_lib ${PTSCOTCH_libs_to_find}) + set(PTSCOTCH_${ptscotch_lib}_LIBRARY "PTSCOTCH_${ptscotch_lib}_LIBRARY-NOTFOUND") + find_library(PTSCOTCH_${ptscotch_lib}_LIBRARY + NAMES ${ptscotch_lib} + HINTS ${PTSCOTCH_LIBDIR}) + endforeach() +else() + if(PTSCOTCH_DIR) + foreach(ptscotch_lib ${PTSCOTCH_libs_to_find}) + set(PTSCOTCH_${ptscotch_lib}_LIBRARY "PTSCOTCH_${ptscotch_lib}_LIBRARY-NOTFOUND") + find_library(PTSCOTCH_${ptscotch_lib}_LIBRARY + NAMES ${ptscotch_lib} + HINTS ${PTSCOTCH_DIR} + PATH_SUFFIXES lib lib32 lib64) + endforeach() + else() + foreach(ptscotch_lib ${PTSCOTCH_libs_to_find}) + set(PTSCOTCH_${ptscotch_lib}_LIBRARY "PTSCOTCH_${ptscotch_lib}_LIBRARY-NOTFOUND") + find_library(PTSCOTCH_${ptscotch_lib}_LIBRARY + NAMES ${ptscotch_lib} + HINTS ${_lib_env}) + endforeach() + endif() +endif() + +set(PTSCOTCH_LIBRARIES "") +set(PTSCOTCH_LIBRARY_DIRS "") +# If found, add path to cmake variable +# ------------------------------------ +foreach(ptscotch_lib ${PTSCOTCH_libs_to_find}) + + if (PTSCOTCH_${ptscotch_lib}_LIBRARY) + get_filename_component(${ptscotch_lib}_lib_path "${PTSCOTCH_${ptscotch_lib}_LIBRARY}" PATH) + # set cmake variables + list(APPEND PTSCOTCH_LIBRARIES "${PTSCOTCH_${ptscotch_lib}_LIBRARY}") + list(APPEND PTSCOTCH_LIBRARY_DIRS "${${ptscotch_lib}_lib_path}") + else () + list(APPEND PTSCOTCH_LIBRARIES "${PTSCOTCH_${ptscotch_lib}_LIBRARY}") + if (NOT PTSCOTCH_FIND_QUIETLY) + message(STATUS "Looking for ptscotch -- lib ${ptscotch_lib} not found") + endif() + endif () + + mark_as_advanced(PTSCOTCH_${ptscotch_lib}_LIBRARY) + +endforeach() +list(REMOVE_DUPLICATES PTSCOTCH_LIBRARY_DIRS) + +# check a function to validate the find +if(PTSCOTCH_LIBRARIES) + + set(REQUIRED_INCDIRS) + set(REQUIRED_FLAGS) + set(REQUIRED_LDFLAGS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # PTSCOTCH + if (PTSCOTCH_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${PTSCOTCH_INCLUDE_DIRS}") + endif() + if (PTSCOTCH_LIBRARY_DIRS) + set(REQUIRED_LIBDIRS "${PTSCOTCH_LIBRARY_DIRS}") + endif() + set(REQUIRED_LIBS "${PTSCOTCH_LIBRARIES}") + # MPI + if (MPI_FOUND) + if (MPI_C_INCLUDE_PATH) + list(APPEND REQUIRED_INCDIRS "${MPI_C_INCLUDE_PATH}") + endif() + if (MPI_C_LINK_FLAGS) + if (${MPI_C_LINK_FLAGS} MATCHES " -") + string(REGEX REPLACE " -" "-" MPI_C_LINK_FLAGS ${MPI_C_LINK_FLAGS}) + endif() + list(APPEND REQUIRED_LDFLAGS "${MPI_C_LINK_FLAGS}") + endif() + list(APPEND REQUIRED_LIBS "${MPI_C_LIBRARIES}") + endif() + # THREADS + if(CMAKE_THREAD_LIBS_INIT) + list(APPEND REQUIRED_LIBS "${CMAKE_THREAD_LIBS_INIT}") + endif() + set(Z_LIBRARY "Z_LIBRARY-NOTFOUND") + find_library(Z_LIBRARY NAMES z) + mark_as_advanced(Z_LIBRARY) + if(Z_LIBRARY) + list(APPEND REQUIRED_LIBS "${Z_LIBRARY}") + endif() + set(M_LIBRARY "M_LIBRARY-NOTFOUND") + find_library(M_LIBRARY NAMES m) + mark_as_advanced(M_LIBRARY) + if(M_LIBRARY) + list(APPEND REQUIRED_LIBS "${M_LIBRARY}") + endif() + set(RT_LIBRARY "RT_LIBRARY-NOTFOUND") + find_library(RT_LIBRARY NAMES rt) + mark_as_advanced(RT_LIBRARY) + if(RT_LIBRARY) + list(APPEND REQUIRED_LIBS "${RT_LIBRARY}") + endif() + + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + if (REQUIRED_FLAGS) + set(REQUIRED_FLAGS_COPY "${REQUIRED_FLAGS}") + set(REQUIRED_FLAGS) + set(REQUIRED_DEFINITIONS) + foreach(_flag ${REQUIRED_FLAGS_COPY}) + if (_flag MATCHES "^-D") + list(APPEND REQUIRED_DEFINITIONS "${_flag}") + endif() + string(REGEX REPLACE "^-D.*" "" _flag "${_flag}") + list(APPEND REQUIRED_FLAGS "${_flag}") + endforeach() + endif() + set(CMAKE_REQUIRED_DEFINITIONS "${REQUIRED_DEFINITIONS}") + set(CMAKE_REQUIRED_FLAGS "${REQUIRED_FLAGS}") + set(CMAKE_REQUIRED_LIBRARIES) + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LDFLAGS}") + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + string(REGEX REPLACE "^ -" "-" CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}") + + # test link + unset(PTSCOTCH_WORKS CACHE) + include(CheckFunctionExists) + check_function_exists(SCOTCH_dgraphInit PTSCOTCH_WORKS) + mark_as_advanced(PTSCOTCH_WORKS) + + if(PTSCOTCH_WORKS) + # save link with dependencies + set(PTSCOTCH_LIBRARIES_DEP "${REQUIRED_LIBS}") + set(PTSCOTCH_LIBRARY_DIRS_DEP "${REQUIRED_LIBDIRS}") + set(PTSCOTCH_INCLUDE_DIRS_DEP "${REQUIRED_INCDIRS}") + set(PTSCOTCH_CFLAGS_OTHER_DEP "${REQUIRED_FLAGS}") + set(PTSCOTCH_LDFLAGS_OTHER_DEP "${REQUIRED_LDFLAGS}") + list(REMOVE_DUPLICATES PTSCOTCH_LIBRARY_DIRS_DEP) + list(REMOVE_DUPLICATES PTSCOTCH_CFLAGS_OTHER_DEP) + list(REMOVE_DUPLICATES PTSCOTCH_LDFLAGS_OTHER_DEP) + else() + if(NOT PTSCOTCH_FIND_QUIETLY) + message(STATUS "Looking for PTSCOTCH : test of SCOTCH_dgraphInit with PTSCOTCH library fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "CMAKE_REQUIRED_FLAGS: ${CMAKE_REQUIRED_FLAGS}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + endif() + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) +endif(PTSCOTCH_LIBRARIES) + +if (PTSCOTCH_LIBRARIES) + list(GET PTSCOTCH_LIBRARIES 0 first_lib) + get_filename_component(first_lib_path "${first_lib}" PATH) + if (NOT PTSCOTCH_LIBRARY_DIRS) + set(PTSCOTCH_LIBRARY_DIRS "${first_lib_path}") + endif() + if (${first_lib_path} MATCHES "/lib(32|64)?$") + string(REGEX REPLACE "/lib(32|64)?$" "" not_cached_dir "${first_lib_path}") + set(PTSCOTCH_DIR_FOUND "${not_cached_dir}" CACHE PATH "Installation directory of PTSCOTCH library" FORCE) + else() + set(PTSCOTCH_DIR_FOUND "${first_lib_path}" CACHE PATH "Installation directory of PTSCOTCH library" FORCE) + endif() +endif() +mark_as_advanced(PTSCOTCH_DIR) +mark_as_advanced(PTSCOTCH_DIR_FOUND) + +# Check the size of SCOTCH_Num +# --------------------------------- +set(CMAKE_REQUIRED_INCLUDES ${PTSCOTCH_INCLUDE_DIRS_DEP}) +include(CheckCSourceRuns) +#stdio.h and stdint.h should be included by scotch.h directly +#mpi.h not included into ptscotch.h => MPI_comm undefined +set(PTSCOTCH_C_TEST_SCOTCH_Num_4 " +#include +#include +#include +#include +int main(int argc, char **argv) { + if (sizeof(SCOTCH_Num) == 4) + return 0; + else + return 1; +} +") + +set(PTSCOTCH_C_TEST_SCOTCH_Num_8 " +#include +#include +#include +#include +int main(int argc, char **argv) { + if (sizeof(SCOTCH_Num) == 8) + return 0; + else + return 1; +} +") + +unset(PTSCOTCH_Num_4 CACHE) +unset(PTSCOTCH_Num_8 CACHE) +check_c_source_runs("${PTSCOTCH_C_TEST_SCOTCH_Num_4}" PTSCOTCH_Num_4) +check_c_source_runs("${PTSCOTCH_C_TEST_SCOTCH_Num_8}" PTSCOTCH_Num_8) +if(NOT PTSCOTCH_Num_4) + if(NOT PTSCOTCH_Num_8) + set(PTSCOTCH_INTSIZE -1) + else() + set(PTSCOTCH_INTSIZE 8) + endif() +else() + set(PTSCOTCH_INTSIZE 4) +endif() +set(CMAKE_REQUIRED_INCLUDES "") + +# check that PTSCOTCH has been found +# --------------------------------- +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(PTSCOTCH DEFAULT_MSG + PTSCOTCH_LIBRARIES + PTSCOTCH_WORKS) +# +# TODO: Add possibility to check for specific functions in the library +# diff --git a/CMakeScripts/FindSCOTCH.cmake b/CMakeScripts/FindSCOTCH.cmake index b6a35d3..f86f038 100644 --- a/CMakeScripts/FindSCOTCH.cmake +++ b/CMakeScripts/FindSCOTCH.cmake @@ -1,53 +1,372 @@ -## Copyright 2017 Inria ## -############################################################# -## -## \file FindSCOTCH.cmake -## -## \authors Cedric Lachat -## -## -## \date Version 1.0: from: 19 May 2017 -## to: 22 Sep 2017 -## -############################################################# -if (NOT ${SCOTCH_PATH} STREQUAL ${SCOTCH_HOME}) - set (SCOTCH_LIBRARY "NOTFOUND") - set (SCOTCH_DEBUG_LIBRARY "NOTFOUND") - set (SCOTCH_RELEASE_LIBRARY "NOTFOUND") - set (SCOTCH_EXTRA_LIBRARY "NOTFOUND") - set (SCOTCH_INCLUDE_DIR "NOTFOUND") +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2018 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find SCOTCH include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(SCOTCH +# [REQUIRED] # Fail with error if scotch is not found +# [COMPONENTS ...] # dependencies +# ) +# +# COMPONENTS can be some of the following: +# - ESMUMPS: to activate detection of Scotch with the esmumps interface +# +# This module finds headers and scotch library. +# Results are reported in variables: +# SCOTCH_FOUND - True if headers and requested libraries were found +# SCOTCH_INCLUDE_DIRS - scotch include directories +# SCOTCH_LIBRARY_DIRS - Link directories for scotch libraries +# SCOTCH_LIBRARIES - scotch component libraries to be linked +# SCOTCH_INTSIZE - Number of octets occupied by a SCOTCH_Num +# +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DSCOTCH=path/to/scotch): +# SCOTCH_DIR - Where to find the base directory of scotch +# SCOTCH_INCDIR - Where to find the header files +# SCOTCH_LIBDIR - Where to find the library files +# The module can also look for the following environment variables if paths +# are not given as cmake variable: SCOTCH_DIR, SCOTCH_INCDIR, SCOTCH_LIBDIR + +#============================================================================= +# Copyright 2012-2018 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013-2018 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + +if (NOT SCOTCH_FOUND) + set(SCOTCH_DIR "" CACHE PATH "Installation directory of SCOTCH library") + if (NOT SCOTCH_FIND_QUIETLY) + message(STATUS "A cache variable, namely SCOTCH_DIR, has been set to specify the install directory of SCOTCH") + endif() +endif() + +# Set the version to find +set(SCOTCH_LOOK_FOR_ESMUMPS OFF) + +if( SCOTCH_FIND_COMPONENTS ) + foreach( component ${SCOTCH_FIND_COMPONENTS} ) + if (${component} STREQUAL "ESMUMPS") + # means we look for esmumps library + set(SCOTCH_LOOK_FOR_ESMUMPS ON) + endif() + endforeach() +endif() + +# SCOTCH may depend on Threads, try to find it +if (SCOTCH_FIND_REQUIRED) + find_package(Threads REQUIRED) +else() + find_package(Threads) +endif() +if( THREADS_FOUND ) + libraries_absolute_path(CMAKE_THREAD_LIBS_INIT "") endif () -set (SCOTCH_PATH ${SCOTCH_HOME} CACHE INTERNAL "") -find_path (SCOTCH_INCLUDE_DIR scotchf${SCOTCH_SUFFIX}.h HINTS ${SCOTCH_PATH} PATH_SUFFIXES include) +# Looking for include +# ------------------- + +# Add system include paths to search include +# ------------------------------------------ +unset(_inc_env) +set(ENV_SCOTCH_DIR "$ENV{SCOTCH_DIR}") +set(ENV_SCOTCH_INCDIR "$ENV{SCOTCH_INCDIR}") +if(ENV_SCOTCH_INCDIR) + list(APPEND _inc_env "${ENV_SCOTCH_INCDIR}") +elseif(ENV_SCOTCH_DIR) + list(APPEND _inc_env "${ENV_SCOTCH_DIR}") + list(APPEND _inc_env "${ENV_SCOTCH_DIR}/include") + list(APPEND _inc_env "${ENV_SCOTCH_DIR}/include/scotch") +else() + if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") + else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + endif() +endif() +list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") +list(REMOVE_DUPLICATES _inc_env) -find_library (SCOTCH_LIBRARY NAMES scotch${SCOTCH_SUFFIX} HINTS ${SCOTCH_PATH} PATH_SUFFIXES lib) -find_library (SCOTCH_EXTRA_LIBRARY NAMES scotcherr${SCOTCH_SUFFIX} HINTS ${SCOTCH_PATH} PATH_SUFFIXES lib) -if (SCOTCH_INCLUDE_DIR AND SCOTCH_LIBRARY AND SCOTCH_EXTRA_LIBRARY) - set (SCOTCH_FOUND TRUE) -endif (SCOTCH_INCLUDE_DIR AND SCOTCH_LIBRARY AND - SCOTCH_EXTRA_LIBRARY) +# Try to find the scotch header in the given paths +# ------------------------------------------------- +# call cmake macro to find the header path +if(SCOTCH_INCDIR) + set(SCOTCH_scotch.h_DIRS "SCOTCH_scotch.h_DIRS-NOTFOUND") + find_path(SCOTCH_scotch.h_DIRS + NAMES scotch.h + HINTS ${SCOTCH_INCDIR}) +else() + if(SCOTCH_DIR) + set(SCOTCH_scotch.h_DIRS "SCOTCH_scotch.h_DIRS-NOTFOUND") + find_path(SCOTCH_scotch.h_DIRS + NAMES scotch.h + HINTS ${SCOTCH_DIR} + PATH_SUFFIXES "include" "include/scotch") + else() + set(SCOTCH_scotch.h_DIRS "SCOTCH_scotch.h_DIRS-NOTFOUND") + find_path(SCOTCH_scotch.h_DIRS + NAMES scotch.h + HINTS ${_inc_env} + PATH_SUFFIXES "scotch") + endif() +endif() +mark_as_advanced(SCOTCH_scotch.h_DIRS) -if (SCOTCH_FOUND) +# If found, add path to cmake variable +# ------------------------------------ +if (SCOTCH_scotch.h_DIRS) + set(SCOTCH_INCLUDE_DIRS "${SCOTCH_scotch.h_DIRS}") +else () + set(SCOTCH_INCLUDE_DIRS "SCOTCH_INCLUDE_DIRS-NOTFOUND") if (NOT SCOTCH_FIND_QUIETLY) - message (STATUS "Found SCOTCH : ${SCOTCH_LIBRARY}") - endif (NOT SCOTCH_FIND_QUIETLY) -else (SCOTCH_FOUND) - if (SCOTCH_FIND_REQUIRED) - message (FATAL_ERROR "Could not find SCOTCH. You have to define variable SCOTCH_HOME") - endif (SCOTCH_FIND_REQUIRED) -endif (SCOTCH_FOUND) - -find_library (SCOTCH_DEBUG_LIBRARY NAMES scotch${SCOTCH_SUFFIX}_debug PATHS ${SCOTCH_PATH} PATH_SUFFIXES lib) -if (NOT SCOTCH_DEBUG_LIBRARY) - set (SCOTCH_DEBUG_LIBRARY ${SCOTCH_LIBRARY}) -endif (NOT SCOTCH_DEBUG_LIBRARY) - -find_library (SCOTCH_RELEASE_LIBRARY NAMES scotch${SCOTCH_SUFFIX}_release PATHS ${SCOTCH_PATH} PATH_SUFFIXES lib) -if (NOT SCOTCH_RELEASE_LIBRARY) - set (SCOTCH_RELEASE_LIBRARY ${SCOTCH_LIBRARY}) -endif (NOT SCOTCH_RELEASE_LIBRARY) - -mark_as_advanced (SCOTCH_INCLUDE_DIR SCOTCH_LIBRARY SCOTCH_DEBUG_LIBRARY - SCOTCH_RELEASE_LIBRARY SCOTCH_EXTRA_LIBRARY SCOTCH_SUFFIX) + message(STATUS "Looking for scotch -- scotch.h not found") + endif() +endif() +list(REMOVE_DUPLICATES SCOTCH_INCLUDE_DIRS) + +# Looking for lib +# --------------- + +# Add system library paths to search lib +# -------------------------------------- +unset(_lib_env) +set(ENV_SCOTCH_LIBDIR "$ENV{SCOTCH_LIBDIR}") +if(ENV_SCOTCH_LIBDIR) + list(APPEND _lib_env "${ENV_SCOTCH_LIBDIR}") +elseif(ENV_SCOTCH_DIR) + list(APPEND _lib_env "${ENV_SCOTCH_DIR}") + list(APPEND _lib_env "${ENV_SCOTCH_DIR}/lib") +else() + if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") + else() + if(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") + endif() +endif() +list(REMOVE_DUPLICATES _lib_env) + +# Try to find the scotch lib in the given paths +# ---------------------------------------------- + +set(SCOTCH_libs_to_find "scotch;scotcherrexit") +if (SCOTCH_LOOK_FOR_ESMUMPS) + list(INSERT SCOTCH_libs_to_find 0 "esmumps") +endif() + +# call cmake macro to find the lib path +if(SCOTCH_LIBDIR) + foreach(scotch_lib ${SCOTCH_libs_to_find}) + set(SCOTCH_${scotch_lib}_LIBRARY "SCOTCH_${scotch_lib}_LIBRARY-NOTFOUND") + find_library(SCOTCH_${scotch_lib}_LIBRARY + NAMES ${scotch_lib} + HINTS ${SCOTCH_LIBDIR}) + endforeach() +else() + if(SCOTCH_DIR) + foreach(scotch_lib ${SCOTCH_libs_to_find}) + set(SCOTCH_${scotch_lib}_LIBRARY "SCOTCH_${scotch_lib}_LIBRARY-NOTFOUND") + find_library(SCOTCH_${scotch_lib}_LIBRARY + NAMES ${scotch_lib} + HINTS ${SCOTCH_DIR} + PATH_SUFFIXES lib lib32 lib64) + endforeach() + else() + foreach(scotch_lib ${SCOTCH_libs_to_find}) + set(SCOTCH_${scotch_lib}_LIBRARY "SCOTCH_${scotch_lib}_LIBRARY-NOTFOUND") + find_library(SCOTCH_${scotch_lib}_LIBRARY + NAMES ${scotch_lib} + HINTS ${_lib_env}) + endforeach() + endif() +endif() + +set(SCOTCH_LIBRARIES "") +set(SCOTCH_LIBRARY_DIRS "") +# If found, add path to cmake variable +# ------------------------------------ +foreach(scotch_lib ${SCOTCH_libs_to_find}) + + if (SCOTCH_${scotch_lib}_LIBRARY) + get_filename_component(${scotch_lib}_lib_path "${SCOTCH_${scotch_lib}_LIBRARY}" PATH) + # set cmake variables + list(APPEND SCOTCH_LIBRARIES "${SCOTCH_${scotch_lib}_LIBRARY}") + list(APPEND SCOTCH_LIBRARY_DIRS "${${scotch_lib}_lib_path}") + else () + list(APPEND SCOTCH_LIBRARIES "${SCOTCH_${scotch_lib}_LIBRARY}") + if (NOT SCOTCH_FIND_QUIETLY) + message(STATUS "Looking for scotch -- lib ${scotch_lib} not found") + endif() + endif () + + mark_as_advanced(SCOTCH_${scotch_lib}_LIBRARY) + +endforeach() +list(REMOVE_DUPLICATES SCOTCH_LIBRARY_DIRS) + +# check a function to validate the find +if(SCOTCH_LIBRARIES) + + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # SCOTCH + if (SCOTCH_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${SCOTCH_INCLUDE_DIRS}") + endif() + if (SCOTCH_LIBRARY_DIRS) + set(REQUIRED_LIBDIRS "${SCOTCH_LIBRARY_DIRS}") + endif() + set(REQUIRED_LIBS "${SCOTCH_LIBRARIES}") + # THREADS + if(CMAKE_THREAD_LIBS_INIT) + list(APPEND REQUIRED_LIBS "${CMAKE_THREAD_LIBS_INIT}") + endif() + set(Z_LIBRARY "Z_LIBRARY-NOTFOUND") + find_library(Z_LIBRARY NAMES z) + mark_as_advanced(Z_LIBRARY) + if(Z_LIBRARY) + list(APPEND REQUIRED_LIBS "${Z_LIBRARY}") + endif() + set(M_LIBRARY "M_LIBRARY-NOTFOUND") + find_library(M_LIBRARY NAMES m) + mark_as_advanced(M_LIBRARY) + if(M_LIBRARY) + list(APPEND REQUIRED_LIBS "${M_LIBRARY}") + endif() + set(RT_LIBRARY "RT_LIBRARY-NOTFOUND") + find_library(RT_LIBRARY NAMES rt) + mark_as_advanced(RT_LIBRARY) + if(RT_LIBRARY) + list(APPEND REQUIRED_LIBS "${RT_LIBRARY}") + endif() + + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + string(REGEX REPLACE "^ -" "-" CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}") + + # test link + unset(SCOTCH_WORKS CACHE) + include(CheckFunctionExists) + check_function_exists(SCOTCH_graphInit SCOTCH_WORKS) + mark_as_advanced(SCOTCH_WORKS) + + if(SCOTCH_WORKS) + # save link with dependencies + set(SCOTCH_LIBRARIES "${REQUIRED_LIBS}") + else() + if(NOT SCOTCH_FIND_QUIETLY) + message(STATUS "Looking for SCOTCH : test of SCOTCH_graphInit with SCOTCH library fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "CMAKE_REQUIRED_FLAGS: ${CMAKE_REQUIRED_FLAGS}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + endif() + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) +endif(SCOTCH_LIBRARIES) + +if (SCOTCH_LIBRARIES) + list(GET SCOTCH_LIBRARIES 0 first_lib) + get_filename_component(first_lib_path "${first_lib}" PATH) + if (NOT SCOTCH_LIBRARY_DIRS) + set(SCOTCH_LIBRARY_DIRS "${first_lib_path}") + endif() + if (${first_lib_path} MATCHES "/lib(32|64)?$") + string(REGEX REPLACE "/lib(32|64)?$" "" not_cached_dir "${first_lib_path}") + set(SCOTCH_DIR_FOUND "${not_cached_dir}" CACHE PATH "Installation directory of SCOTCH library" FORCE) + else() + set(SCOTCH_DIR_FOUND "${first_lib_path}" CACHE PATH "Installation directory of SCOTCH library" FORCE) + endif() +endif() +mark_as_advanced(SCOTCH_DIR) +mark_as_advanced(SCOTCH_DIR_FOUND) + +# Check the size of SCOTCH_Num +# --------------------------------- +set(CMAKE_REQUIRED_INCLUDES ${SCOTCH_INCLUDE_DIRS}) + +include(CheckCSourceRuns) +#stdio.h and stdint.h should be included by scotch.h directly +set(SCOTCH_C_TEST_SCOTCH_Num_4 " +#include +#include +#include +int main(int argc, char **argv) { + if (sizeof(SCOTCH_Num) == 4) + return 0; + else + return 1; +} +") + +set(SCOTCH_C_TEST_SCOTCH_Num_8 " +#include +#include +#include +int main(int argc, char **argv) { + if (sizeof(SCOTCH_Num) == 8) + return 0; + else + return 1; +} +") + +unset(SCOTCH_Num_4 CACHE) +unset(SCOTCH_Num_8 CACHE) +check_c_source_runs("${SCOTCH_C_TEST_SCOTCH_Num_4}" SCOTCH_Num_4) +check_c_source_runs("${SCOTCH_C_TEST_SCOTCH_Num_8}" SCOTCH_Num_8) +if(NOT SCOTCH_Num_4) + if(NOT SCOTCH_Num_8) + set(SCOTCH_INTSIZE -1) + else() + set(SCOTCH_INTSIZE 8) + endif() +else() + set(SCOTCH_INTSIZE 4) +endif() +set(CMAKE_REQUIRED_INCLUDES "") + +# check that SCOTCH has been found +# --------------------------------- +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(SCOTCH DEFAULT_MSG + SCOTCH_LIBRARIES + SCOTCH_WORKS) +# +# TODO: Add possibility to check for specific functions in the library +# diff --git a/CMakeScripts/LibrariesAbsolutePath.cmake b/CMakeScripts/LibrariesAbsolutePath.cmake new file mode 100644 index 0000000..eb59c11 --- /dev/null +++ b/CMakeScripts/LibrariesAbsolutePath.cmake @@ -0,0 +1,68 @@ +### +# +# @copyright (c) 2018 Inria. All rights reserved. +# +### +# +# @file LibrariesAbsolutePath.cmake +# +# @project MORSE +# MORSE is a software package provided by: +# Inria Bordeaux - Sud-Ouest, +# Univ. of Tennessee, +# King Abdullah Univesity of Science and Technology +# Univ. of California Berkeley, +# Univ. of Colorado Denver. +# +# @version 1.0.0 +# @author Florent Pruvost +# @date 13-04-2018 +# +### + +# Transform relative path into absolute path for libraries +# lib_list (input/output): the name of the CMake variable containing libraries, e.g. BLAS_LIBRARIES +# hints_paths (input): additional paths to add when looking for libraries +macro(LIBRARIES_ABSOLUTE_PATH lib_list hints_paths) + # collect environment paths to dig + if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") + elseif(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") + # copy the lib list + set (${lib_list}_COPY "${${lib_list}}") + # reset the lib list to populate + set(${lib_list} "") + foreach(_library ${${lib_list}_COPY}) + if(EXISTS "${_library}") + # if already an absolute path, nothing special to do + list(APPEND ${lib_list} ${_library}) + else() + # replace pattern -lfoo -> foo + string(REGEX REPLACE "^-l" "" _library "${_library}") + # remove extensions if exist + get_filename_component(_ext "${_library}" EXT) + set(_lib_extensions ".so" ".a" ".dyld" ".dll") + list(FIND _lib_extensions "${_ext}" _index) + if (${_index} GREATER -1) + get_filename_component(_library "${_library}" NAME_WE) + endif() + # try to find the lib + find_library(_library_path NAMES ${_library} HINTS ${hints_paths} ${_lib_env}) + if (_library_path) + list(APPEND ${lib_list} ${_library_path}) + else() + message(FATAL_ERROR "Dependency of ${lib_list} '${_library}' NOT FOUND") + endif() + unset(_library_path CACHE) + endif() + endforeach() +endmacro() + +## +## @end file LibrariesAbsolutePath.cmake +## diff --git a/doc/user_pages/doc_02_compil.txt b/doc/user_pages/doc_02_compil.txt index 7bd226d..e22c6a1 100644 --- a/doc/user_pages/doc_02_compil.txt +++ b/doc/user_pages/doc_02_compil.txt @@ -10,7 +10,7 @@ Before compiling PaMPA, make sure that an MPI implementation and the PT-Scotch s \section unix On Unix: - In the _build_ folder, run: - "cmake .." - - In order for CMake to know the path of PT-Scotch, you may have to define the PTSCOTCH_HOME environment variable in the command line, e.g. "cmake -D SCOTCH_HOME= ..", or use ccmake; + - In order for CMake to know the path of PT-Scotch, you may have to define the PTSCOTCH_DIR environment variable in the command line, e.g. "cmake -D SCOTCH_HOME= ..", or use ccmake; - In order to use a specific MPI library, you have to define the MPI_COMPILER environment variable (or MPI_C_COMPILER and MPI_Fortran_COMPILER, depending on your version of CMake), e.g. "cmake … -D MPI_COMPILER= .."; - "ccmake ." or "cmake-gui .", to define some installation variables. - Targets _pampa_ and _c_samples_ could be built in parallel, but _fortran_samples_ must be done in sequential. For example if you have 4 processors, _SAMPLES_ and _FORTRAN__INTERFACE_ options enabled: \verbatim make -j4 pampa c_samples && make fortran_samples \endverbatim @@ -19,7 +19,7 @@ Before compiling PaMPA, make sure that an MPI implementation and the PT-Scotch s - Run CMakeSetup.exe; - For the source code, choose the parent folder of BUILD, - For the binaries, choose the _build_ folder and: - - If necessary, define the PTSCOTCH_HOME environment variable (see above); + - If necessary, define the PTSCOTCH_DIR environment variable (see above); - In order to use a specific MPI library, define the MPI_COMPILER environment variable (or MPI_C_COMPILER and MPI_Fortran_COMPILER, depending on your version of CMake). \section options Options diff --git a/ext/CMakeLists.txt b/ext/CMakeLists.txt index 1ee69f3..b8e5d57 100644 --- a/ext/CMakeLists.txt +++ b/ext/CMakeLists.txt @@ -51,12 +51,7 @@ find_package (PAMPA REQUIRED) option (PTSCOTCH "Build PaMPA with PT-Scotch dependencies" ON) if (PTSCOTCH) #add_definitions (-DPTSCOTCH) - set(PTSCOTCH_HOME "" CACHE PATH "PT-Scotch home directory") - set(PTSCOTCH_SUFFIX "" CACHE STRING "PT-Scotch suffix name") find_package(PTSCOTCH REQUIRED) -else () - unset (PTSCOTCH_HOME CACHE) - unset (PTSCOTCH_SUFFIX CACHE) endif () diff --git a/src/pampa-remesh/CMakeLists.txt b/src/pampa-remesh/CMakeLists.txt index 48481ca..d824a5d 100644 --- a/src/pampa-remesh/CMakeLists.txt +++ b/src/pampa-remesh/CMakeLists.txt @@ -44,7 +44,7 @@ if (PTSCOTCH AND PAMPA_MMG3D4 AND PAMPA_GMSH) target_link_libraries(${EXEC_NAME} ${GMSH_LIBRARY}) endif() if (PAMPA_MMG3D4_SCOTCH) - target_link_libraries(${EXEC_NAME} ${SCOTCH_LIBRARY}) + target_link_libraries(${EXEC_NAME} ${PTSCOTCH_LIBRARIES_DEP}) endif() if (PAMPA_MSHINT) target_link_libraries(${EXEC_NAME} pampa-mshint ${MSHINT_LIBRARY} ${LIBMESH5_LIBRARY}) @@ -74,7 +74,7 @@ if (PTSCOTCH AND PAMPA_MMG3D4 AND PAMPA_TETGEN) target_link_libraries(${EXEC_NAME} ${TETGEN_LIBRARY}) endif() if (PAMPA_MMG3D4_SCOTCH) - target_link_libraries(${EXEC_NAME} ${SCOTCH_LIBRARY}) + target_link_libraries(${EXEC_NAME} ${PTSCOTCH_LIBRARIES_DEP}) endif() if (PAMPA_MSHINT) target_link_libraries(${EXEC_NAME} pampa-mshint ${MSHINT_LIBRARY} ${LIBMESH5_LIBRARY}) @@ -101,7 +101,7 @@ if (PTSCOTCH AND PAMPA_MMG3D4) endif () target_link_libraries(${EXEC_NAME} pampa-mmg3d4 ${MMG3D4_LIBRARY}) if (PAMPA_MMG3D4_SCOTCH) - target_link_libraries(${EXEC_NAME} ${SCOTCH_LIBRARY}) + target_link_libraries(${EXEC_NAME} ${PTSCOTCH_LIBRARIES_DEP}) endif() if (PAMPA_MSHINT) target_link_libraries(${EXEC_NAME} pampa-mshint ${MSHINT_LIBRARY} ${LIBMESH5_LIBRARY}) @@ -130,7 +130,7 @@ if (PTSCOTCH AND PAMPA_MMG3D5) endif () target_link_libraries(${EXEC_NAME} pampa-mmg3d5 ${MMG3D5_LIBRARY}) if (PAMPA_MMG3D5_SCOTCH) - target_link_libraries(${EXEC_NAME} ${SCOTCH_LIBRARY}) + target_link_libraries(${EXEC_NAME} ${PTSCOTCH_LIBRARIES_DEP}) endif() if (PTHREAD) target_link_libraries(${EXEC_NAME} ${CMAKE_THREAD_LIBS_INIT}) @@ -156,7 +156,7 @@ if (PTSCOTCH AND PAMPA_MMG3D) endif () target_link_libraries(${EXEC_NAME} pampa-mmg3d ${MMG3D_LIBRARY}) if (PAMPA_MMG3D_SCOTCH) - target_link_libraries(${EXEC_NAME} ${SCOTCH_LIBRARY}) + target_link_libraries(${EXEC_NAME} ${PTSCOTCH_LIBRARIES_DEP}) endif() if (PAMPA_MSHINT) target_link_libraries(${EXEC_NAME} pampa-mshint ${MSHINT_LIBRARY} ${LIBMESH5_LIBRARY}) -- GitLab