####
#
# Based on packages found at these URLs
#     https://www.archlinux.org/packages/extra/i686/wxgtk-common/
#     https://github.com/Alexpux/MINGW-packages/tree/master/mingw-w64-wxWidgets
#
# Maintainer: Tim S <stahta01@gmail.com>
#
####
# Normal 64 bit build command
#   MINGW_ARCH=mingw64 makepkg-mingw -sLf

_basename=wxWidgets
_realname=wxmsw
_wx_basever=3.1
# Example _wx_buildver value is "-rc"
_wx_buildver=

pkgbase=mingw-w64-${_basename}${_wx_basever}
pkgname="${MINGW_PACKAGE_PREFIX}-${_realname}${_wx_basever}"
pkgver=${_wx_basever}.5
pkgrel=2
pkgdesc="A C++ library that lets developers create applications for Windows, Linux and UNIX (mingw-w64)"
arch=('any')
mingw_arch=('mingw32' 'mingw64' 'ucrt64' 'clang64' 'clang32')
url="https://wxwidgets.org/"
license=('custom:wxWindows')
makedepends=(
  "make"
  "patch"
  "${MINGW_PACKAGE_PREFIX}-libpng"
  "${MINGW_PACKAGE_PREFIX}-libjpeg-turbo"
  "${MINGW_PACKAGE_PREFIX}-libtiff"
)
options=('strip' 'staticlibs' 'buildflags' '!debug')
source=(
  https://github.com/wxWidgets/wxWidgets/releases/download/v${pkgver}${_wx_buildver}/${_basename}-${pkgver}${_wx_buildver}.tar.bz2

  # This patch is a MSys2 run-time patch
  001-wxWidgets-3.0.2-relocate-prefix-in-bin-wx-config.patch

  # the wxTeam rejected this patch
  005-wxWidgets-3.1.3-Remove-WX_LIBS_STATIC-from-m4.patch

  # Patches that I hope to have added to git master branch
  023-wxWidgets-3.1.2-setup-wxUSE_GRAPHICS_DIRECT2D.patch
)
sha256sums=('d7b3666de33aa5c10ea41bb9405c40326e1aeb74ee725bb88f90f1d50270a224'
            '7c3b8f6ba275a448a5e82d64c4914acd5aefb8bbb952389688f3e7167a787c56'
            '4a4828f0c9cdc638cffde6a30b5dfb14283719acc9e89e19de8ec2d5a80a5aec'
            '760d45a284b56c0cd87c834cd7346e70c11ada51035a3ff7f6984fceccfdb932')
prepare() {
  cd "${srcdir}"/${_basename}-${pkgver}${_wx_buildver}

  # Fix MSys2 Run-Time wx-config bug.
  patch -p1 -i "${srcdir}"/001-wxWidgets-3.0.2-relocate-prefix-in-bin-wx-config.patch

  # This patch is not really needed; but, WX_LIBS_STATIC does not work correctly under MSys2
  # Removed it to see if anything breaks or if anything is fixed.
  patch -p1 -i "${srcdir}"/005-wxWidgets-3.1.3-Remove-WX_LIBS_STATIC-from-m4.patch

  patch -p1 -i "${srcdir}"/023-wxWidgets-3.1.2-setup-wxUSE_GRAPHICS_DIRECT2D.patch
}

build() {
  ####
  # Configure options added to support other software:
  #   --enable-graphics_ctx     codelite
  #
  # Configure options added to check for build issues
  #   --disable-precomp-headers
  #
  # Configure options added to avoid possible future issues
  #   --with-cxx=14
  #   --enable-std_string
  #
  # Configure options added to avoid warnings:
  #   --with-regex=builtin
  #
  # Configure options known to cause build errors:
  #   --disable-regkey                                compile error
  #
  # Configure options believed to reduce code size or build time:
  #   --without-opengl
  #   --without-subdirs
  #   --disable-webview
  #   --disable-mediactrl
  ####

# Remove the -O and -g options to avoid configuration warnings
# from the normal settings found in /etc/makepkg_mingw??.conf
  unset CFLAGS
  unset CXXFLAGS
  CFLAGS="-march=${CARCH} -mtune=generic -pipe"
  CXXFLAGS="-march=${CARCH} -mtune=generic -pipe"
  #echo "CXXFLAGS := ${CXXFLAGS}"

  local -a _debug_options=()

  if check_option "debug" "y"; then
    _debug_options+=("--enable-debug=yes")
    _debug_options+=("--enable-debug_gdb")
  else
    _debug_options+=("--enable-optimise")
  fi

  #echo "_debug_options := ${_debug_options[@]}"

  # Hack for clang32 in CI
  if [[ -n "${CI}" && "${MSYSTEM}" == "CLANG32" ]]; then
    unset MAKEFLAGS
  fi

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

  ../${_basename}-${pkgver}${_wx_buildver}/configure \
    --prefix=${MINGW_PREFIX} \
    --host=${MINGW_CHOST} \
    --target=${MINGW_CHOST} \
    --build=${MINGW_CHOST} \
    "${_debug_options[@]}" \
    --enable-shared \
    --enable-std_string \
    --enable-iff \
    --enable-permissive \
    --enable-unicode \
    --enable-graphics_ctx \
    --enable-accessibility \
    --disable-monolithic \
    --disable-precomp-headers \
    --with-msw \
    --with-cxx=14 \
    --with-opengl \
    --with-libpng=sys \
    --with-libjpeg=sys \
    --with-libtiff=sys \
    --with-regex=builtin

  make #VERBOSE=1


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

  ../${_basename}-${pkgver}${_wx_buildver}/configure \
    --prefix=${MINGW_PREFIX} \
    --host=${MINGW_CHOST} \
    --target=${MINGW_CHOST} \
    --build=${MINGW_CHOST} \
    "${_debug_options[@]}" \
    --disable-shared \
    --enable-std_string \
    --enable-iff \
    --enable-permissive \
    --enable-unicode \
    --enable-graphics_ctx \
    --enable-accessibility \
    --disable-monolithic \
    --disable-precomp-headers \
    --with-msw \
    --with-cxx=14 \
    --with-opengl \
    --with-libpng=sys \
    --with-libjpeg=sys \
    --with-libtiff=sys \
    --with-regex=builtin

  make #VERBOSE=1 -j1
}

#check() {
  #cd "${srcdir}/build-${CARCH}-shared/tests"    && make -k --jobs=1 || true

  #cd "${srcdir}/build-${CARCH}-shared/samples"  && make -k --jobs=1 || true
#}

package() {
  pkgdesc="A C++ library that lets developers create applications for Windows, Linux and UNIX (mingw-w64)"
  provides=("${MINGW_PACKAGE_PREFIX}-wxWidgets${_wx_basever}")
  conflicts=("${MINGW_PACKAGE_PREFIX}-wxWidgets${_wx_basever}")
  depends=(
    "${MINGW_PACKAGE_PREFIX}-gcc-libs"
    "${MINGW_PACKAGE_PREFIX}-expat"
    "${MINGW_PACKAGE_PREFIX}-libjpeg-turbo"
    "${MINGW_PACKAGE_PREFIX}-libpng"
    "${MINGW_PACKAGE_PREFIX}-libtiff"
    "${MINGW_PACKAGE_PREFIX}-xz"
    "${MINGW_PACKAGE_PREFIX}-zlib"
  )

  cd "${srcdir}"/build-${CARCH}-static
  make DESTDIR="${pkgdir}" install

  cd "${srcdir}"/build-${CARCH}-shared
  make DESTDIR="${pkgdir}" install

  # Rename files
  mv ${pkgdir}${MINGW_PREFIX}/bin/wx-config{,-${_wx_basever}}
  mv ${pkgdir}${MINGW_PREFIX}/share/aclocal/wxwin.m4 ${pkgdir}${MINGW_PREFIX}/share/aclocal/wxwin${_wx_basever}.m4

  # Add missing exe file extension (Likely bug in wxWidgets makefile)
  mv ${pkgdir}${MINGW_PREFIX}/bin/wxrc-${_wx_basever} ${pkgdir}${MINGW_PREFIX}/bin/wxrc-${_wx_basever}.exe

  # Remove conflicting files; that do NOT need to be renamed.
  rm -f ${pkgdir}${MINGW_PREFIX}/bin/wxrc.exe
  rm -f ${pkgdir}${MINGW_PREFIX}/bin/wx-config

  # Remove conflicting files; that I have no idea how to rename
  rm -fr ${pkgdir}${MINGW_PREFIX}/share/bakefile
  rm -fr ${pkgdir}${MINGW_PREFIX}/share/locale

  # License files
  cd "${srcdir}"/${_basename}-${pkgver}${_wx_buildver}/docs
  install -Dm644 preamble.txt "${pkgdir}${MINGW_PREFIX}/share/licenses/${_basename}${_wx_basever}/preamble.txt"
  install -Dm644 licence.txt  "${pkgdir}${MINGW_PREFIX}/share/licenses/${_basename}${_wx_basever}/licence.txt"
  install -Dm644 licendoc.txt "${pkgdir}${MINGW_PREFIX}/share/licenses/${_basename}${_wx_basever}/licendoc.txt"
  install -Dm644 lgpl.txt     "${pkgdir}${MINGW_PREFIX}/share/licenses/${_basename}${_wx_basever}/lgpl.txt"
  install -Dm644 gpl.txt      "${pkgdir}${MINGW_PREFIX}/share/licenses/${_basename}${_wx_basever}/gpl.txt"
  install -Dm644 xserver.txt  "${pkgdir}${MINGW_PREFIX}/share/licenses/${_basename}${_wx_basever}/xserver.txt"
}
