# Maintainer: Alexey Pavlov <alexpux@gmail.com>

_realname=lapack
pkgbase=mingw-w64-${_realname}
pkgname=("${MINGW_PACKAGE_PREFIX}-${_realname}"
         "${MINGW_PACKAGE_PREFIX}-blas"
         "${MINGW_PACKAGE_PREFIX}-cblas"
         "${MINGW_PACKAGE_PREFIX}-lapacke"
         $([[ ${CARCH} == i686 ]] || echo \
           "${MINGW_PACKAGE_PREFIX}-${_realname}64" \
           "${MINGW_PACKAGE_PREFIX}-blas64" \
           "${MINGW_PACKAGE_PREFIX}-cblas64" \
           "${MINGW_PACKAGE_PREFIX}-lapacke64")
         )
pkgver=3.12.0
pkgrel=1
arch=('any')
mingw_arch=('mingw32' 'mingw64' 'ucrt64' 'clang64' 'clangarm64')
pkgdesc="Linear Algebra PACKage (mingw-w64)"
url="https://www.netlib.org/lapack"
msys2_repository_url="https://github.com/Reference-LAPACK/lapack"
msys2_references=(
  'archlinux: lapack'
)
license=('spdx:BSD-3-Clause')
makedepends=("${MINGW_PACKAGE_PREFIX}-cc"
             "${MINGW_PACKAGE_PREFIX}-fc"
             "${MINGW_PACKAGE_PREFIX}-cmake"
             "${MINGW_PACKAGE_PREFIX}-ninja")
source=(https://github.com/Reference-LAPACK/lapack/archive/v${pkgver}/${_realname}-${pkgver}.tar.gz)
sha256sums=('eac9570f8e0ad6f30ce4b963f4f033f0f643e7c3912fc9ee6cd99120675ad48b')

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

  for _shared in ON OFF; do
    for _index_64 in ON OFF; do
      if [[ ${CARCH} == i686 && ${_index_64} == ON ]]; then
        continue
      fi
      MSYS2_ARG_CONV_EXCL="-DCMAKE_INSTALL_PREFIX=" \
      ${MINGW_PREFIX}/bin/cmake.exe \
        -G"Ninja" \
        -DCMAKE_INSTALL_PREFIX=${MINGW_PREFIX} \
        "${_extra_config[@]}" \
        -DBUILD_SHARED_LIBS=${_shared} \
        -DBUILD_INDEX64=${_index_64} \
        -DCMAKE_NEED_RESPONSE=ON \
        -DBUILD_TESTING=OFF \
        -DLAPACKE_WITH_TMG=ON \
        -DCBLAS=ON \
        -DBUILD_DEPRECATED=ON \
        -S ${_realname}-${pkgver} \
        -B build-${MSYSTEM}-sh-${_shared}-64-${_index_64}

      ${MINGW_PREFIX}/bin/cmake.exe --build build-${MSYSTEM}-sh-${_shared}-64-${_index_64}
    done
  done
}

check() {
  # Many of the tests for CBLAS are failing
  for _shared in ON OFF; do
    for _index_64 in ON OFF; do
      if [[ ${CARCH} == i686 && ${_index_64} == ON ]]; then
        continue
      fi
      ${MINGW_PREFIX}/bin/cmake.exe \
        -DBUILD_TESTING=ON \
        -S ${_realname}-${pkgver} \
        -B build-${MSYSTEM}-sh-${_shared}-64-${_index_64}
      ${MINGW_PREFIX}/bin/cmake.exe --build build-${MSYSTEM}-sh-${_shared}-64-${_index_64}
      ${MINGW_PREFIX}/bin/ctest ctest --test-dir build-${MSYSTEM}-sh-${_shared}-64-${_index_64} || true
    done
  done
}

package_lapack() {
  depends=("${MINGW_PACKAGE_PREFIX}-blas"
           $([[ ${MINGW_PACKAGE_PREFIX} == *-clang-* ]] || echo "${MINGW_PACKAGE_PREFIX}-gcc-libgfortran"))

  for _shared in OFF ON; do
    DESTDIR="${pkgdir}" ${MINGW_PREFIX}/bin/cmake.exe --install build-${MSYSTEM}-sh-${_shared}-64-OFF
  done

  install -Dm644 "${srcdir}/${_realname}-${pkgver}/LICENSE" "${pkgdir}${MINGW_PREFIX}/share/licenses/${_realname}/LICENSE"

  rm -r "$pkgdir"${MINGW_PREFIX}/bin/{libblas.*,libcblas.*,liblapacke.*}
  rm -r "$pkgdir"${MINGW_PREFIX}/lib/{libblas.*,libcblas.*,liblapacke.*}
  rm -r "$pkgdir"${MINGW_PREFIX}/lib/pkgconfig/{blas.*,cblas.*,lapacke.*}
  rm -r "$pkgdir"${MINGW_PREFIX}/lib/cmake/{cblas*,lapacke*}
  rm -r "$pkgdir"${MINGW_PREFIX}/include
}

package_blas() {
  pkgdesc='Basic Linear Algebra Subprograms (mingw-w64)'
  depends=($([[ ${MINGW_PACKAGE_PREFIX} == *-clang-* ]] || echo "${MINGW_PACKAGE_PREFIX}-gcc-libgfortran"))

  for _shared in OFF ON; do
    DESTDIR="${pkgdir}" ${MINGW_PREFIX}/bin/cmake.exe --install build-${MSYSTEM}-sh-${_shared}-64-OFF/BLAS
  done

  install -Dm644 "${srcdir}/${_realname}-${pkgver}/LICENSE" -t "$pkgdir"${MINGW_PREFIX}/share/licenses/blas/
}

package_cblas() {
  pkgdesc='C interface to BLAS (mingw-w64)'
  depends=("${MINGW_PACKAGE_PREFIX}-blas")

  for _shared in OFF ON; do
    DESTDIR="${pkgdir}" ${MINGW_PREFIX}/bin/cmake.exe --install build-${MSYSTEM}-sh-${_shared}-64-OFF/CBLAS
  done

  install -Dm644 "${srcdir}/${_realname}-${pkgver}/LICENSE" -t "$pkgdir"${MINGW_PREFIX}/share/licenses/cblas/
}

package_lapacke() {
  pkgdesc='C interface to LAPACK (mingw-w64)'
  depends=("${MINGW_PACKAGE_PREFIX}-lapack")

  for _shared in OFF ON; do
    DESTDIR="${pkgdir}" ${MINGW_PREFIX}/bin/cmake.exe --install build-${MSYSTEM}-sh-${_shared}-64-OFF/LAPACKE
  done

  install -Dm644 "${srcdir}/${_realname}-${pkgver}/LICENSE" -t "$pkgdir"${MINGW_PREFIX}/share/licenses/lapacke/
}

package_lapack64() {
  pkgdesc="Linear Algebra PACKage (64-bit integers) (mingw-w64)"
  depends=("${MINGW_PACKAGE_PREFIX}-blas64"
           $([[ ${MINGW_PACKAGE_PREFIX} == *-clang-* ]] || echo "${MINGW_PACKAGE_PREFIX}-gcc-libgfortran"))

  for _shared in OFF ON; do
    DESTDIR="${pkgdir}" ${MINGW_PREFIX}/bin/cmake.exe --install build-${MSYSTEM}-sh-${_shared}-64-ON
  done

  install -Dm644 "${srcdir}/${_realname}-${pkgver}/LICENSE" "${pkgdir}${MINGW_PREFIX}/share/licenses/${_realname}64/LICENSE"

  rm -r "$pkgdir"${MINGW_PREFIX}/bin/{libblas64.*,libcblas64.*,liblapacke64.*}
  rm -r "$pkgdir"${MINGW_PREFIX}/lib/{libblas64.*,libcblas64.*,liblapacke64.*}
  rm -r "$pkgdir"${MINGW_PREFIX}/lib/pkgconfig/{blas64.*,cblas64.*,lapacke64.*}
  rm -r "$pkgdir"${MINGW_PREFIX}/lib/cmake/{cblas64*,lapacke64*}
  rm -r "$pkgdir"${MINGW_PREFIX}/include
}

package_blas64() {
  pkgdesc='Basic Linear Algebra Subprograms (64-bit integers) (mingw-w64)'
  depends=($([[ ${MINGW_PACKAGE_PREFIX} == *-clang-* ]] || echo "${MINGW_PACKAGE_PREFIX}-gcc-libgfortran"))

  for _shared in OFF ON; do
    DESTDIR="${pkgdir}" ${MINGW_PREFIX}/bin/cmake.exe --install build-${MSYSTEM}-sh-${_shared}-64-ON/BLAS
  done

  install -Dm644 "${srcdir}/${_realname}-${pkgver}/LICENSE" -t "$pkgdir"${MINGW_PREFIX}/share/licenses/blas64/
}

package_cblas64() {
  pkgdesc='C interface to BLAS (64-bit integers) (mingw-w64)'
  depends=("${MINGW_PACKAGE_PREFIX}-blas64")
  optdepends=("${MINGW_PACKAGE_PREFIX}-blas: development headers")

  for _shared in OFF ON; do
    DESTDIR="${pkgdir}" ${MINGW_PREFIX}/bin/cmake.exe --install build-${MSYSTEM}-sh-${_shared}-64-ON/CBLAS
  done

  rm -r "$pkgdir"${MINGW_PREFIX}/include # Provided by cblas

  install -Dm644 "${srcdir}/${_realname}-${pkgver}/LICENSE" -t "$pkgdir"${MINGW_PREFIX}/share/licenses/cblas64/
}

package_lapacke64() {
  pkgdesc='C interface to LAPACK (64-bit integers) (mingw-w64)'
  depends=("${MINGW_PACKAGE_PREFIX}-lapack64")
  optdepends=("${MINGW_PACKAGE_PREFIX}-lapacke: development headers")

  for _shared in OFF ON; do
    DESTDIR="${pkgdir}" ${MINGW_PREFIX}/bin/cmake.exe --install build-${MSYSTEM}-sh-${_shared}-64-ON/LAPACKE
  done

  install -Dm644 "${srcdir}/${_realname}-${pkgver}/LICENSE" -t "$pkgdir"${MINGW_PREFIX}/share/licenses/lapacke64/
}

# template start; name=mingw-w64-splitpkg-wrappers; version=1.0;
# vim: set ft=bash :

# generate wrappers
for _name in "${pkgname[@]}"; do
  _short="package_${_name#${MINGW_PACKAGE_PREFIX}-}"
  _func="$(declare -f "${_short}")"
  eval "${_func/#${_short}/package_${_name}}"
done
# template end;
