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

_realname=qt6-base
pkgbase=mingw-w64-${_realname}
pkgname=("${MINGW_PACKAGE_PREFIX}-${_realname}"
         "${MINGW_PACKAGE_PREFIX}-${_realname}-debug")
_qtver=6.10.0
pkgver=${_qtver/-/}
pkgrel=1
pkgdesc="A cross-platform application and UI framework (mingw-w64)"
arch=(any)
mingw_arch=('mingw64' 'ucrt64' 'clang64' 'clangarm64')
url='https://www.qt.io'
msys2_repository_url="https://code.qt.io/cgit/qt/qtbase.git"
msys2_references=(
  'archlinux: qt6-base'
  "cpe: cpe:/a:qt:qt"
)
license=('spdx:LGPL-3.0-only WITH Qt-GPL-exception-1.0 AND AFL-2.1 AND Apache-2.0 AND BSL-1.0 AND CC0-1.0 AND BSD-3-Clause AND CC-BY-4.0 AND GFDL-1.3-no-invariants-only AND GPL-2.0-only AND GPL-2.0-or-later AND GPL-3.0-only AND custom')
makedepends=("${MINGW_PACKAGE_PREFIX}-cc"
             "${MINGW_PACKAGE_PREFIX}-cmake"
             "${MINGW_PACKAGE_PREFIX}-ninja"
             "${MINGW_PACKAGE_PREFIX}-pkgconf"
             #"${MINGW_PACKAGE_PREFIX}-cppwinrt" breaks building qt6-multimedia ffmpeg plugin
             # qtmultimedia-everywhere-src-6.10.0/src/plugins/multimedia/ffmpeg/qffmpegwindowcapture_uwp.cpp:35:10: fatal error: 'windows.graphics.directx.direct3d11.interop.h' file not found
             # 35 | #include <windows.graphics.directx.direct3d11.interop.h>
             #    |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             # 1 error generated.
             "${MINGW_PACKAGE_PREFIX}-dbus"
             "${MINGW_PACKAGE_PREFIX}-double-conversion"
             "${MINGW_PACKAGE_PREFIX}-freetype"
             "${MINGW_PACKAGE_PREFIX}-glib2"
             "${MINGW_PACKAGE_PREFIX}-harfbuzz"
             "${MINGW_PACKAGE_PREFIX}-icu"
             "${MINGW_PACKAGE_PREFIX}-libb2"
             "${MINGW_PACKAGE_PREFIX}-libjpeg-turbo"
             "${MINGW_PACKAGE_PREFIX}-libpng"
             "${MINGW_PACKAGE_PREFIX}-md4c"
             "${MINGW_PACKAGE_PREFIX}-openssl"
             "${MINGW_PACKAGE_PREFIX}-pcre2"
             "${MINGW_PACKAGE_PREFIX}-sqlite3"
             "${MINGW_PACKAGE_PREFIX}-zlib"
             "${MINGW_PACKAGE_PREFIX}-zstd"
             "${MINGW_PACKAGE_PREFIX}-xmlstarlet"
             "${MINGW_PACKAGE_PREFIX}-vulkan-loader"
             "${MINGW_PACKAGE_PREFIX}-vulkan-headers"
             "${MINGW_PACKAGE_PREFIX}-firebird"
             "${MINGW_PACKAGE_PREFIX}-libmariadbclient"
             "${MINGW_PACKAGE_PREFIX}-postgresql"
             "rsync")
_pkgfn="${_realname/6-/}-everywhere-src-${_qtver}"
source=("https://download.qt.io/official_releases/qt/${pkgver%.*}/${_qtver}/submodules/${_pkgfn}.tar.xz"
        001-appending-qt6-to-remove-qt5-conflict.patch
        002-fix-qtdocs-helpers-cmake.patch
        003-adjust-qmake-conf-mingw.patch
        004-qt-6.2.0-win32-g-Add-QMAKE_EXTENSION_IMPORTLIB-defaulting-to-.patch
        005-qt-6.7.0-opengl-header.patch
        006-qt-6.2.0-dont-add-resource-files-to-qmake-libs.patch
        008-freetype-fonts-fallback-dir.patch
        009-qfileinfo-undefine-mingw-stat.patch
        010-export-some-constexpr-variables.patch
        011-qt6-windeployqt-fixes.patch)
sha256sums=('ead4623bcb54a32257c5b3e3a5aec6d16ec96f4cda58d2e003f5a0c16f72046d'
            'c9f61d90ba7bce89f935c3e8ea90c448a641fd206666ef2d1542f61a3a655fc9'
            '0dac4b7c07ed52367f55cb54df5aee6966601edc579861e2504701f04c509b9b'
            '68156b8b7717a0ce19c4b991942469171bfa048cd5c90765115a546e65669a1d'
            'ed5b61bcb367bbda459bec903d796ea45604278f577a988d602ade07ec6bf363'
            'a2afc74d181864409dc96eca368b647c0f79e25751db88e3263f2d1101edf8e4'
            '4085a10b290b8e3d930de535cbad2ba3e643432cba433aa2b28fe664f86d38a3'
            'e2fbd970a20773f0d914f6ffc96aafc8212192227577ec007a460e35398038bf'
            'f4261d43a142a24e5fa3b23e25813754839db84078cc8c6dc611139bf531e64a'
            '23656a7839d7dcb763d022722d723493c847914b0639bab861ddb05d823af5b7'
            '1d605fa3c9a9820ddc2858db84376bca0cf24f91a4c1ae92d0cdea618506c60b')

# Use the right mkspecs file
if [[ ${MINGW_PACKAGE_PREFIX} == *-clang-* ]]; then
  _platform=win32-clang-g++
else
  _platform=win32-g++
fi

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

prepare() {
  cd $srcdir/${_pkgfn}

  apply_patch_with_msg \
    001-appending-qt6-to-remove-qt5-conflict.patch \
    002-fix-qtdocs-helpers-cmake.patch \
    003-adjust-qmake-conf-mingw.patch \
    004-qt-6.2.0-win32-g-Add-QMAKE_EXTENSION_IMPORTLIB-defaulting-to-.patch \
    005-qt-6.7.0-opengl-header.patch \
    006-qt-6.2.0-dont-add-resource-files-to-qmake-libs.patch \
    008-freetype-fonts-fallback-dir.patch \
    009-qfileinfo-undefine-mingw-stat.patch \
    011-qt6-windeployqt-fixes.patch

  if [[ ${MINGW_PACKAGE_PREFIX} != *-clang-* ]]; then
    apply_patch_with_msg \
      010-export-some-constexpr-variables.patch
  fi

  local _ARCH_TUNE=
  if [[ ${CARCH} == x86_64 ]]; then
    _ARCH_TUNE="-march=nocona -msahf -mtune=generic"
  fi

  BIGOBJ_FLAGS="-Wa,-mbig-obj"

  # Append these ones ..
  sed -i "s|^QMAKE_CFLAGS .*= \(.*\)$|QMAKE_CFLAGS            = \1 ${_ARCH_TUNE} ${BIGOBJ_FLAGS}|g" mkspecs/${_platform}/qmake.conf
  sed -i "s|^QMAKE_CXXFLAGS .*= \(.*\)$|QMAKE_CXXFLAGS            = \1 ${_ARCH_TUNE} ${BIGOBJ_FLAGS}|g" mkspecs/${_platform}/qmake.conf
}

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

  if [[ ${CC} == clang ]]; then
    CXXFLAGS+=" -Wno-character-conversion"
  fi

  MSYS2_ARG_CONV_EXCL="-DCMAKE_INSTALL_PREFIX=" \
  ${MINGW_PREFIX}/bin/cmake \
    --log-level=STATUS \
    -GNinja \
    -DCMAKE_BUILD_TYPE=RelWithDebInfo \
    -DQT_QMAKE_TARGET_MKSPEC=${_platform} \
    -DCMAKE_INSTALL_PREFIX=${MINGW_PREFIX} \
    -DINSTALL_INCLUDEDIR=include/qt6 \
    -DINSTALL_ARCHDATADIR=share/qt6 \
    -DINSTALL_DATADIR=share/qt6 \
    -DINSTALL_MKSPECSDIR=share/qt6/mkspecs \
    -DINSTALL_DESCRIPTIONSDIR=share/qt6/modules \
    -DFEATURE_system_doubleconversion=ON \
    -DFEATURE_system_freetype=ON \
    -DFEATURE_system_jpeg=ON \
    -DFEATURE_system_harfbuzz=ON \
    -DFEATURE_system_pcre2=ON \
    -DFEATURE_system_png=ON \
    -DFEATURE_system_sqlite=ON \
    -DFEATURE_system_zlib=ON \
    -DFEATURE_zstd=ON \
    -DFEATURE_openssl=ON \
    -DFEATURE_opengl=ON \
    -DFEATURE_opengl_desktop=ON \
    -DFEATURE_dbus=ON \
    -DFEATURE_glib=ON \
    -DFEATURE_icu=ON \
    -DFEATURE_pkg_config=ON \
    -DFEATURE_vulkan=ON \
    -DFEATURE_sql_sqlite=ON \
    -DFEATURE_sql_psql=ON \
    -DFEATURE_sql_mysql=ON \
    -DFEATURE_sql_odbc=ON \
    -DFEATURE_sql_ibase=ON \
    -DFEATURE_gtk3=OFF \
    -DFEATURE_regularexpression=ON \
    -DFEATURE_cxx20=ON \
    -DFEATURE_cpp_winrt=OFF \
    -DFEATURE_force_debug_info=ON \
    -DFEATURE_separate_debug_info=ON \
    ../${_pkgfn}

  PATH=$PWD/bin:$PATH ${MINGW_PREFIX}/bin/cmake --build .
}

package_qt6-base() {
  depends=("${MINGW_PACKAGE_PREFIX}-double-conversion"
           "${MINGW_PACKAGE_PREFIX}-dbus"
           "${MINGW_PACKAGE_PREFIX}-freetype"
           "${MINGW_PACKAGE_PREFIX}-glib2"
           "${MINGW_PACKAGE_PREFIX}-harfbuzz"
           "${MINGW_PACKAGE_PREFIX}-icu"
           "${MINGW_PACKAGE_PREFIX}-libb2"
           "${MINGW_PACKAGE_PREFIX}-libjpeg-turbo"
           "${MINGW_PACKAGE_PREFIX}-libpng"
           "${MINGW_PACKAGE_PREFIX}-md4c"
           "${MINGW_PACKAGE_PREFIX}-openssl"
           "${MINGW_PACKAGE_PREFIX}-pcre2"
           "${MINGW_PACKAGE_PREFIX}-sqlite3"
           "${MINGW_PACKAGE_PREFIX}-vulkan-loader"
           "${MINGW_PACKAGE_PREFIX}-vulkan-headers"
           "${MINGW_PACKAGE_PREFIX}-zlib"
           "${MINGW_PACKAGE_PREFIX}-zstd")
  optdepends=("${MINGW_PACKAGE_PREFIX}-libmariadbclient: MySQL/MariaDB driver"
              "${MINGW_PACKAGE_PREFIX}-postgresql: PostgreSQL driver"
              "${MINGW_PACKAGE_PREFIX}-firebird: Firebird/iBase driver")
  groups=("${MINGW_PACKAGE_PREFIX}-qt6")

  DESTDIR="${pkgdir}" ${MINGW_PREFIX}/bin/cmake --install build-${MSYSTEM}

  install -d "$pkgdir${MINGW_PREFIX}"/share/licenses/${_realname}
  install -Dm644 $_pkgfn/LICENSES/* -t "$pkgdir${MINGW_PREFIX}"/share/licenses/${_realname}

  # Seperate debug-info files
  rsync -armR --remove-source-files --include="*/" --include="*.debug" --exclude="*" --prune-empty-dirs "${pkgdir}"/.${MINGW_PREFIX} "${srcdir}"/${MSYSTEM}-debug/

  # Restore qmake6, qtpaths6 and windeployqt6
  ln -s "${pkgdir}"${MINGW_PREFIX}/bin/qmake-qt6 "${pkgdir}"${MINGW_PREFIX}/bin/qmake6.exe
  ln -s "${pkgdir}"${MINGW_PREFIX}/bin/qtpaths-qt6 "${pkgdir}"${MINGW_PREFIX}/bin/qtpaths6.exe
  ln -s "${pkgdir}"${MINGW_PREFIX}/bin/windeployqt-qt6 "${pkgdir}"${MINGW_PREFIX}/bin/windeployqt6.exe

  # Fix *.pri, *.bat and *.cmake files
  local PREFIX_WIN=$(cygpath -m ${MINGW_PREFIX})
  find "${pkgdir}${MINGW_PREFIX}/share/qt6" -type f \( -name '*.pri' -o -name '*.bat' \) \
      -exec sed -i -e "s|${PREFIX_WIN}|${MINGW_PREFIX}|g" {} \;
  find "${pkgdir}${MINGW_PREFIX}/bin" -type f \( -name '*.bat' \) \
      -exec sed -i -e "s|${PREFIX_WIN}|${MINGW_PREFIX}|g" {} \;
  find "${pkgdir}${MINGW_PREFIX}/lib/cmake" -type f \( -name '*.cmake' \) \
      -exec sed -i -e "s|${PREFIX_WIN}|${MINGW_PREFIX}|g" {} \;
}

package_qt6-base-debug() {
  depends=("${MINGW_PACKAGE_PREFIX}-${_realname}")
  groups=("${MINGW_PACKAGE_PREFIX}-qt6-debug")
  options=('!strip')

  cp -rf "${srcdir}"/${MSYSTEM}-debug${MINGW_PREFIX} "${pkgdir}"/
}

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