# Template file for 'cross-x86_64-w64-mingw32'
pkgname=cross-x86_64-w64-mingw32
version=10.0.0
revision=1
_gcc_version=12.2.0
_binutils_version=2.39
_gmp_version=6.2.1
_mpfr_version=4.1.0
_mpc_version=1.2.1
_isl_version=0.24
_mingw_version="${version}"
create_wrksrc=yes
hostmakedepends="tar flex perl texinfo"
makedepends="zlib-devel"
# it's ok to build with current's -devel packages
# although it might break the package during compiler updates
#makedepends="zlib-devel gmp-devel mpfr-devel libmpc-devel isl15-devel"
depends="cross-x86_64-w64-mingw32-crt-${version}_${revision}"
short_desc="Cross toolchain for Win64 (GCC ${_gcc_version})"
maintainer="Aleksey Tulinov <aleksey.tulinov@gmail.com>"
license="GPL-2.0-or-later, GPL-3.0-or-later, ZPL-2.1"
homepage="https://sourceforge.net/projects/mingw-w64/"
distfiles="
 ${GNU_SITE}/binutils/binutils-${_binutils_version}.tar.xz
 ${GNU_SITE}/gcc/gcc-${_gcc_version}/gcc-${_gcc_version}.tar.xz
 ${GNU_SITE}/mpc/mpc-${_mpc_version}.tar.gz
 ${GNU_SITE}/gmp/gmp-${_gmp_version}.tar.xz
 ${GNU_SITE}/mpfr/mpfr-${_mpfr_version}.tar.xz
 ${SOURCEFORGE_SITE}/libisl/isl-${_isl_version}.tar.bz2
 ${SOURCEFORGE_SITE}/project/mingw-w64/mingw-w64/mingw-w64-release/mingw-w64-v${_mingw_version}.tar.bz2"
checksum="645c25f563b8adc0a81dbd6a41cffbf4d37083a382e02d5d3df4f65c09516d00
 e549cf9cf3594a00e27b6589d4322d70e0720cdd213f39beb4181e06926230ff
 17503d2c395dfcf106b622dc142683c1199431d095367c6aacba6eec30340459
 fd4829912cddd12f84181c3451cc752be224643e87fac497b69edddadc49b4f2
 0c98a3f1732ff6ca4ea690552079da9c597872d30e96ec28414ee23c95558a7f
 fcf78dd9656c10eb8cf9fbd5f59a0b6b01386205fe1934b3b287a0a1898145c0
 ba6b430aed72c63a3768531f6a3ffc2b0fde2c57a3b251450dcf489a894f0894"

nocross=yes
nopie=yes
nodebug=yes
noverifyrdeps=yes
noshlibprovides=yes
lib32disabled=yes  # disable build of 32bits packages
nostrip_files="libgcc.a libgcc_eh.a libgcc_s.a libgcov.a
 libatomic.a libatomic.dll.a libquadmath.a libquadmath.dll.a
 libssp.a libssp.dll.a libssp_nonshared.a
 libstdc++.a libstdc++.dll.a libstdc++fs.a libsupc++.a"

# https://sourceforge.net/p/mingw-w64/wiki2/Cross%20Win32%20and%20Win64%20compiler/
# https://gcc.gnu.org/install/configure.html
# http://mingw-w64.org/doku.php/configure

_binutils_build() {
	_target=$1
	_sysroot="/usr/${_target}"
	_builddir=${wrksrc}/"build-binutils-${_target}"

	msg_normal "Building binutils: ${_target}\n"

	mkdir -p ${_builddir} && cd ${_builddir}

	../binutils-${_binutils_version}/configure \
		--prefix="/usr" \
		--with-sysroot=${_sysroot} \
		--target=${_target} \
		--disable-multilib \
		--disable-shared \
		--disable-nls \
		--disable-werror \
		--enable-lto \
		--with-system-zlib

	make ${makejobs} && make install
}

_mingw_headers() {
	_target=$1
	_sysroot="/usr/${_target}"
	_builddir=${wrksrc}/"build-mingw-headers-${_target}"

	msg_normal "Building MinGW headers: ${_target}\n"

	mkdir -p ${_builddir} && cd ${_builddir}

	../mingw-w64-v${_mingw_version}/mingw-w64-headers/configure \
		--prefix=${_sysroot} \
		--host=${_target} \
		--disable-werror \
		--enable-secure-api \
		--enable-sdk=all

	make ${makejobs} && make install

	# manually create required symlinks
	(cd ${_sysroot} && ln -sfT "." "mingw")
	(cd ${_sysroot} && ln -sf "lib" "lib64")
}

_gcc_bootstrap() {
	_target=$1
	_sysroot="/usr/${_target}"
	_builddir=${wrksrc}/"build-gcc-${_target}"

	msg_normal "Building GCC bootsrap: ${_target}\n"

	# not needed when using current's -devel packages
	ln -sf ${wrksrc}/"gmp-${_gmp_version}" ${wrksrc}/"gcc-${_gcc_version}/gmp"
	ln -sf ${wrksrc}/"mpc-${_mpc_version}" ${wrksrc}/"gcc-${_gcc_version}/mpc"
	ln -sf ${wrksrc}/"mpfr-${_mpfr_version}" ${wrksrc}/"gcc-${_gcc_version}/mpfr"
	ln -sf ${wrksrc}/"isl-${_isl_version}" ${wrksrc}/"gcc-${_gcc_version}/isl"

	mkdir -p ${_builddir} && cd ${_builddir}

	../gcc-${_gcc_version}/configure \
		--prefix="/usr" \
		--with-sysroot=${_sysroot} \
		--target=${_target} \
		--disable-werror \
		--disable-nls \
		--disable-multilib \
		--disable-gcov \
		--disable-libcc1 \
		--enable-lto \
		--enable-shared \
		--enable-static \
		--enable-threads=posix \
		--with-system-zlib \
		--enable-languages=c,c++,lto

	make ${makejobs} all-gcc && make install-gcc
}

_mingw_crt_build() {
	_target=$1
	_sysroot="/usr/${_target}"
	_builddir=${wrksrc}/"build-mingw-crt-${_target}"

	msg_normal "Building MinGW CRT: ${_target}\n"

	if [ ${_target} == "i686-w64-mingw32" ]; then
		_crt_configure_args="--disable-lib64 --enable-lib32"
	elif [ ${_target} == "x86_64-w64-mingw32" ]; then
		_crt_configure_args="--disable-lib32 --enable-lib64"
	fi

	mkdir -p ${_builddir} && cd ${_builddir}

	CC="${_target}-gcc" \
	CPP="${_target}-gcc -E" \
	AR="${_target}-ar" \
	RANLIB="${_target}-ranlib" \
	AS="${_target}-as" \
	STRIP="${_target}-strip" \
	OBJDUMP="${_target}-objdump" \
	WINDRES="${_target}-windres" \
	../mingw-w64-v${_mingw_version}/mingw-w64-crt/configure \
		--prefix=${_sysroot} \
		--host=${_target} \
		${_crt_configure_args}

	make ${makejobs} && make install
}

_mingw_winpthreads_build() {
	_target=$1
	_sysroot="/usr/${_target}"
	_builddir=${wrksrc}/"build-mingw-winpthreads-${_target}"

	msg_normal "Building MinGW winpthreads: ${_target}\n"

	mkdir -p ${_builddir} && cd ${_builddir}

	CC="${_target}-gcc" \
	CPP="${_target}-gcc -E" \
	AR="${_target}-ar" \
	RANLIB="${_target}-ranlib" \
	AS="${_target}-as" \
	STRIP="${_target}-strip" \
	OBJDUMP="${_target}-objdump" \
	WINDRES="${_target}-windres" \
	../mingw-w64-v${_mingw_version}/mingw-w64-libraries/winpthreads/configure \
		--prefix=${_sysroot} \
		--host=${_target} \
		--enable-static \
		--enable-shared

	make ${makejobs} && make install
}

_gcc_build() {
	_target=$1
	_sysroot="/usr/${_target}"
	_builddir=${wrksrc}/"build-gcc-${_target}"

	msg_normal "Building GCC: ${_target}\n"

	cd ${_builddir}

	# should be already configured previously
	# no need for install since this is the last step
	make ${makejobs}
}

_build_cross() {
	# ensure we use sane environment
	unset CC CXX CPP LD AS AR RANLIB OBJDUMP READELF NM
	unset STRIP OBJDUMP WINDRES
	unset CFLAGS CXXFLAGS CPPFLAGS LDFLAGS

	_target=$1

	(_binutils_build ${_target})
	(_mingw_headers ${_target})
	(_gcc_bootstrap ${_target})
	(_mingw_crt_build ${_target})
	(_mingw_winpthreads_build ${_target})
	(_gcc_build ${_target})
}

do_build() {
	(_build_cross "x86_64-w64-mingw32")
	(_build_cross "i686-w64-mingw32")
}

_install_toolchain() {
	_target=$1

	(cd ${wrksrc}/"build-binutils-${_target}" && DESTDIR="$DESTDIR" make install)
	(cd ${wrksrc}/"build-gcc-${_target}" && DESTDIR="$DESTDIR" make install)

	# remove unnecessary stuff
	rm -rf ${DESTDIR}/usr/share/
	rm -rf ${DESTDIR}/usr/lib/libcc1*
	rm -f ${DESTDIR}/usr/lib/bfd-plugins/libdep.*
}

_install_crt() {
	_target=$1

	(cd ${wrksrc}/"build-mingw-headers-${_target}" && DESTDIR="$DESTDIR" make install)
	(cd ${wrksrc}/"build-mingw-crt-${_target}" && DESTDIR="$DESTDIR" make install)
	(cd ${wrksrc}/"build-mingw-winpthreads-${_target}" && DESTDIR="$DESTDIR" make install)
}

do_install() {
	(_install_toolchain "x86_64-w64-mingw32")
	# i686 version will be installed in subpackage (below)
}

_clean_cross() {
	_target=$1

	rm -rf /usr/${_target}
	rm -f  /usr/bin/${_target}*
	rm -rf /usr/lib/gcc/${_target}
	rm -rf /usr/libexec/gcc/${_target}
}

do_clean() {
	(_clean_cross "x86_64-w64-mingw32")
	(_clean_cross "i686-w64-mingw32")
}

cross-x86_64-w64-mingw32-crt_package() {
	short_desc="CRT for Win64 cross toolchain"
	nopie=yes
	nodebug=yes
	# this subpackage exists to skip strip step on CRT files
	nostrip=yes
	noverifyrdeps=yes
	noshlibprovides=yes
	lib32disabled=yes
	pkg_install() {
		DESTDIR="$PKGDESTDIR" _install_crt "x86_64-w64-mingw32"
	}
}

cross-i686-w64-mingw32_package() {
	short_desc="Cross toolchain for Win32 (GCC ${_gcc_version})"
	depends="cross-i686-w64-mingw32-crt-${version}_${revision}"
	nopie=yes
	nodebug=yes
	noverifyrdeps=yes
	noshlibprovides=yes
	lib32disabled=yes
	nostrip_files="libgcc.a libgcc_eh.a libgcc_s.a libgcov.a
	 libatomic.a libatomic.dll.a libquadmath.a libquadmath.dll.a
	 libssp.a libssp.dll.a libssp_nonshared.a
	 libstdc++.a libstdc++.dll.a libstdc++fs.a libsupc++.a"
	pkg_install() {
		DESTDIR="$PKGDESTDIR" _install_toolchain "i686-w64-mingw32"
	}
}

cross-i686-w64-mingw32-crt_package() {
	short_desc="CRT for Win32 cross toolchain"
	nopie=yes
	nodebug=yes
	nostrip=yes
	noverifyrdeps=yes
	noshlibprovides=yes
	lib32disabled=yes
	pkg_install() {
		DESTDIR="$PKGDESTDIR" _install_crt "i686-w64-mingw32"
	}
}
