# Pastix requires METIS or METIS (partitioning and reordering tools)

if (METIS_INCLUDES AND METIS_LIBRARIES)
  set(METIS_FIND_QUIETLY TRUE)
endif (METIS_INCLUDES AND METIS_LIBRARIES)

find_path(METIS_INCLUDES 
  NAMES 
  metis.h 
  PATHS 
  $ENV{METISDIR} 
  ${INCLUDE_INSTALL_DIR} 
  PATH_SUFFIXES
  .
  metis
  include
)

macro(_metis_check_version)
  file(READ "${METIS_INCLUDES}/metis.h" _metis_version_header)

  string(REGEX MATCH "define[ \t]+METIS_VER_MAJOR[ \t]+([0-9]+)" _metis_major_version_match "${_metis_version_header}")
  set(METIS_MAJOR_VERSION "${CMAKE_MATCH_1}")
  string(REGEX MATCH "define[ \t]+METIS_VER_MINOR[ \t]+([0-9]+)" _metis_minor_version_match "${_metis_version_header}")
  set(METIS_MINOR_VERSION "${CMAKE_MATCH_1}")
  string(REGEX MATCH "define[ \t]+METIS_VER_SUBMINOR[ \t]+([0-9]+)" _metis_subminor_version_match "${_metis_version_header}")
  set(METIS_SUBMINOR_VERSION "${CMAKE_MATCH_1}")
  if(NOT METIS_MAJOR_VERSION)
    message(WARNING "Could not determine Metis version. Assuming version 4.0.0")
    set(METIS_VERSION 4.0.0)
  else()
    set(METIS_VERSION ${METIS_MAJOR_VERSION}.${METIS_MINOR_VERSION}.${METIS_SUBMINOR_VERSION})
  endif()
  if(${METIS_VERSION} VERSION_LESS ${Metis_FIND_VERSION})
    set(METIS_VERSION_OK FALSE)
  else()
    set(METIS_VERSION_OK TRUE)
  endif()

  if(NOT METIS_VERSION_OK)
    message(STATUS "Metis version ${METIS_VERSION} found in ${METIS_INCLUDES}, "
                   "but at least version ${Metis_FIND_VERSION} is required")
  endif(NOT METIS_VERSION_OK)
endmacro(_metis_check_version)

  if(METIS_INCLUDES AND Metis_FIND_VERSION)
    _metis_check_version()
  else()
    set(METIS_VERSION_OK TRUE)
  endif()


find_library(METIS_LIBRARIES metis PATHS $ENV{METISDIR} ${LIB_INSTALL_DIR} PATH_SUFFIXES lib)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(METIS DEFAULT_MSG
                                  METIS_INCLUDES METIS_LIBRARIES METIS_VERSION_OK)

mark_as_advanced(METIS_INCLUDES METIS_LIBRARIES)
