# Maintainer: Haroogan <Haroogan@gmail.com>
# Maintainer: Oscar Fuentes <ofv@wanadoo.es>

_enable_jit=$([[ "${MSYSTEM}" == CLANG* ]] || echo yes)

_realname=emacs
pkgbase=mingw-w64-${_realname}
pkgname="${MINGW_PACKAGE_PREFIX}-${_realname}"
pkgver=31.1
pkgrel=1
pkgdesc="The extensible, customizable, self-documenting, real-time display editor (mingw-w64)"
arch=('any')
mingw_arch=('mingw64' 'ucrt64' 'clang64' 'clangarm64')
url="https://www.gnu.org/software/${_realname}/"
msys2_repository_url="https://cgit.git.savannah.gnu.org/cgit/emacs.git"
msys2_references=(
  'archlinux: emacs'
  "cpe: cpe:/a:gnu:emacs"
)
license=('spdx:GPL-3.0-or-later')
depends=($([[ "$_enable_jit" == "yes" ]] && echo "${MINGW_PACKAGE_PREFIX}-libgccjit")
         "${MINGW_PACKAGE_PREFIX}-texinfo" # solves https://github.com/msys2/MINGW-packages/issues/631
         "${MINGW_PACKAGE_PREFIX}-zlib"
         "${MINGW_PACKAGE_PREFIX}-xpm-nox"
         "${MINGW_PACKAGE_PREFIX}-freetype"
         "${MINGW_PACKAGE_PREFIX}-harfbuzz"
         "${MINGW_PACKAGE_PREFIX}-gnutls"
         "${MINGW_PACKAGE_PREFIX}-libtree-sitter"
         "${MINGW_PACKAGE_PREFIX}-libxml2"
         "${MINGW_PACKAGE_PREFIX}-libwinpthread")
optdepends=("${MINGW_PACKAGE_PREFIX}-librsvg: SVG image support (eww, SVG icons)"
            "${MINGW_PACKAGE_PREFIX}-libwebp: WebP image support"
            "${MINGW_PACKAGE_PREFIX}-sqlite3: sqlite.el support (also emacsql-based packages)"
            "${MINGW_PACKAGE_PREFIX}-lcms2: Little CMS color management"
            "${MINGW_PACKAGE_PREFIX}-giflib: GIF image support (fallback; GDI+ used by default)"
            "${MINGW_PACKAGE_PREFIX}-libjpeg-turbo: JPEG image support (fallback; GDI+ used by default)"
            "${MINGW_PACKAGE_PREFIX}-libpng: PNG image support (fallback; GDI+ used by default)"
            "${MINGW_PACKAGE_PREFIX}-libtiff: TIFF image support (fallback; GDI+ used by default)")
makedepends=("${MINGW_PACKAGE_PREFIX}-cc"
             "${MINGW_PACKAGE_PREFIX}-autotools"
             "${optdepends[@]%%:*}")
# Don't zip info files because the built-in info reader uses gzip to
# decompress them. gzip is not available as a mingw binary.
options=('!zipman')
source=("https://ftp.gnu.org/gnu/${_realname}/${_realname}-${pkgver}.tar.xz"{,.sig}
        # "https://alpha.gnu.org/gnu/${_realname}/pretest/${_realname}-${pkgver}.tar.xz"{,.sig}
        "001-clang-fixes.patch"
        "002-aarch64-fixes.patch"
        "emacs-ARM64.manifest")
sha256sums=('1da5790d9580c81932b5bf700633114468da7b3412d69faa767daebf974f4586'
            'SKIP'
            'd8732584a8f3bfd0badbd16d15384b7098e25c5df48632beb02d35f6050c358b'
            '744620cb6c43c713120d5f43015d980aaf60910d9eef30180dbc920292785776'
            'bfe64602dbeeec85799c1156ca4f3837fdac42a076e83a4221768db3417220e1')
validpgpkeys=('8DC2487E51ABDD90B5C4753F0F56D0553B6D411B')

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

prepare() {
  cp "${srcdir}/emacs-ARM64.manifest" "${_realname}-${pkgver}/nt"

  cd "${_realname}-${pkgver}"

  apply_patch_with_msg \
    001-clang-fixes.patch \
    002-aarch64-fixes.patch

  ./autogen.sh
}

build() {
  mkdir -p "build-${MSYSTEM}" && cd "build-${MSYSTEM}"

  _extra_cfg=""
  if [[ "$_enable_jit" == "yes" ]] ; then
      _extra_cfg="$_extra_cfg --with-native-compilation=aot"
  fi

  # Required for nanosleep with clang
  export LDFLAGS="${LDFLAGS} -lpthread"

  CFLAGS+=" -Wno-incompatible-pointer-types"

  ../${_realname}-${pkgver}/configure \
    --prefix="${MINGW_PREFIX}" \
    --host="${MINGW_CHOST}" \
    --build="${MINGW_CHOST}" \
    --with-modules \
    --without-dbus \
    --without-compress-install \
    --with-tree-sitter \
    $_extra_cfg

  # --without-compress-install is needed because we don't have gzip in
  # the mingw binaries and it is also required by native compilation.

  make
}

package() {
  cd "build-${MSYSTEM}"
  make DESTDIR="${pkgdir}" install

  local dir="${pkgdir}${MINGW_PREFIX}/share/${_realname}"
        dir="${dir}/$(ls -1 ${dir} | grep -E '([0-9]+\.[0-9]+)(\.[0-9]+)?')/src"

  mkdir -p "${dir}"
  cd "${srcdir}/${_realname}-${pkgver}/src"
  cp *.c *.h *.m "${dir}"
}

# TODO:
# Patch `shell-file-name' default in the C source code similarly to
# `source-directory'.
