# Contributor: Kreijstal <rainb@tfwno.gf>

_realname=ollama
pkgbase=mingw-w64-${_realname}
pkgname="${MINGW_PACKAGE_PREFIX}-${_realname}"
pkgdesc='Create, run and share large language models (LLMs) (mingw-w64)'
pkgver=0.5.13
pkgrel=1
arch=(any)
mingw_arch=('mingw64' 'ucrt64' 'clang64' 'clangarm64')
url='https://ollama.com'
msys2_repository_url='https://github.com/ollama/ollama'
msys2_references=(
  'cpe: cpe:2.3:a:ollama:ollama'
)
license=('spdx:MIT')
depends=("${MINGW_PACKAGE_PREFIX}-gcc-libs"
         "${MINGW_PACKAGE_PREFIX}-omp")
makedepends=("${MINGW_PACKAGE_PREFIX}-cc"
             "${MINGW_PACKAGE_PREFIX}-go"
             "${MINGW_PACKAGE_PREFIX}-cmake"
             "${MINGW_PACKAGE_PREFIX}-ninja"
             "${MINGW_PACKAGE_PREFIX}-openblas"
             git)
optdepends=("${MINGW_PACKAGE_PREFIX}-openblas")
source=(https://github.com/ollama/ollama/archive/v${pkgver}/${_realname}-${pkgver}.tar.gz
        0001-no-static-linking.patch
        0002-fix-dynamic-libraries-path.patch)
sha256sums=('832723ea2d51c8bc1af4cbe04d8dba043e336a963400c68c3c2c29749ef88f44'
            'ddc8c62091b6609d6ebcc69bb8ed0d15e05a470546961cd1f2de4fd1998d4577'
            '8a5e95cf824ff8871e89b43cd900ffe89847aa7de115f5a428fe99288b3d62bc')

apply_patch_with_msg() {
  for _patch in "$@"
  do
    msg2 "Applying ${_patch}"
    patch -Nbp1 -i "${srcdir}/${_patch}"
  done
}

prepare() {
  cd ${_realname}-${pkgver}

  apply_patch_with_msg \
    0001-no-static-linking.patch \
    0002-fix-dynamic-libraries-path.patch

  if check_option "debug" "n"; then
    sed -i 's,var mode string = gin.DebugMode,var mode string = gin.ReleaseMode,g' server/routes.go
  fi
}

build() {
  [[ -d "${srcdir}"/build-${MSYSTEM} ]] && rm -rf "${srcdir}"/build-${MSYSTEM}
  cp -r "${_realname}-${pkgver}" "build-${MSYSTEM}" && cd "build-${MSYSTEM}"

  if [[ ${CARCH} == aarch64 ]]; then
    # See https://github.com/ggerganov/llama.cpp/blob/325afb37/cmake/arm64-windows-llvm.cmake#L12
    local _flags="-march=armv8.7-a -fvectorize -ffp-model=fast -fno-finite-math-only"
    CFLAGS+=" ${_flags}"
    CXXFLAGS+=" ${_flags}"
  fi

  MSYS2_ARG_CONV_EXCL="-DCMAKE_INSTALL_PREFIX=" \
  ${MINGW_PREFIX}/bin/cmake -Wno-dev \
    -G"Ninja" \
    -DCMAKE_INSTALL_PREFIX=${MINGW_PREFIX} \
    -DBUILD_SHARED_LIBS=ON \
    -DGGML_WIN_VER="0xA00" \
    -DGGML_OPENMP=ON \
    -DGGML_BLAS=ON \
    -DGGML_BLAS_VENDOR=OpenBLAS \
    ../${_realname}-${pkgver}

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

  export CGO_CFLAGS="$CFLAGS" CGO_CPPFLAGS="$CPPFLAGS" CGO_CXXFLAGS="$CXXFLAGS" CGO_LDFLAGS="$LDFLAGS"
  export GOPROXY=direct
  export GOROOT=${MINGW_PREFIX}/lib/go
  export GOPATH=${MINGW_PREFIX}/

  go build -ldflags "${LDFLAGS} -X=github.com/ollama/ollama/version.Version=${pkgver}" .
}

check() {
  $srcdir/build-$MSYSTEM/ollama --version >/dev/null

  cd "build-${MSYSTEM}"
  go test .
}

package() {
  cd $srcdir/build-$MSYSTEM

  DESTDIR="${pkgdir}" ${MINGW_PREFIX}/bin/cmake --install .
  cp lib/ollama/libggml-blas.dll "${pkgdir}"${MINGW_PREFIX}/lib/ollama

  mkdir -p "${pkgdir}"${MINGW_PREFIX}/bin
  install ollama.exe -t"${pkgdir}"${MINGW_PREFIX}/bin

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