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

_realname=curl
pkgbase=mingw-w64-${_realname}
pkgname=("${MINGW_PACKAGE_PREFIX}-${_realname}"
         "${MINGW_PACKAGE_PREFIX}-${_realname}-gnutls"
         "${MINGW_PACKAGE_PREFIX}-${_realname}-winssl")
pkgver=8.22.0
pkgrel=2
pkgdesc="Command line tool and library for transferring data with URLs (mingw-w64)"
arch=('any')
mingw_arch=('mingw32' 'mingw64' 'ucrt64' 'clang64' 'clang32' 'clangarm64')
url="https://curl.se/"
license=("spdx:MIT")
_cert_depends=("${MINGW_PACKAGE_PREFIX}-ca-certificates"
               "${MINGW_PACKAGE_PREFIX}-libssh2")
_openssl_depends=("${MINGW_PACKAGE_PREFIX}-openssl"
                  "${MINGW_PACKAGE_PREFIX}-nghttp2")
_gnutls_depends=("${MINGW_PACKAGE_PREFIX}-gnutls")
makedepends=("${MINGW_PACKAGE_PREFIX}-cc"
             "${MINGW_PACKAGE_PREFIX}-autotools"
             "${_cert_depends[@]}"
             "${_openssl_depends[@]}"
             "${_gnutls_depends[@]}")
depends=("${MINGW_PACKAGE_PREFIX}-gcc-libs"
         "${MINGW_PACKAGE_PREFIX}-c-ares"
         "${MINGW_PACKAGE_PREFIX}-brotli"
         "${MINGW_PACKAGE_PREFIX}-libidn2"
         "${MINGW_PACKAGE_PREFIX}-libpsl"
         "${MINGW_PACKAGE_PREFIX}-zlib"
         "${MINGW_PACKAGE_PREFIX}-zstd")
options=('staticlibs')
source=("https://github.com/curl/curl/releases/download/${_realname}-${pkgver//./_}/${_realname}-${pkgver}.tar.bz2"{,.asc}
        "pathtools.c"
        "pathtools.h"
        "0001-Make-cURL-relocatable.patch"
        "0002-Hack-make-relocation-work-inside-libexec-git-core-an.patch"
        "f2587854f9d7ff84fbae92a992a92bd89e80b562.patch")
sha256sums=('5d956a6a22b3c279f50c421ee5d3c9e9d660cb6f115dcf881b579e952130549c'
            'SKIP'
            'ebf471173f5ee9c4416c10a78760cea8afaf1a4a6e653977321e8547ce7bf3c0'
            '1585ef1b61cf53a2ca27049c11d49e0834683dfda798f03547761375df482a90'
            'f2a74ed774642fae3ca1a1302355b4a02604fca3ece29d405e44d7208de50e59'
            'a8c612c0f9d7ca984d1b3507bdc07cb69f6d396108b9ec1438e10a41778bec9a'
            '903591fe87ffe5e751b86ee4896c178eef90f7ad5bcc41b87ce675f956c0e954')
validpgpkeys=('27EDEAF22F3ABCEB50DB9A125CC908FDB71E12C2')  # Daniel Stenberg

if test -z "$WITHOUT_ALTERNATES"
then
	pkgname+=("${MINGW_PACKAGE_PREFIX}-${_realname}-openssl-alternate")
        pkgname+=("${MINGW_PACKAGE_PREFIX}-${_realname}-gnutls-alternate")
        pkgname+=("${MINGW_PACKAGE_PREFIX}-${_realname}-winssl-alternate")
fi

case "$WITHOUT_PDBS,$MSYSTEM" in
,CLANG*)
	pkgname+=("${MINGW_PACKAGE_PREFIX}-${_realname}-pdb")
        pkgname+=("${MINGW_PACKAGE_PREFIX}-${_realname}-gnutls-pdb")
        pkgname+=("${MINGW_PACKAGE_PREFIX}-${_realname}-winssl-pdb")
	options+=('!strip')
	STRIP=llvm-strip
	STRIP_OPTS=--strip-debug
	;;
,*)
	pkgname+=("${MINGW_PACKAGE_PREFIX}-${_realname}-pdb")
        pkgname+=("${MINGW_PACKAGE_PREFIX}-${_realname}-gnutls-pdb")
        pkgname+=("${MINGW_PACKAGE_PREFIX}-${_realname}-winssl-pdb")
	makedepends+=("${MINGW_PACKAGE_PREFIX}-cv2pdb")
	options+=('debug' '!strip')
	STRIP=cv2pdb
	GENTLE_DEBUGASSERT=t
	;;
*)
	options+=('strip')
esac

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

prepare() {
  test ! -d "${startdir}/../mingw-w64-pathtools" || {
    cmp "${startdir}/../mingw-w64-pathtools/pathtools.c" "${srcdir}/pathtools.c" &&
    cmp "${startdir}/../mingw-w64-pathtools/pathtools.h" "${srcdir}/pathtools.h"
  } || exit 1

  cd "${srcdir}/${_realname}-${pkgver}"
  cp -fHv "${srcdir}"/pathtools.[ch] lib/

  cat >lib/.checksrc <<EOF
disable ASSIGNWITHINCONDITION
disable ASTERISKNOSPACE
disable ASTERISKSPACE
disable BANNEDFUNC
disable BRACEELSE
disable BRACEPOS
disable COPYRIGHT
disable EQUALSPACE
disable IFDEFSINGLE
disable INDENTATION
disable LONGLINE
disable PLUSNOSPACE
disable SPACEBEFORECLOSE
disable SPACEBEFOREPAREN
EOF

  apply_patch_with_msg \
    0001-Make-cURL-relocatable.patch \
    0002-Hack-make-relocation-work-inside-libexec-git-core-an.patch \
    f2587854f9d7ff84fbae92a992a92bd89e80b562.patch \

  test -z "$GENTLE_DEBUGASSERT" || {
    # define `CURL_DEBUGASSERT()` to not abort
    grep -q '^#define CURL_DEBUGASSERT' lib/curl_setup.h ||
    sed -i '/^#ifdef CURL_DEBUGASSERT/i\
#undef CURL_DEBUGASSERT\
#define CURL_DEBUGASSERT(cond) ((void)((cond) || \\\
  fprintf(stderr, "Assertion failed: %s, file %s, line %d\\n",\\\
    #cond, __FILE__, __LINE__)))' lib/curl_setup.h
  }

  autoreconf -vfi
}

do_build() {
  _variant=$1
  _destdir="${srcdir}/build-${MSYSTEM}"
  if [ "${_variant}" != "-openssl" ]; then
    _destdir="${_destdir}${_variant}"
  fi
  local -a extra_config
  if check_option "debug" "y"; then
    extra_config+=( --enable-debug )
  else
    extra_config+=( --disable-debug )
  fi

  local -a _variant_config
  if [ "${_variant}" = "-winssl" ]; then
    _variant_config+=("--with-schannel")
    _variant_config+=('--without-nghttp2')
    _variant_config+=("--without-ca-bundle")
    _variant_config+=("--without-ca-path")
    _variant_config+=("--without-librtmp")
  elif [ "${_variant}" = "-gnutls" ]; then
    _variant_config+=("--with-default-ssl-backend=gnutls")
    _variant_config+=("--with-gnutls")
    _variant_config+=("--with-schannel")
    _variant_config+=('--without-nghttp2')
    _variant_config+=("--with-ca-bundle=${MINGW_PREFIX}/etc/ssl/certs/ca-bundle.crt")
    _variant_config+=("--without-librtmp")
  elif [ "${_variant}" = "-openssl" ]; then
    _variant_config+=("--with-default-ssl-backend=openssl")
    _variant_config+=("--with-openssl")
    _variant_config+=("--with-schannel")
    _variant_config+=("--with-ca-bundle=${MINGW_PREFIX}/etc/ssl/certs/ca-bundle.crt")
    _variant_config+=("--with-nghttp2=${MINGW_PREFIX}")
    _variant_config+=("--without-librtmp")
  fi

  case "$MSYSTEM" in CLANG*) export LDFLAGS="-Wl,-pdb=";; esac # Ensures that Clang generates PDB files

  msg2 "Building shared library"
  mkdir -p "${_destdir}-shared" && cd "${_destdir}-shared"
  ../${_realname}-${pkgver}/configure \
    --prefix=${MINGW_PREFIX} \
    --build=${MINGW_CHOST} \
    --host=${MINGW_CHOST} \
    --target=${MINGW_CHOST} \
    --disable-pthreads \
    --without-random \
    --disable-static \
    --enable-shared \
    --enable-sspi \
    --enable-ldap \
    --enable-ldaps \
	--enable-ntlm \
    --with-brotli \
    --with-ldap-lib=wldap32 \
    --with-libssh2 \
    --with-zstd \
    "${_variant_config[@]}" \
    "${extra_config[@]}"
# there's a bug with zsh completion generation script and Windows.
# curl has to be specified with the file extension.
  sed -i "s|\/curl > \$\@|\/curl\$\{EXEEXT\} > \$\@|" scripts/Makefile
  make
  case "${pkgname[@]}"
  in *pdb*)
    $STRIP $STRIP_OPTS lib/.libs/libcurl-4.dll
    $STRIP $STRIP_OPTS src/.libs/curl.exe
  esac
}

build() {
  do_build -openssl
  do_build -winssl
  do_build -gnutls
}

do_package() {
  cd "${srcdir}/build-${MSYSTEM}$1-shared"

  test pdb != "$2" || {
    install -d -m 755 "${pkgdir}${MINGW_PREFIX}/bin"
    install -m 755 lib/.libs/libcurl-4.pdb "${pkgdir}${MINGW_PREFIX}/bin"
    install -m 755 src/.libs/curl.pdb "${pkgdir}${MINGW_PREFIX}/bin"
    return
  }

  test alternate != "$2" || {
    install -d -m 755 "${pkgdir}${MINGW_PREFIX}/bin"
    infix=${1:--openssl}
    test -winssl != $infix || infix=-schannel # the name "winssl" was ill-considered ;-)
    install -m 755 lib/.libs/libcurl-4.dll "${pkgdir}${MINGW_PREFIX}/bin/libcurl$infix-4.dll"
    return
  }

  make DESTDIR="${pkgdir}" install

  local PREFIX_DEPS=$(cygpath -am ${MINGW_PREFIX})
  sed -s "s|${PREFIX_DEPS}|${MINGW_PREFIX}|g" -i ${pkgdir}${MINGW_PREFIX}/bin/curl-config
  sed -s "s|${PREFIX_DEPS}|${MINGW_PREFIX}|g" -i ${pkgdir}${MINGW_PREFIX}/lib/pkgconfig/libcurl.pc

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

package_curl() {
  depends=("${depends[@]}"
           "${_cert_depends[@]}"
           "${_openssl_depends[@]}")
  test alternate = "$1" ||
  conflicts=("${MINGW_PACKAGE_PREFIX}-${_realname}-winssl"
             "${MINGW_PACKAGE_PREFIX}-${_realname}-gnutls")

  # (Temporarily) force git-sdk-* to switch to the mingw-w64-curl-winssl
  # package because that package does not depend on OpenSSL, allowing Git for
  # Windows to upgrade to OpenSSL v3.* (which would otherwise break libcurl,
  # and therefore `git clone`, and therefore Git for Windows' SDK
  # synchronization, because that upgrade changes the OpenSSL DLL's file name).
  #
  # To allow Git's `http.sslBackend=openssl` to work, still, this code block
  # _actually_ overrides the `mingw-w64-curl` package with the
  # `-openssl-alternate` variant, and letting that variant depend on the
  # `-winssl` one. This effectively "force-upgrades" mingw-w64-curl with
  # mingw-w64-curl-winssl and mingw-w64-curl-openssl-alternate.
  #
  # The plan is to remove this override after Git for Windows' SDK has upgraded
  # to OpenSSL v3.* (the current idea being to do that about a week after Git
  # for Windows v2.41.0 has been released, i.e. to wait for a sort-of-idle
  # time).
  test alternate != "$*" || {
    depends+=("${MINGW_PACKAGE_PREFIX}-${_realname}-winssl")
    replaces=("${MINGW_PACKAGE_PREFIX}-${_realname}")
  }

  do_package "" "$@"
}

package_curl-winssl() {
  depends=("${depends[@]}"
           "${MINGW_PACKAGE_PREFIX}-libssh2-wincng")
  test alternate = "$1" ||
  provides=("${MINGW_PACKAGE_PREFIX}-${_realname}")
  test alternate = "$1" ||
  conflicts=("${MINGW_PACKAGE_PREFIX}-${_realname}"
             "${MINGW_PACKAGE_PREFIX}-${_realname}-gnutls")
  do_package -winssl "$@"
}

package_curl-gnutls() {
  test alternate = "$1" ||
  provides=("${MINGW_PACKAGE_PREFIX}-${_realname}")
  depends=("${depends[@]}"
           "${_cert_depends[@]}"
           "${_gnutls_depends[@]}")
  test alternate = "$1" ||
  conflicts=("${MINGW_PACKAGE_PREFIX}-${_realname}"
             "${MINGW_PACKAGE_PREFIX}-${_realname}-winssl")
  do_package -gnutls "$@"
}

package_curl-pdb() {
  package_curl pdb
}

package_curl-winssl-pdb() {
  package_curl-winssl pdb
}

package_curl-gnutls-pdb() {
  package_curl-gnutls pdb
}

package_curl-openssl-alternate() {
  package_curl alternate
}

package_curl-winssl-alternate() {
  package_curl-winssl alternate
}

package_curl-gnutls-alternate() {
  package_curl-gnutls alternate
}

# 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;
