# Contributor: Mehdi Chinoune <mehdi.chinoune@hotmail.com>

_realname=emscripten
pkgbase=mingw-w64-${_realname}
pkgname=("${MINGW_PACKAGE_PREFIX}-${_realname}")
# Sadly, upstream currently suggests bundling a binaryen version for the time being:
# https://github.com/emscripten-core/emscripten/issues/12252
# I'm obviously unhappy about that but it appears to be the only practical solution for the time being.
pkgver=4.0.18
# NOTE: You need to run ./get-compatible-versions.sh after changing the pkgver!
_binaryen_revision=4162cc858477f7cbe2902a7bb6dd88e7471c5d4d
_llvm_project_revision=d87200e8ca2a2c593baea2e113b90bf43409b534
pkgrel=1
pkgdesc="Compile C and C++ into highly-optimizable JavaScript for the web (mingw-w64)"
arch=('any')
mingw_arch=('ucrt64' 'clang64' 'clangarm64')
url="https://emscripten.org"
msys2_repository_url="https://github.com/emscripten-core/emscripten"
license=('custom')
depends=("${MINGW_PACKAGE_PREFIX}-cc-libs"
         "${MINGW_PACKAGE_PREFIX}-nodejs"
         "${MINGW_PACKAGE_PREFIX}-python"
         "${MINGW_PACKAGE_PREFIX}-zlib"
         "${MINGW_PACKAGE_PREFIX}-zstd")
makedepends=("${MINGW_PACKAGE_PREFIX}-cc"
             "${MINGW_PACKAGE_PREFIX}-cmake"
             "${MINGW_PACKAGE_PREFIX}-ninja"
             "${MINGW_PACKAGE_PREFIX}-libxml2"
             "git")
optdepends=("${MINGW_PACKAGE_PREFIX}-ruby: for using websockify addon"
            "${MINGW_PACKAGE_PREFIX}-cmake: for emcc --show-ports")
conflicts=("${MINGW_PACKAGE_PREFIX}-binaryen")
provides=("${MINGW_PACKAGE_PREFIX}-binaryen")
install="emscripten-${MSYSTEM}.install"
source=("git+$msys2_repository_url#tag=$pkgver"
        "llvm-project-$_llvm_project_revision.tar.gz::https://github.com/llvm/llvm-project/archive/$_llvm_project_revision.tar.gz"
        "binaryen-$_binaryen_revision.tar.gz::https://github.com/WebAssembly/binaryen/archive/$_binaryen_revision.tar.gz")
sha256sums=('15a72545326aa7a3f25137698a697cdf5d3233a4776fd1ad022389f81d9c4544'
            '1092d0490451f72a8ee27acfab660f32ad2e56899120e6af1f58e1208a08d40d'
            'fb8276a2ec816fa204a285659266a4d9aa7233a61b0d83e144c9fd638903e934')
noextract=("llvm-project-$_llvm_project_revision.tar.gz")

prepare() {
  tar -xf llvm-project-$_llvm_project_revision.tar.gz 2> /dev/null || true
  mv "llvm-project-$_llvm_project_revision" llvm-project
  mv "binaryen-$_binaryen_revision" binaryen

  # Bootstrap launcher scripts. For more info see https://github.com/emscripten-core/emscripten/pull/23761
  cd "$srcdir"/emscripten
  ./bootstrap
}

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

  # Build binaryen
  mkdir -p "$srcdir"/build-${MSYSTEM}-binaryen && cd "$srcdir"/build-${MSYSTEM}-binaryen
  MSYS2_ARG_CONV_EXCL="-DCMAKE_INSTALL_PREFIX=" \
  ${MINGW_PREFIX}/bin/cmake \
    -DCMAKE_INSTALL_PREFIX=${MINGW_PREFIX} \
    -GNinja \
    "${_extra_config[@]}" \
    -DENABLE_WERROR=OFF \
    -DBUILD_TESTS=OFF \
    ../binaryen
  ${MINGW_PREFIX}/bin/cmake --build .

  # Inspired from https://github.com/WebAssembly/waterfall/blob/db2ea5eeb11b74cce9b9459be0cc88807744b1b5/src/build.py#L868
  # Build llvm
  mkdir -p "$srcdir"/build-${MSYSTEM}-llvm && cd "$srcdir"/build-${MSYSTEM}-llvm
  _archs="WebAssembly"
  if [[ "${CARCH}" == "aarch64" ]]; then
    _archs+=";AArch64"
  else
    _archs+=";X86"
  fi
  MSYS2_ARG_CONV_EXCL="-DCMAKE_INSTALL_PREFIX=" \
  ${MINGW_PREFIX}/bin/cmake \
    -GNinja \
    -DCMAKE_INSTALL_PREFIX=${MINGW_PREFIX}/opt/emscripten-llvm \
    "${_extra_config[@]}" \
    -DLLVM_ENABLE_LIBXML2=OFF \
    -DLLVM_INCLUDE_EXAMPLES=OFF \
    -DLLVM_BUILD_RUNTIME=OFF \
    -DLLVM_TOOL_LTO_BUILD=ON \
    -DLLVM_INSTALL_TOOLCHAIN_ONLY=ON \
    -DLLVM_INCLUDE_EXAMPLES=OFF \
    -DLLVM_INCLUDE_TESTS=OFF \
    -DLLVM_TARGETS_TO_BUILD="${_archs}" \
    -DLLVM_ENABLE_PROJECTS="lld;clang" \
    -DCLANG_INCLUDE_TESTS=OFF \
    ../llvm-project/llvm
  ${MINGW_PREFIX}/bin/cmake --build .
}

package() {
  cd "$srcdir"/build-${MSYSTEM}-binaryen
  DESTDIR="$pkgdir"  ${MINGW_PREFIX}/bin/cmake --install .

  # Install LLVM stuff according to
  # https://github.com/emscripten-core/emscripten/blob/master/docs/packaging.md
  # and
  # https://github.com/WebAssembly/waterfall/blob/d4a504ffee488a68d09b336897c00d404544601d/src/build.py#L915
  cd "$srcdir"/build-${MSYSTEM}-llvm
  DESTDIR="$pkgdir"  ${MINGW_PREFIX}/bin/cmake --install .

  cd "$pkgdir"${MINGW_PREFIX}/opt/emscripten-llvm/bin

  # Clean up some unnecessary bins and libs
  rm clang-check.exe clang-cl.exe clang-cpp.exe clang-extdef-mapping.exe clang-format.exe \
      clang-offload-bundler.exe clang-refactor.exe clang-scan-deps.exe \
      lld-link.exe ld.lld.exe llvm-lib.exe libclang.dll
  cd ..
  rm -r share

  # Copy some stuff that we need but that wasn't installed by default
  for bin in llvm-as.exe llvm-dis.exe FileCheck.exe llc.exe llvm-link.exe llvm-mc.exe llvm-readobj.exe opt.exe llvm-dwarfdump.exe; do
      install -Dm755 "$srcdir"/build-${MSYSTEM}-llvm/bin/$bin "$pkgdir"${MINGW_PREFIX}/opt/emscripten-llvm/bin/$bin
  done

  # Install emscripten
  cd "$srcdir"/emscripten
  DESTDIR="$pkgdir"${MINGW_PREFIX}/lib/emscripten make install

  # install profile script
  mkdir -p "${pkgdir}${MINGW_PREFIX}"/etc/profile.d
  echo "export PATH=\$PATH:${MINGW_PREFIX}/lib/emscripten" > "${pkgdir}${MINGW_PREFIX}"/etc/profile.d/emscripten.sh
  cp "${pkgdir}${MINGW_PREFIX}"/etc/profile.d/emscripten.{sh,zsh}

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