# Maintainer: Alexey Pavlov <alexpux@gmail.com>
# Contributor: Zion Nimchuk <zionnimchuk@gmail.com>
# Contributor: Mateusz Mikuła <mati865@gmail.com

_realname=rust
_bootstrapping=no
pkgbase=mingw-w64-${_realname}
pkgname="${MINGW_PACKAGE_PREFIX}-${_realname}"
pkgver=1.29.2
pkgrel=1
pkgdesc="Systems programming language focused on safety, speed and concurrency (mingw-w64)"
arch=('any')
url="https://www.rust-lang.org/"
license=('MIT' 'Apache')
depends=("${MINGW_PACKAGE_PREFIX}-gcc")
makedepends=("bison"
             "flex"
             "git"
             "${MINGW_PACKAGE_PREFIX}-cmake>=3.4.3"
             "${MINGW_PACKAGE_PREFIX}-curl"
             "${MINGW_PACKAGE_PREFIX}-jemalloc"
             "${MINGW_PACKAGE_PREFIX}-libffi"
             "${MINGW_PACKAGE_PREFIX}-libssh2"
             "${MINGW_PACKAGE_PREFIX}-lldb"
             "${MINGW_PACKAGE_PREFIX}-llvm"
             "${MINGW_PACKAGE_PREFIX}-ninja"
             "${MINGW_PACKAGE_PREFIX}-openssl"
             "${MINGW_PACKAGE_PREFIX}-python2"
             $([[ "$_bootstrapping" == "no" ]] && echo "${MINGW_PACKAGE_PREFIX}-rust")
             "${MINGW_PACKAGE_PREFIX}-zlib")
options=('staticlibs')
#install=rust.install
source=("https://static.rust-lang.org/dist/${_realname}c-${pkgver}-src.tar.gz"{,.asc}
        "force-curl-rust.patch"
        "fix-jemalloc.patch"
        "0001-add-missing-libs.patch"
        "0002-fix-install-msys2.patch"
        "0003-link-with-system-curl.patch"
        "0004-unbundle-gcc.patch"
        "0005-win32-config.patch")
sha256sums=('5088e796aa2e47478cdf41e7243fc5443fafab0a7c70a11423e57c80c04167c9'
            'SKIP'
            'f488fbe552ccc671deabfce79ea2b830a134350def899ff8b3d097d14fa1692e'
            'ce4ac32d9890609f5d6a444c56d152f5e8230df70be3ec5572f2feed18f5aa08'
            '4b6953fc6ab12d2ac45f65c429bf6be69d80bbf65727f293e2ced69ac9acc666'
            'e54e1da8428c484f41005bf4f9f7a8643253306e115b23e4dc17b24a6647ecab'
            'b16f65dfdc79e7a722b3e2589e90a1431a971038dd5dfa1394ec0427e3c0a2b4'
            'bcd8c6ccf1443ab3e6cfe77da1a5bc4d08dd2a3ad41e8ee7adedc5c85e7fa2c4'
            'd0d50796d3bdd56b5dbcd68f014d1da25fc0b08afded583f6338282b6ea11e2f')
validpgpkeys=('108F66205EAEB0AAA8DD5E1C85AB96E6FA1BE5FE') # Rust Language (Tag and Release Signing Key) <rust-key@rust-lang.org>
noextract=(${_realname}c-${pkgver}-src.tar.gz)

prepare() {
  [[ -d ${srcdir}/${_realname}c-${pkgver}-src ]] && rm -rf ${srcdir}/${_realname}c-${pkgver}-src
  tar -xzf ${srcdir}/${_realname}c-${pkgver}-src.tar.gz -C ${srcdir} || true

  cd ${srcdir}/${_realname}c-${pkgver}-src
  patch -p1 -i "${srcdir}/force-curl-rust.patch"
  patch -p1 -i "${srcdir}/fix-jemalloc.patch"
  patch -p1 -i "${srcdir}/0001-add-missing-libs.patch"
  patch -p1 -i "${srcdir}/0002-fix-install-msys2.patch"
  #patch -p1 -i "${srcdir}/0003-link-with-system-curl.patch"
  patch -p1 -i "${srcdir}/0004-unbundle-gcc.patch"
  patch -p1 -i ${srcdir}/0005-win32-config.patch
}

build() {
  [[ -d "${srcdir}/${CARCH}" ]] && rm -rf "${srcdir}/${CARCH}"
  mkdir -p "${srcdir}/${CARCH}" && cd "${srcdir}/${CARCH}"

  #We have to do the following because rust doesn't count x86_64-w64-mingw32 as a target triple
  OSTYPE="$CARCH-pc-windows-gnu"

  local -a _rust_conf=()
  if [ "${_bootstrapping}" = "no" ]; then
    _rust_conf+=("--local-rust-root=$(cygpath -m ${MINGW_PREFIX})")
  fi

  MSYS2_ARG_CONV_EXCL="--prefix;--sysconfdir;--localstatedir" \
  ../${_realname}c-${pkgver}-src/configure \
    --prefix=${MINGW_PREFIX} \
    --sysconfdir=${MINGW_PREFIX}/etc \
    --localstatedir=${MINGW_PREFIX}/var/lib \
    --build=$OSTYPE \
    --host=$OSTYPE \
    --target=$OSTYPE \
    --release-channel=stable \
    --enable-ninja \
    --enable-extended \
    --disable-codegen-tests \
    --python=${MINGW_PREFIX}/bin/python2 \
    --jemalloc-root=${MINGW_PREFIX}/lib \
    --llvm-root=${MINGW_PREFIX} \
    ${_rust_conf}

  DEP_NGHTTP_ROOT=${MINGW_PREFIX} \
  DEP_OPENSSL_ROOT=${MINGW_PREFIX} \
  DEP_Z_ROOT=${MINGW_PREFIX} \
  ${MINGW_PREFIX}/bin/python2 ../${_realname}c-${pkgver}-src/x.py build -j"$(nproc)" --verbose
}

check() {
  cd "${srcdir}/${CARCH}"
  # it might fail on Windows
  ${MINGW_PREFIX}/bin/python2 ../${_realname}c-${pkgver}-src/x.py test || true
}

package() {
  cd "${srcdir}/${CARCH}"
  DEP_NGHTTP_ROOT=${MINGW_PREFIX} \
  DEP_OPENSSL_ROOT=${MINGW_PREFIX} \
  DEP_Z_ROOT=${MINGW_PREFIX} \
  DESTDIR=${pkgdir} ${MINGW_PREFIX}/bin/python2 ../${_realname}c-${pkgver}-src/x.py install --verbose

  rm -f ${pkgdir}${MINGW_PREFIX}/bin/libgcc*.dll
  rm -f ${pkgdir}${MINGW_PREFIX}/bin/libstd*.dll
  rm -f ${pkgdir}${MINGW_PREFIX}/bin/libwinpthread*.dll

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

  install -d "${pkgdir}${MINGW_PREFIX}/share/bash-completion/completions"
  mv "${pkgdir}${MINGW_PREFIX}/etc/bash_completion.d/cargo" \
     "${pkgdir}${MINGW_PREFIX}/share/bash-completion/completions/cargo"
}
