# Maintainer: Gene Harvey <gharveymn@gmail.com>

_realname=sundials
pkgbase="mingw-w64-${_realname}"
pkgname="${MINGW_PACKAGE_PREFIX}-${_realname}"
pkgver=6.6.1
pkgrel=2
pkgdesc="SUite of Nonlinear and DIfferential/ALgebraic equation Solvers (mingw-w64)"
arch=('any')
mingw_arch=('mingw32' 'mingw64' 'ucrt64' 'clang64')
url="https://computing.llnl.gov/projects/sundials"
license=('spdx:BSD-3-Clause')
depends=("${MINGW_PACKAGE_PREFIX}-gcc-libs"
         $([[ ${MINGW_PACKAGE_PREFIX} == *-clang-* ]] || echo "${MINGW_PACKAGE_PREFIX}-gcc-libgfortran")
         "${MINGW_PACKAGE_PREFIX}-msmpi"
         "${MINGW_PACKAGE_PREFIX}-openblas"
         "${MINGW_PACKAGE_PREFIX}-omp"
         "${MINGW_PACKAGE_PREFIX}-petsc"
         "${MINGW_PACKAGE_PREFIX}-suitesparse"
         "${MINGW_PACKAGE_PREFIX}-superlu_dist")
makedepends=("${MINGW_PACKAGE_PREFIX}-cc"
             "${MINGW_PACKAGE_PREFIX}-fc"
             "${MINGW_PACKAGE_PREFIX}-cmake")
optdepends=("${MINGW_PACKAGE_PREFIX}-python: for running examples")
conflicts=("${MINGW_PACKAGE_PREFIX}-cvode")
source=(https://github.com/LLNL/sundials/releases/download/v${pkgver}/${_realname}-${pkgver}.tar.gz
        '0002-sundials-missing-export.patch'
        '0003-sundials-use-default-installdirs.patch'
        '0008-sundials-petsc-pkg-config-module.patch')
sha256sums=('21f71e4aef95b18f954c8bbdc90b62877443950533d595c68051ab768b76984b'
            '7f119fbcc8a630a4e3443e3bba252dafb4b1567ced1bf1389052253529e97ddc'
            '310b9beb86426fd2f817391baf72c0f9aefe9dc31e737daed5cc0280b7693311'
            'd4a56ef02d87d8d17970733fe8391c12fea9465f093681a1091a24b2ad0a787a')

prepare() {
  patch -d ${_realname}-${pkgver} -p1 < 0002-sundials-missing-export.patch
  patch -d ${_realname}-${pkgver} -p1 < 0003-sundials-use-default-installdirs.patch
  patch -d ${_realname}-${pkgver} -p1 < 0008-sundials-petsc-pkg-config-module.patch
}

petsc_arch=dmo

build() {
  [[ -d build-${MSYSTEM} ]] && rm -rf build-${MSYSTEM}

  declare -a _extra_config
  if check_option "debug" "n"; then
    _extra_config+=("-DCMAKE_BUILD_TYPE=Release")
  else
    _extra_config+=("-DCMAKE_BUILD_TYPE=Debug")
  fi

  if [[ ${MINGW_PACKAGE_PREFIX} == *-clang-* ]]; then
    export FFLAGS="-Qunused-arguments"
  fi

  I_MPI_ROOT="" \
  MSYS2_ARG_CONV_EXCL="CMAKE_INSTALL_PREFIX=;EXAMPLES_INSTALL_PATH=" \
  ${MINGW_PREFIX}/bin/cmake \
    -D BUILD_ARKODE=ON \
    -D BUILD_CVODE=ON \
    -D BUILD_CVODES=ON \
    -D BUILD_FORTRAN_MODULE_INTERFACE=OFF \
    -D BUILD_IDA=ON \
    -D BUILD_IDAS=ON \
    -D BUILD_KINSOL=ON \
    -D BUILD_NVECTOR_MANYVECTOR=ON \
    -D BUILD_NVECTOR_MPIMANYVECTOR=ON \
    -D BUILD_NVECTOR_MPIPLUSX=ON \
    -D BUILD_NVECTOR_OPENMP=ON \
    -D BUILD_NVECTOR_PARALLEL=ON \
    -D BUILD_NVECTOR_PTHREADS=ON \
    -D BUILD_SHARED_LIBS=ON \
    -D BUILD_STATIC_LIBS=ON \
    -D BUILD_SUNLINSOL_KLU=ON \
    -D BUILD_SUNLINSOL_LAPACKBAND=ON \
    -D BUILD_SUNLINSOL_LAPACKDENSE=ON \
    -D BUILD_TESTING=OFF \
    ${_extra_config[@]} \
    -D CMAKE_INSTALL_PREFIX=${MINGW_PREFIX} \
    -D CMAKE_RUNTIME_OUTPUT_DIRECTORY="${srcdir}/build-${MSYSTEM}"/build-output/bin \
    -D CMAKE_SYSTEM_IGNORE_PATH=/usr/lib \
    -D CMAKE_DLL_NAME_WITH_SOVERSION=ON \
    -D ENABLE_CUDA=OFF \
    -D ENABLE_HIP=OFF \
    -D ENABLE_HYPRE=OFF \
    -D ENABLE_KLU=ON \
    -D ENABLE_LAPACK=ON \
    -D ENABLE_MAGMA=OFF \
    -D ENABLE_MPI=ON \
    -D ENABLE_OPENMP=ON \
    -D ENABLE_OPENMP_DEVICE=OFF \
    -D ENABLE_PETSC=ON \
    -D ENABLE_PTHREAD=ON \
    -D ENABLE_RAJA=OFF \
    -D ENABLE_SUPERLUDIST=ON \
    -D ENABLE_SUPERLUMT=OFF \
    -D ENABLE_SYCL=OFF \
    -D ENABLE_TRILINOS=OFF \
    -D ENABLE_XBRAID=OFF \
    -D EXAMPLES_ENABLE_C=ON \
    -D EXAMPLES_ENABLE_CXX=ON \
    -D EXAMPLES_ENABLE_F2003=OFF \
    -D EXAMPLES_INSTALL=ON \
    -D EXAMPLES_INSTALL_PATH=${MINGW_PREFIX}/share/sundials/examples \
    -D KLU_LIBRARY=${MINGW_PREFIX}/lib/libklu.dll.a \
    -D LAPACK_LIBRARIES=${MINGW_PREFIX}/lib/libopenblas.dll.a \
    -D MPI_C_COMPILER=${MINGW_PREFIX}/bin/mpicc.exe \
    -D MPI_CXX_COMPILER=${MINGW_PREFIX}/bin/mpicxx.exe \
    -D MPI_Fortran_COMPILER=${MINGW_PREFIX}/bin/mpifort.exe \
    -D PETSC_PKG_CONFIG_MODULE=petsc-${petsc_arch} \
    -D SUITESPARSECONFIG_LIBRARY=${MINGW_PREFIX}/lib/libsuitesparseconfig.dll.a \
    -D SUNDIALS_BUILD_WITH_PROFILING=OFF \
    -D SUNDIALS_BUILD_WITH_MONITORING=ON \
    -D SUNDIALS_INDEX_SIZE=32 \
    -D SUNDIALS_PRECISION=DOUBLE \
    -D SUNDIALS_LOGGING_ENABLE_MPI=OFF \
    -D SUPERLUDIST_INCLUDE_DIRS=${MINGW_PREFIX}/include/superlu_dist \
    -D SUPERLUDIST_CONFIG_PATH=${MINGW_PREFIX}/include/superlu_dist/superlu_dist_config.h \
    -D SUPERLUDIST_INDEX_SIZE=32 \
    -D SUPERLUDIST_OpenMP=ON \
    -D CMAKE_C_STANDARD=11 \
    -B build-${MSYSTEM} \
    -S ${_realname}-${pkgver}

  ${MINGW_PREFIX}/bin/cmake --build build-${MSYSTEM}
}

check() {
  # Skip tests requiring MPI.
  ${MINGW_PREFIX}/bin/cmake -Bbuild-${MSYSTEM} -S${_realname}-${pkgver} -DBUILD_TESTING=ON
  ${MINGW_PREFIX}/bin/cmake --build build-${MSYSTEM}
  ${MINGW_PREFIX}/bin/ctest \
    --exclude-regex "mpi|parallel|petsc|superludist|slunrloc" \
    --test-dir build-${MSYSTEM}
}

package() {
  DESTDIR="${pkgdir}" \
  ${MINGW_PREFIX}/bin/cmake --install build-${MSYSTEM}

  # Install the LICENSE and NOTICE files to the system licenses directory.
  install -D --mode=644  \
    --target-directory="${pkgdir}${MINGW_PREFIX}"/share/licenses/${_realname} \
    "${srcdir}/${_realname}-${pkgver}"/{LICENSE,NOTICE}

  ## Patch various files to be relocatable.

  # Patch the CMake export modules.
  local PREFIX_WIN=$(cygpath -wm ${MINGW_PREFIX})
  for _f in "${pkgdir}${MINGW_PREFIX}"/lib/cmake/sundials/SUNDIALSTargets*.cmake; do
    sed -e "s|${PREFIX_WIN}|\$\{_IMPORT_PREFIX\}|g" -i "${_f}"
    sed -e "s|${MINGW_PREFIX}|\$\{_IMPORT_PREFIX\}|g" -i "${_f}"
  done

  # Patch the CMake config module.
  sed -e "s|${PREFIX_WIN}|\$\{PACKAGE_PREFIX_DIR\}|g" \
      -i "${pkgdir}${MINGW_PREFIX}"/lib/cmake/sundials/SUNDIALSConfig.cmake

  sed -e "s|${MINGW_PREFIX}|\$\{PACKAGE_PREFIX_DIR\}|g" \
      -i "${pkgdir}${MINGW_PREFIX}"/lib/cmake/sundials/SUNDIALSConfig.cmake

  # Patch the CMakeLists.txt files in the examples.
  shopt -s globstar
  for _f in "${pkgdir}${MINGW_PREFIX}"/share/sundials/examples/**/CMakeLists.txt; do
    _fdir=$(dirname "${_f}")
    _relative_root=$(realpath --relative-to="${_fdir}" "${pkgdir}${MINGW_PREFIX}")
    sed -e "s|${PREFIX_WIN}|\$\{CMAKE_CURRENT_LIST_DIR\}/${_relative_root}|g"   -i "${_f}"
    sed -e "s|${MINGW_PREFIX}|\$\{CMAKE_CURRENT_LIST_DIR\}/${_relative_root}|g" -i "${_f}"
  done
}
