# ---------------------------------------------------------------
# Programmer(s): Eddy Banks, Slaven Peles, Cody J. Balos, and
#                Jean Sexton @ LLNL
# ---------------------------------------------------------------
# SUNDIALS Copyright Start
# Copyright (c) 2002-2020, Lawrence Livermore National Security
# and Southern Methodist University.
# All rights reserved.
#
# See the top-level LICENSE and NOTICE files for details.
#
# SPDX-License-Identifier: BSD-3-Clause
# SUNDIALS Copyright End
# ---------------------------------------------------------------
# HYPRE find module that creates an imported target for HYPRE.
# The target is SUNDIALS::HYPRE.
#
# The variable HYPRE_LIBRARY_DIR can be used to control
# where the module looks for the library.
#
# The variable HYPRE_INCLUDE_DIR can be used to set the
# include path for the library.
#
# This module also defines variables, but it is best to use
# the defined target to ensure includes and compile/link
# options are correctly passed to consumers.
#
#   HYPRE_FOUND       - system has HYPRE library
#   HYPRE_LIBRARY     - the HYPRE library
#   HYPRE_INCLUDE_DIR - the HYPRE include path
#   HYPRE_LIBRARIES   - all of the libraries needed for HYPRE
# ---------------------------------------------------------------

### Find include dir
find_path(temp_HYPRE_INCLUDE_DIR hypre.h ${HYPRE_INCLUDE_DIR})
if (temp_HYPRE_INCLUDE_DIR)
    set(HYPRE_INCLUDE_DIR ${temp_HYPRE_INCLUDE_DIR})
endif()
unset(temp_HYPRE_INCLUDE_DIR CACHE)

if (HYPRE_LIBRARY)
    # We have (or were given) HYPRE_LIBRARY - get path to use for any related libs
    get_filename_component(HYPRE_LIBRARY_DIR ${HYPRE_LIBRARY} PATH)

    # force CACHE update to show user DIR that will be used
    set(HYPRE_LIBRARY_DIR ${HYPRE_LIBRARY_DIR} CACHE PATH "" FORCE)
else ()
    # find library with user provided directory path
    set(HYPRE_LIBRARY_NAMES hypre HYPRE)
    find_library(HYPRE_LIBRARY
      NAMES ${HYPRE_LIBRARY_NAMES}
      PATHS ${HYPRE_LIBRARY_DIR} NO_DEFAULT_PATH
      )
endif ()
mark_as_advanced(HYPRE_LIBRARY)

list(FIND HYPRE_LIBRARIES ${HYPRE_LIBRARY} _idx)
if (_idx EQUAL -1)
  set(HYPRE_LIBRARIES "${HYPRE_LIBRARY};${HYPRE_LIBRARIES}" CACHE STRING "" FORCE)
endif ()

# set a more informative error message in case the library was not found
set(HYPRE_NOT_FOUND_MESSAGE "\
************************************************************************\n\
ERROR: Could not find HYPRE. Please check the variables:\n\
       HYPRE_INCLUDE_DIR and HYPRE_LIBRARY_DIR\n\
************************************************************************")

# set package variables including HYPRE_FOUND
find_package_handle_standard_args(HYPRE
  REQUIRED_VARS
    HYPRE_LIBRARY
    HYPRE_LIBRARIES
    HYPRE_INCLUDE_DIR
  FAIL_MESSAGE
    "${HYPRE_NOT_FOUND_MESSAGE}"
  )

# Create target for HYPRE
if(HYPRE_FOUND)

  if(NOT TARGET SUNDIALS::HYPRE)
    add_library(SUNDIALS::HYPRE UNKNOWN IMPORTED)
  endif()

  set_target_properties(SUNDIALS::HYPRE PROPERTIES
    INTERFACE_INCLUDE_DIRECTORIES "${HYPRE_INCLUDE_DIR}"
    INTERFACE_LINK_LIBRARIES "${HYPRE_LIBRARIES}"
    IMPORTED_LOCATION "${HYPRE_LIBRARY}")

endif()
