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

_realname=make
# NOTE: The name of the target executable (_prog_name) MUST remain unchanged
#       when installed, otherwise GNU make's dll load feature in connection
#       with the target executable breaks.  The reason is that the executable
#       name is part of the import library (libgnumake-1.dll.a) used to link
#       customized dll's.
#       General information at https://www.gnu.org/software/make/manual/html_node/Loading-Objects.html#Loading-Objects.
_autotools=no
_prog_name=mingw32-make
pkgbase=mingw-w64-${_realname}
pkgname=("${MINGW_PACKAGE_PREFIX}-${_realname}")
pkgver=4.3
pkgrel=1
pkgdesc="GNU make utility to maintain groups of programs (mingw-w64)"
arch=('any')
mingw_arch=('mingw32' 'mingw64' 'ucrt64' 'clang64' 'clang32')
url="https://www.gnu.org/software/make"
license=('GPL3')
groups=("${MINGW_PACKAGE_PREFIX}-toolchain")
depends=("${MINGW_PACKAGE_PREFIX}-gettext")
makedepends=('wget')
source=("https://ftp.gnu.org/gnu/${_realname}/${_realname}-${pkgver}.tar.gz"
        'make-getopt.patch'
        'make-linebuf-mingw.patch'
        'make-4.3_undef-HAVE_STRUCT_DIRENT_D_TYPE.patch'
        'make-4.2.1-Makefile.am-gcc-only-link-libgnumake-1.dll.a.patch'
        'make-check-load-feature.mak'
        'mk_temp.c')
sha256sums=('e05fdde47c5f7ca45cb697e973894ff4f5d79e13b750ed57d7b66d8defc78e19'
            '15a86d5143c9ec6337bdd69fecb7c33c36e4fd925528dc1498b0bc4fbd31b0bb'
            'cbb8c0a1bdd6e8174febce01946bd42da26dfcb73a7338c0a1df89ac6b8e157b'
            '5d71fccedb80e4713ed5a0cf73ca79d66f29894eeb6ad4b02037edecf81c2444'
            '85f8c3c555079026f3debab350c9ee27a717cdd08eca3f8bf9ac58e78544d21d'
            '3d6ece384425ff1c3f691efeb7c97e89bb11825bb6648995552dfcb52afe661d'
            '61d4f57c311cf2e27ccf4d1da847216730f304cf17c5c386721182ffe2d4b1aa')


# helper function
get_exe_dir() {
  if test ${_autotools} = yes; then
     echo "${srcdir}/build-${MINGW_CHOST}"
  else
    echo "${srcdir}/${_realname}-${pkgver}/GccRel"
  fi
}


prepare() {
  cd ${srcdir}/${_realname}-${pkgver}

  pushd src
    patch -p1 -i ${srcdir}/make-getopt.patch
    patch -p1 -i ${srcdir}/make-linebuf-mingw.patch
    patch -p2 -i ${srcdir}/make-4.3_undef-HAVE_STRUCT_DIRENT_D_TYPE.patch
  popd

  if test "${_autotools}" = "yes"; then
    patch -p1 -i ${srcdir}/make-4.2.1-Makefile.am-gcc-only-link-libgnumake-1.dll.a.patch
    # 1 - The import library libgnumake-1.dll.a contains the name of the program to be
    #     installed.  This requires autotools to be informed about the installed program
    #     name in case it is different from the standard name 'make' hardcoded in the GNU
    #     Make package.
    # 2 - automake requires hardcoded program names in any Makefile.am, i.e. in the
    #     variable bin_PROGRAMS and the induced variables derived from the program
    #     name.  We use sed to change the program name from 'make' to the customized
    #     name in Makefile.am, if different from 'make'.
    # 3 - After packaging we run a test if the dll load feature for the installed
    #     program works.  See function 'package()'.
    if test ${_prog_name} != make; then
      msg2 "Changing the program name from 'make' to '${_prog_name}' in Makefile.am."
    test -f Makefile.am.orig || mv Makefile.am Makefile.am.orig
    local _prog_name_am=${_prog_name//[^a-zA-Z0-9@]/_}
      sed -e "/bin_PROGRAMS/ { s:\bmake\b:${_prog_name}:g };
              s:\bmake_\(SOURCES\|LDADD\|LDFLAGS\)\b:${_prog_name_am}_\1:g ;
              s:\bEXTRA_make_\([A-Z]\+\):EXTRA_${_prog_name_am}_\1:g ;" \
            Makefile.am.orig > Makefile.am
    # log the changes made to Makefile.am by sed
      diff -u Makefile.am.orig Makefile.am > Makefile.am.diff || true
      cat Makefile.am.diff
    fi
    autoreconf -vfi
  else
    sed "/^set MAKE=gnumake/ s/gnumake/${_prog_name}/" build_w32.bat > build_w32-PKGBUILD.bat
    # make sure that the batch file has CRLF as EOL for reliable processing by cmd
    unix2dos build_w32-PKGBUILD.bat
  fi
}

build() {
  if test "${_autotools}" = "yes"; then
    mkdir -vp build-${MINGW_CHOST}
    cd build-${MINGW_CHOST}
    ../${_realname}-${pkgver}/configure \
      -C \
      --prefix=${MINGW_PREFIX} \
      --host=${MINGW_CHOST} \
      --without-libintl-prefix \
      --without-libiconv-prefix \
      CPPFLAGS=-DMAKE_LOAD \
      CFLAGS=-mthreads \
      ac_cv_dos_paths=yes
    make -j1
  else
    cd ${srcdir}/${_realname}-${pkgver}
    ./build_w32-PKGBUILD.bat --without-guile gcc
  fi
}

check() {
  _exe_dir=$(get_exe_dir)
  msg "Checking if GNU Make's dll loading feature we compiled into ${_prog_name}.exe works ..."
  cd "${srcdir}"
  rm -fv ./*.dll
  if "${_exe_dir}"/${_prog_name}.exe -f ./make-check-load-feature.mak \
      --debug=v \
      CFLAGS="-I${srcdir}/${_realname}-${pkgver}/src" \
      LIBS="${_exe_dir}/libgnumake-1.dll.a"
  then
    msg2 "PASSED"
  else
    error "FAILED"
    exit 1
  fi
}

package() {
  _exe_dir=$(get_exe_dir)
  mkdir -pv "${pkgdir}${MINGW_PREFIX}"/{bin,lib,include}
  cd "${srcdir}/${_realname}-${pkgver}"
  cp -fv "${_exe_dir}/${_prog_name}.exe"                    "${pkgdir}${MINGW_PREFIX}/bin/"
  cp -fv "${_exe_dir}/libgnumake-1.dll.a"                   "${pkgdir}${MINGW_PREFIX}/lib/"
  cp -fv "${srcdir}/${_realname}-${pkgver}/src/gnumake.h"   "${pkgdir}${MINGW_PREFIX}/include/"
}
