IF (Tacho_ENABLE_INT_INT)
  SET(TACHO_USE_INT_INT ON)
  SET(TACHO_USE_INT_SIZE_T OFF)
ELSE()
  SET(TACHO_USE_INT_INT OFF)
  SET(TACHO_USE_INT_SIZE_T ON)
ENDIF()

SET(TACHO_HAVE_MKL ${TPL_ENABLE_MKL})
SET(TACHO_HAVE_LAPACK ${TPL_ENABLE_LAPACK})
SET(TACHO_HAVE_BLAS ${TPL_ENABLE_BLAS})

SET(TACHO_HAVE_METIS ${TPL_ENABLE_METIS})
SET(TACHO_HAVE_METIS_MT ${TPL_ENABLE_MTMETIS})
SET(TACHO_HAVE_SCOTCH ${TPL_ENABLE_Scotch})
SET(TACHO_HAVE_TRILINOS_SS ${Trilinos_ENABLE_TrilinosSS})
SET(TACHO_HAVE_SUITESPARSE ${TPL_ENABLE_Cholmod})
                       
SET(TACHO_HAVE_VTUNE ${TPL_ENABLE_VTune})

#-----------------------------------------------------------------------------

TRIBITS_CONFIGURE_FILE(Tacho_config.h)

TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/impl)
#-----------------------------------------------------------------------------

SET(TRILINOS_INCDIR ${${PROJECT_NAME}_INSTALL_INCLUDE_DIR})

#-----------------------------------------------------------------------------

SET(HEADERS_PUBLIC "")
SET(HEADERS_PRIVATE "")
SET(SOURCES "")

FILE(GLOB HEADERS_PUBLIC *.hpp impl/*.hpp)
LIST( APPEND HEADERS_PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/Tacho_config.h )

APPEND_SET(SOURCES
  impl/Tacho_Util.cpp
  impl/Tacho_Blas_External.cpp
  impl/Tacho_Lapack_External.cpp
  impl/Tacho_GraphTools_Metis.cpp
  impl/Tacho_SymbolicTools.cpp
)

SET(TACHO_ETI_FILE "Tacho_Driver")
SET(TACHO_ETI_DEVICE_NAME "")
SET(TACHO_ETI_DEVICE_TYPE "")
SET(TACHO_ETI_WITH_TASK "")

IF (Kokkos_ENABLE_SERIAL)
  LIST(APPEND TACHO_ETI_DEVICE_NAME "Serial")
  LIST(APPEND TACHO_ETI_DEVICE_TYPE "Kokkos::Device<Kokkos::Serial,Kokkos::HostSpace>")
  LIST(APPEND TACHO_ETI_WITH_TASK "0")
ENDIF()
IF (Kokkos_ENABLE_OPENMP)
  LIST(APPEND TACHO_ETI_DEVICE_NAME "OpenMP")
  LIST(APPEND TACHO_ETI_DEVICE_TYPE "Kokkos::Device<Kokkos::OpenMP,Kokkos::HostSpace>")
  LIST(APPEND TACHO_ETI_WITH_TASK "1")
ENDIF()
IF (Kokkos_ENABLE_CUDA)
  LIST(APPEND TACHO_ETI_DEVICE_NAME "CUDA")
  LIST(APPEND TACHO_ETI_DEVICE_TYPE "Kokkos::Device<Kokkos::Cuda,Kokkos::CudaSpace>")
  LIST(APPEND TACHO_ETI_WITH_TASK "0")
ENDIF()
IF (Kokkos_ENABLE_HIP)
  LIST(APPEND TACHO_ETI_DEVICE_NAME "HIP")
  LIST(APPEND TACHO_ETI_DEVICE_TYPE "Kokkos::Device<Kokkos::HIP,Kokkos::HIPSpace>")
  LIST(APPEND TACHO_ETI_WITH_TASK "0")
ENDIF()
IF (Kokkos_ENABLE_SYCL)
  LIST(APPEND TACHO_ETI_DEVICE_NAME "SYCL")
  LIST(APPEND TACHO_ETI_DEVICE_TYPE "Kokkos::Device<Kokkos::Experimental::SYCL,Kokkos::Experimental::SYCLDeviceUSMSpace>")
  LIST(APPEND TACHO_ETI_WITH_TASK "0")
ENDIF()

LIST(LENGTH TACHO_ETI_DEVICE_NAME ETI_DEVICE_COUNT)
MATH(EXPR ETI_DEVICE_COUNT "${ETI_DEVICE_COUNT}-1")

SET(TACHO_ETI_VALUE_NAME "")
SET(TACHO_ETI_VALUE_TYPE "")

LIST(APPEND TACHO_ETI_VALUE_NAME "double")
LIST(APPEND TACHO_ETI_VALUE_TYPE "double")

LIST(APPEND TACHO_ETI_VALUE_NAME "float")
LIST(APPEND TACHO_ETI_VALUE_TYPE "float")

LIST(APPEND TACHO_ETI_VALUE_NAME "complex_double")
LIST(APPEND TACHO_ETI_VALUE_TYPE "Kokkos::complex<double>")

LIST(APPEND TACHO_ETI_VALUE_NAME "complex_float")
LIST(APPEND TACHO_ETI_VALUE_TYPE "Kokkos::complex<float>")

LIST(LENGTH TACHO_ETI_VALUE_NAME ETI_VALUE_COUNT)
MATH(EXPR ETI_VALUE_COUNT "${ETI_VALUE_COUNT}-1")

FOREACH(I RANGE ${ETI_DEVICE_COUNT})
  LIST(GET TACHO_ETI_DEVICE_NAME ${I} ETI_DEVICE_NAME)
  LIST(GET TACHO_ETI_DEVICE_TYPE ${I} ETI_DEVICE_TYPE)
  LIST(GET TACHO_ETI_WITH_TASK   ${I} ETI_WITH_TASK)

  FOREACH(J RANGE ${ETI_VALUE_COUNT})
    LIST(GET TACHO_ETI_VALUE_NAME ${J} ETI_VALUE_NAME)
    LIST(GET TACHO_ETI_VALUE_TYPE ${J} ETI_VALUE_TYPE)

    FOREACH(ETI_FILE IN LISTS TACHO_ETI_FILE)
      SET(ETI_NAME "${ETI_FILE}_ETI_${ETI_VALUE_NAME}_${ETI_DEVICE_NAME}")
      MESSAGE(STATUS "Generating ETI: ${ETI_NAME}.cpp")
      CONFIGURE_FILE(eti/${ETI_FILE}_ETI.in eti/${ETI_NAME}.cpp)

    APPEND_SET(SOURCES
      eti/${ETI_NAME}.cpp)

    ENDFOREACH()
  ENDFOREACH()
ENDFOREACH()

#-----------------------------------------------------------------------------

TRIBITS_ADD_LIBRARY(
    tacho
    HEADERS ${HEADERS_PUBLIC}
    NOINSTALLHEADERS ${HEADERS_PRIVATE}
    SOURCES ${SOURCES}
    DEPLIBS
    )
