# Maintainer: Alexey Pavlov <alexpux@gmail.com>
# Contributor: Ray Donnelly <mingw.android@gmail.com>

_realname=cmake
pkgbase=mingw-w64-${_realname}
pkgname=(
  "${MINGW_PACKAGE_PREFIX}-${_realname}"
  $([[ ${CARCH} == i686 ]] || echo \
    "${MINGW_PACKAGE_PREFIX}-ccmake" \
    "${MINGW_PACKAGE_PREFIX}-${_realname}-cmcldeps" \
    "${MINGW_PACKAGE_PREFIX}-${_realname}-gui" \
    "${MINGW_PACKAGE_PREFIX}-${_realname}-docs" \
  )
)
pkgver=4.4.0
_rc=""
_pkgver=${pkgver}${_rc}
pkgrel=1
pkgdesc="A cross-platform open-source make system"
arch=('any')
mingw_arch=('mingw32' 'mingw64' 'ucrt64' 'clang64' 'clangarm64')
url="https://www.cmake.org/"
msys2_repository_url="https://gitlab.kitware.com/cmake/cmake"
msys2_references=(
  'archlinux: cmake'
  "cpe: cpe:2.3:a:cmake_project:cmake"
)
msys2_ignore_vulnerabilities=(
  'CVE-2016-10642' # Only the npm package is affected
)
license=("spdx:MIT")
depends=(
  "${MINGW_PACKAGE_PREFIX}-cc-libs"
  "${MINGW_PACKAGE_PREFIX}-cppdap"
  "${MINGW_PACKAGE_PREFIX}-curl"
  "${MINGW_PACKAGE_PREFIX}-expat"
  "${MINGW_PACKAGE_PREFIX}-jsoncpp"
  "${MINGW_PACKAGE_PREFIX}-libarchive"
  "${MINGW_PACKAGE_PREFIX}-libuv"
  "${MINGW_PACKAGE_PREFIX}-ninja"
  "${MINGW_PACKAGE_PREFIX}-pkgconf"
  "${MINGW_PACKAGE_PREFIX}-rhash"
  "${MINGW_PACKAGE_PREFIX}-zlib"
)
makedepends=(
  "${MINGW_PACKAGE_PREFIX}-cc"
  "${MINGW_PACKAGE_PREFIX}-cmake-bootstrap"
  "${MINGW_PACKAGE_PREFIX}-bzip2"
  "${MINGW_PACKAGE_PREFIX}-xz"
  "${MINGW_PACKAGE_PREFIX}-zstd"
  $([[ ${CARCH} == i686 ]] || echo \
    "${MINGW_PACKAGE_PREFIX}-emacs" \
    "${MINGW_PACKAGE_PREFIX}-ncurses" \
    "${MINGW_PACKAGE_PREFIX}-python" \
    "${MINGW_PACKAGE_PREFIX}-python-sphinx" \
    "${MINGW_PACKAGE_PREFIX}-qt6-base" \
    "${MINGW_PACKAGE_PREFIX}-qt6-tools" \
  )
)
source=("https://github.com/Kitware/CMake/releases/download/v${_pkgver}/${_realname}-${_pkgver}.tar.gz"
        "0001-Disable-response-files-for-MSYS-Generator.patch"
        "0002-Do-not-install-Qt-bundle-in-cmake-gui.patch"
        "0003-fix-find-python-on-mingw-aarch64.patch"
        "0005-Default-to-ninja-generator.patch")
sha256sums=('65757f442fdd242e27f1728fc26dc0cba4164f7a0791a5c788631c00080369bc'
            '25793edcbac05bb6d17fa9947b52ace4a6b5ccccf7758e22ae9ae022ed089061'
            '07186453f5ca61c0ecffb0c389a850fa40b1882057ff626f0ff5f7183c7864c2'
            '934fedcea30e57fcf590d777d25decd8fa5d62166186cf464b089d5f59bf4f9d'
            '426818278090704d2a12f62ef3dfd94c47b11fa2784bb842989b7f6a09ee7aa2')

# Helper macros to help make tasks easier #
apply_patch_with_msg() {
  for _patch in "$@"
  do
    msg2 "Applying $_patch"
    patch -Np1 -i "${srcdir}/$_patch"
  done
}

prepare() {
  cd ${_realname}-${_pkgver}
  apply_patch_with_msg \
    0001-Disable-response-files-for-MSYS-Generator.patch \
    0002-Do-not-install-Qt-bundle-in-cmake-gui.patch \
    0003-fix-find-python-on-mingw-aarch64.patch

  # We want cmake to default to something useful and not MSVC
  apply_patch_with_msg \
    0005-Default-to-ninja-generator.patch

  find . -name "*.orig" -exec rm -f {} \;
}

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

  if [[ ${CARCH} != i686 ]]; then
    export PATH="${MINGW_PREFIX}/share/qt6/bin:$PATH"
    _extra_config+=(
      "-DSPHINX_HTML=ON"
      "-DSPHINX_MAN=ON"
      "-DSPHINX_QTHELP=ON"
      "-DBUILD_QtDialog=ON"
      "-DBUILD_CursesDialog=ON"
      "-DPython_EXECUTABLE=${MINGW_PREFIX}/bin/python")
  fi

  MSYS2_ARG_CONV_EXCL="-DCMAKE_INSTALL_PREFIX=" \
    cmake \
      -GNinja \
      "${_extra_config[@]}" \
      -DCMAKE_INSTALL_PREFIX=${MINGW_PREFIX} \
      -DCMake_INSTALL_COMPONENTS=ON \
      -DCMAKE_DATA_DIR=share/cmake \
      -DCMAKE_DOC_DIR=share/doc/cmake \
      -DCMAKE_MAN_DIR=share/man \
      -DCMAKE_INFO_DIR=share/info \
      -DCMAKE_USE_SYSTEM_LIBRARIES=ON \
      -DBUILD_TESTING=OFF \
      -S ${_realname}-${_pkgver} \
      -B build-${MSYSTEM}

  cmake --build build-${MSYSTEM}
}

check() {
  cmake -DBUILD_TESTING=ON -S ${_realname}-${_pkgver} -B build-${MSYSTEM}
  cmake --build build-${MSYSTEM}
  ctest --test-dir build-${MSYSTEM} -j$(($(nproc)+1)) || msg2 "Tests failed"
}

package_cmake() {
  pkgdesc+=" (mingw-w64)"
  if [[ ${CARCH} != i686 ]]; then
    optdepends=("${MINGW_PACKAGE_PREFIX}-emacs: for cmake emacs mode")
  fi

  DESTDIR="${pkgdir}" cmake --install build-${MSYSTEM} --component cmake
  DESTDIR="${pkgdir}" cmake --install build-${MSYSTEM} --component cpack
  DESTDIR="${pkgdir}" cmake --install build-${MSYSTEM} --component ctest
  DESTDIR="${pkgdir}" cmake --install build-${MSYSTEM} --component sphinx-man
  DESTDIR="${pkgdir}" cmake --install build-${MSYSTEM} --component Unspecified

  if [[ ${CARCH} != i686 ]]; then
    install -d "${pkgdir}${MINGW_PREFIX}"/share/emacs/site-lisp/
    emacs -batch -f batch-byte-compile \
      "${pkgdir}${MINGW_PREFIX}"/share/emacs/site-lisp/cmake-mode.el
  fi
}

package_cmake-cmcldeps() {
  pkgdesc="CMake wrapper for cl to extract dependencies (mingw-w64)"
  depends=("${MINGW_PACKAGE_PREFIX}-cmake")

  DESTDIR="${pkgdir}" cmake --install build-${MSYSTEM} --component cmcldeps
}

package_cmake-gui() {
  pkgdesc+=" (Qt GUI) (mingw-w64)"
  depends=("${MINGW_PACKAGE_PREFIX}-cmake"
           "${MINGW_PACKAGE_PREFIX}-qt6-base")

  DESTDIR="${pkgdir}" cmake --install build-${MSYSTEM} --component cmake-gui
}

package_ccmake() {
  pkgdesc+=" (curses GUI) (mingw-w64)"
  depends=("${MINGW_PACKAGE_PREFIX}-cmake")

  DESTDIR="${pkgdir}" cmake --install build-${MSYSTEM} --component ccmake
}

package_cmake-docs() {
  pkgdesc+=" (documentation) (mingw-w64)"
  depends=()
  conflicts=("${MINGW_PACKAGE_PREFIX}-cmake-doc-qt")
  replaces=("${MINGW_PACKAGE_PREFIX}-cmake-doc-qt")
  provides=("${MINGW_PACKAGE_PREFIX}-cmake-doc-qt")

  DESTDIR="${pkgdir}" cmake --install build-${MSYSTEM} --component sphinx-html
  DESTDIR="${pkgdir}" cmake --install build-${MSYSTEM} --component sphinx-qthelp
}

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