cmake_minimum_required(VERSION 3.18)
project(poraque_hpc LANGUAGES C)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
find_package(MPI REQUIRED COMPONENTS C)
find_package(OpenMP REQUIRED COMPONENTS C)
find_path(FFTW_INCLUDE_DIR fftw3.h REQUIRED)
find_library(FFTW_LIBRARY fftw3 REQUIRED)
find_library(FFTW_THREADS_LIBRARY fftw3_threads REQUIRED)
set(SCALAPACK_LIBRARIES "" CACHE STRING "LP64 ScaLAPACK/BLACS and matching BLAS/LAPACK libraries")
if(NOT SCALAPACK_LIBRARIES)
  find_library(SCALAPACK_LIBRARY NAMES scalapack-openmpi scalapack REQUIRED)
  find_package(LAPACK REQUIRED)
  set(SCALAPACK_LIBRARIES ${SCALAPACK_LIBRARY} ${LAPACK_LIBRARIES})
endif()
add_library(poraque_hpc SHARED poraque_hpc.c)
target_include_directories(poraque_hpc PRIVATE ${FFTW_INCLUDE_DIR})
target_compile_options(poraque_hpc PRIVATE -Wall -Wextra -Wpedantic)
# MKL's BLAS interface also exports FFTW compatibility symbols. Resolve real
# FFTW first; otherwise --as-needed can silently drop the FFTW dependency.
target_link_libraries(poraque_hpc PRIVATE MPI::MPI_C OpenMP::OpenMP_C
  ${FFTW_THREADS_LIBRARY} ${FFTW_LIBRARY} ${SCALAPACK_LIBRARIES} m pthread)
option(PORAQUE_FFTW_MPI "Build optional distributed FFTW slab interface" OFF)
if(PORAQUE_FFTW_MPI)
  find_path(FFTW_MPI_INCLUDE_DIR fftw3-mpi.h REQUIRED)
  find_library(FFTW_MPI_LIBRARY fftw3_mpi REQUIRED)
  target_sources(poraque_hpc PRIVATE fft_mpi.c)
  target_include_directories(poraque_hpc PRIVATE ${FFTW_MPI_INCLUDE_DIR})
  target_link_libraries(poraque_hpc PRIVATE ${FFTW_MPI_LIBRARY})
endif()
install(TARGETS poraque_hpc LIBRARY DESTINATION lib)
install(FILES poraque_hpc.h DESTINATION include)
