Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/cmake/Modules/FindPARPACK.cmake
3206 views
#CMake module to find arpack-ng libraries
#
#
#
#
#       PARPACK_INCLUDE_DIR
#       PARPACK_LIBRARIES
#
#
#
#
# The user defined parpack locations
IF(PARPACK_LIBRARIES AND PARPACK_INCLUDE_DIR)
  SET(PARPACK_FOUND TRUE)
  MESSAGE(STATUS "Provided parpack include path ${PARPACK_INCLUDE_DIR}")
  MESSAGE(STATUS "Provided parpack libraries ${PARPACK_LIBRARIES}")
ELSE()
  # PARPACK_LIBRARIES or PARPACK_INCLUDE_DIR are not defined
  SET(PARPACK_FOUND FALSE)
ENDIF()

IF(NOT PARPACK_FOUND)
  MESSAGE(STATUS "Finding parpack libraries")
  # Try to find with CMake config file of upstream parpack.
  FIND_PACKAGE(PARPACK CONFIG NAMES arpack arpackng arpack-ng parpack parpackng parpack-ng)
  IF(PARPACK_FOUND)
    GET_TARGET_PROPERTY(PARPACK_INCLUDE_DIR parpack INTERFACE_INCLUDE_DIRECTORIES)
    # Most likely arpack and parpack are packed togeher (like in Arch linux)
    # or they share the same include directory even in splitted packages (parpack-dev depends on arpack-dev)
    # So in this point ARPACK_INCLUDE_DIR has to be defined or the information is loaded into the arpack
    # interface
    IF(NOT PARPACK_INCLUDE_DIR)
      GET_TARGET_PROPERTY(PARPACK_INCLUDE_DIR arpack INTERFACE_INCLUDE_DIRECTORIES)
    ENDIF()
    GET_TARGET_PROPERTY(PARPACK_LIBRARIES parpack IMPORTED_LOCATION_RELEASE)
    # Check if a debug build type was used
    IF(NOT PARPACK_LIBRARIES)
      GET_TARGET_PROPERTY(PARPACK_LIBRARIES parpack IMPORTED_LOCATION_DEBUG)
    ENDIF()
  ENDIF()
  # There is no parpack-config script or something went wrong with the script
  # Fall back to manual search
  IF(NOT PARPACK_LIBRARIES OR NOT PARPACK_INCLUDE_DIR)
    INCLUDE(FindPackageHandleStandardArgs)
    MESSAGE(STATUS "Manual search of parpack")
    # Try to find PARPACK header
    SET(ARPACKINCLUDE
      "${PARPACK_ROOT}/include"
      "$ENV{PARPACK_ROOT}/include"
      "${PARPACKROOT}/include"
      "$ENV{PARPACKROOT}/include"
      "${ARPACK_ROOT}/include"
      "$ENV{ARPACK_ROOT}/include"
      "${ARPACKROOT}/include"
      "$ENV{ARPACKROOT}/include"
      INTERNAL
      )
    FIND_PATH(PARPACK_INCLUDE_DIR NAMES parpack.h parpackng.h parpack-ng.h
      HINTS ${ARPACKINCLUDE} PATH_SUFFIXES arpack arpackng arpack-ng parpack parpackng parpack-ng)
    # Try to find PARPACK libraries
    SET(ARPACKLIB
      "${PARPACK_ROOT}/lib"
      "$ENV{PARPACK_ROOT}/lib64"
      "${PARPACKROOT}/lib"
      "$ENV{PARPACKROOT}/lib64"
      "${ARPACK_ROOT}/lib"
      "$ENV{ARPACK_ROOT}/lib64"
      "${ARPACKROOT}/lib"
      "$ENV{ARPACKROOT}/lib64"
      INTERNAL
      )
    FIND_LIBRARY(PARPACK_LIBRARIES NAMES parpack parpackng parpack-ng HINTS ${ARPACKLIB})
  ENDIF(NOT PARPACK_LIBRARIES OR NOT PARPACK_INCLUDE_DIR)

ENDIF(NOT PARPACK_FOUND)

# This checks could be inadequate because this variables are not empty if nothing found
# Other option is to use the keyword REQUIRED, but this will increase cmake version to 3.18
# https://cmake.org/cmake/help/latest/command/find_library.html
# https://cmake.org/cmake/help/latest/command/find_path.html
IF (PARPACK_INCLUDE_DIR AND PARPACK_LIBRARIES)
  SET(PARPACK_FOUND TRUE)
  #The config script was not used, define the target manually
  IF(NOT TARGET parpack)
    ADD_LIBRARY(parpack SHARED IMPORTED)
    SET_PROPERTY(TARGET parpack PROPERTY IMPORTED_LOCATION ${PARPACK_LIBRARIES})
    SET_PROPERTY(TARGET parpack PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${PARPACK_INCLUDE_DIR})
  ENDIF()
  IF (NOT PARPACK_FIND_QUIETLY)
    MESSAGE(STATUS "A library with PARPACK API found.")
    MESSAGE(STATUS "PARPACK include dir: ${PARPACK_INCLUDE_DIR}")
    MESSAGE(STATUS "PARPACK libraries: ${PARPACK_LIBRARIES}")
  ENDIF()
ELSE()
  SET(PARPACK_FOUND FALSE)
  IF (PARPACK_FIND_REQUIRED)
    MESSAGE(FATAL_ERROR "PARPACK library not found.")
  ENDIF()
ENDIF(PARPACK_INCLUDE_DIR AND PARPACK_LIBRARIES)

MARK_AS_ADVANCED( PARPACK_LIBRARIES PARPACK_INCLUDE_DIR PARPACK_FOUND )