# Template file for 'gcc11'
# for gdc
pkgname=gcc11
version=11.5.0
revision=1
_majorver="${version%%.*}"
_minorver="${version%.*}"
build_style=gnu-configure
hostmakedepends="tar texinfo perl flex"
makedepends="zlib-devel libzstd-devel"
depends="binutils"
checkdepends="dejagnu"
short_desc="GNU Compiler Collection - version ${_majorver}"
maintainer="Đoàn Trần Công Danh <congdanhqx@gmail.com>"
license="GFDL-1.2-or-later, GPL-3.0-or-later, LGPL-2.1-or-later"
homepage="http://gcc.gnu.org"
_gmp_version=6.2.1
_mpfr_version=4.1.0
_mpc_version=1.2.1
_isl_version=0.24
distfiles="
 ${GNU_SITE}/gcc/gcc-${version}/gcc-${version}.tar.xz
 ${GNU_SITE}/gmp/gmp-${_gmp_version}.tar.xz
 ${GNU_SITE}/mpfr/mpfr-${_mpfr_version}.tar.xz
 ${GNU_SITE}/mpc/mpc-${_mpc_version}.tar.gz
 ${SOURCEFORGE_SITE}/libisl/isl-${_isl_version}.tar.bz2"
checksum="a6e21868ead545cf87f0c01f84276e4b5281d672098591c1c896241f09363478
 fd4829912cddd12f84181c3451cc752be224643e87fac497b69edddadc49b4f2
 0c98a3f1732ff6ca4ea690552079da9c597872d30e96ec28414ee23c95558a7f
 17503d2c395dfcf106b622dc142683c1199431d095367c6aacba6eec30340459
 fcf78dd9656c10eb8cf9fbd5f59a0b6b01386205fe1934b3b287a0a1898145c0"
nopie=yes
lib32disabled=yes
repository=bootstrap
skip_extraction="
 gmp-${_gmp_version}.tar.xz
 mpfr-${_mpfr_version}.tar.xz
 mpc-${_mpc_version}.tar.gz
 isl-${_isl_version}.tar.bz2
 "

if [ "$XBPS_TARGET_LIBC" = musl ]; then
	makedepends+=" libucontext-devel"
	export LIBUCONTEXT=-lucontext
	case "${XBPS_TARGET_MACHINE}" in
	armv[67]l-musl) depends+=" musl1.1-devel" ;;
	*) depends+=" musl-devel" ;;
	esac
else
	depends+=" glibc-devel"
fi

case "$XBPS_TARGET_MACHINE" in
	i686) _triplet="i686-pc-linux-gnu";;
	i686-musl) _triplet="i686-linux-musl";;
	x86_64) _triplet="x86_64-linux-gnu";;
	x86_64-musl) _triplet="x86_64-linux-musl";;
	armv5tel) _triplet="arm-linux-gnueabi";;
	armv5tel-musl) _triplet="arm-linux-musleabi";;
	armv6l) _triplet="arm-linux-gnueabihf";;
	armv7l) _triplet="armv7l-linux-gnueabihf";;
	armv6l-musl) _triplet="arm-linux-musleabihf";;
	armv7l-musl) _triplet="armv7l-linux-musleabihf";;
	aarch64) _triplet="aarch64-linux-gnu";;
	aarch64-musl) _triplet="aarch64-linux-musl";;
	ppc) _triplet="powerpc-linux-gnu";;
	ppc-musl) _triplet="powerpc-linux-musl";;
	ppcle) _triplet="powerpcle-linux-gnu";;
	ppcle-musl) _triplet="powerpcle-linux-musl";;
	ppc64le) _triplet="powerpc64le-linux-gnu";;
	ppc64le-musl) _triplet="powerpc64le-linux-musl";;
	ppc64) _triplet="powerpc64-linux-gnu";;
	ppc64-musl) _triplet="powerpc64-linux-musl";;
	mips-musl) _triplet="mips-linux-musl";;
	mipshf-musl) _triplet="mips-linux-muslhf";;
	mipsel-musl) _triplet="mipsel-linux-musl";;
	mipselhf-musl) _triplet="mipsel-linux-muslhf";;
esac

nocross="requires $_triplet-gdc"
if [ "$CROSS_BUILD" ]; then
	hostmakedepends+=" cross-${_triplet} gcc11-gdc"
fi

post_extract() {
	vsrcextract -C gmp gmp-${_gmp_version}.tar.xz
	vsrcextract -C mpfr mpfr-${_mpfr_version}.tar.xz
	vsrcextract -C mpc mpc-${_mpc_version}.tar.gz
	vsrcextract -C isl isl-${_isl_version}.tar.bz2
}

post_patch() {
	# _FORTIFY_SOURCE needs an optimization level.
	vsed -i '/ac_cpp=/s/[$]CPPFLAGS/$CPPFLAGS -O2/' {gcc,libiberty}/configure

	# Do not run fixincludes
	sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in

	if [ "$XBPS_TARGET_LIBC" = musl ]; then
		for p in ${FILESDIR}/*-musl.patch; do
			patch -Np1 -i $p
		done
	fi
}

do_configure() {
	local _args _hash
	_hash=gnu
	case "$XBPS_TARGET_MACHINE" in
		mipselhf-musl) _args+=" --with-arch=mips32r2 --with-float=hard"; _hash=sysv;;
		mipsel-musl) _args+=" --with-arch=mips32r2 --with-float=soft"; _hash=sysv;;
		mipshf-musl) _args+=" --with-arch=mips32r2 --with-float=hard";;
		mips-musl) _args+=" --with-arch=mips32r2 --with-float=soft";;
		armv5*) _args+=" --with-arch=armv5te --with-float=soft";;
		armv6l*) _args+=" --with-arch=armv6 --with-fpu=vfp --with-float=hard";;
		armv7l*) _args+=" --with-arch=armv7-a --with-fpu=vfpv3 --with-float=hard";;
		aarch64*) _args+=" --with-arch=armv8-a";;
		ppc64le*) _args+=" --with-abi=elfv2 --enable-secureplt --enable-targets=powerpcle-linux";;
		ppc64*) _args+=" --with-abi=elfv2 --enable-secureplt --enable-targets=powerpc-linux";;
		ppc*) _args+=" --enable-secureplt";;
	esac

	# on ppc64le-musl and all big endian ppc64
	case "$XBPS_TARGET_MACHINE" in
		ppc64le) ;;
		ppc64*) _args+=" --disable-libquadmath" ;;
	esac

	# fix: unknown long double size, cannot define BFP_FMT
	case "$XBPS_TARGET_MACHINE" in
		ppc*-musl) _args+=" --disable-decimal-float";;
	esac


	if [ "$CROSS_BUILD" ]; then
		export CC_FOR_TARGET="$CC"
		export GCC_FOR_TARGET="$CC"
		export CXX_FOR_TARGET="$CXX"

		_args+=" --host=$XBPS_CROSS_TRIPLET"
		_args+=" --with-build-sysroot=${XBPS_CROSS_BASE}"
	else
		_args+=" --build=${_triplet}"
	fi

	if [ "$XBPS_TARGET_LIBC" = "musl" ]; then
		_args+=" --disable-gnu-unique-object"
		_args+=" --disable-symvers"
		_args+=" libat_cv_have_ifunc=no"
	else
		_args+=" --enable-gnu-unique-object"
	fi

	case "$XBPS_TARGET_MACHINE" in
		ppc*) _args+=" --disable-vtable-verify";;
		*) _args+=" --enable-vtable-verify";;
	esac

	export CFLAGS="${CFLAGS/-D_FORTIFY_SOURCE=2/}"
	export CXXFLAGS="${CXXFLAGS/-D_FORTIFY_SOURCE=2/}"

	# Disable explicit -fno-PIE, gcc will figure this out itself.
	export CFLAGS="${CFLAGS//-fno-PIE/}"
	export CXXFLAGS="${CXXFLAGS//-fno-PIE/}"
	export LDFLAGS="${LDFLAGS//-no-pie/}"

	_args+=" --prefix=/usr"
	_args+=" --program-suffix=-${_majorver}"
	_args+=" --enable-version-specific-runtime-libs"
	_args+=" --mandir=/usr/share/man"
	_args+=" --infodir=/usr/share/info"
	_args+=" --libexecdir=/usr/lib${XBPS_TARGET_WORDSIZE}"
	_args+=" --libdir=/usr/lib${XBPS_TARGET_WORDSIZE}"
	_args+=" --with-gxx-include-dir=/usr/include/c++/${version}"
	_args+=" --enable-threads=posix"
	_args+=" --enable-__cxa_atexit"
	_args+=" --disable-multilib"
	_args+=" --with-system-zlib"
	_args+=" --enable-shared"
	_args+=" --enable-lto"
	_args+=" --enable-plugins"
	_args+=" --enable-linker-build-id"
	_args+=" --disable-werror"
	_args+=" --disable-nls"
	_args+=" --enable-default-pie"
	_args+=" --enable-default-ssp"
	_args+=" --enable-checking=release"
	_args+=" --disable-libstdcxx-pch"
	_args+=" --with-isl"
	_args+=" --with-linker-hash-style=$_hash"
	_args+=" --disable-sjlj-exceptions"
	_args+=" --disable-target-libiberty"
	_args+=" --disable-libssp"
	_args+=" --disable-libsanitizer"
	_args+=" --disable-fixed-point"
	_args+=" --disable-bootstrap"
	_args+=" --disable-libunwind-exceptions"
	_args+=" --disable-target-libiberty"
	_args+=" --disable-libquadmath"
	_args+=" --disable-libsanitizer"
	_args+=" --disable-vtable-verify"
	_args+=" --disable-libitm"
	_args+=" --disable-libgomp"
	_args+=" --disable-libatomic"
	_args+=" --disable-libmpx"
	_args+=" --disable-libmudflap"
	_args+=" --disable-libssp"

	mkdir -p build
	cd build
	_args+=" --enable-languages=c,c++,d,lto"
	CONFIG_SHELL=/bin/bash \
		${wrksrc}/configure ${_args}
}

do_build() {
	export GDC=gdc-11
	make -C build ${makejobs}
}

do_install() {
	local _f
	vmkdir "usr/include/c++/${version}"
	make -C build DESTDIR="${DESTDIR}" install

	# Make version a symlink of major version to make all versions
	# from the same series work automagically.
	mv ${DESTDIR}/usr/lib/gcc/${_triplet}/${version} \
		${DESTDIR}/usr/lib/gcc/${_triplet}/${_minorver}
	ln -sf ${_minorver} ${DESTDIR}/usr/lib/gcc/${_triplet}/${version}

	# Ditto for c++ headers.
	mv ${DESTDIR}/usr/include/c++/${version} \
		${DESTDIR}/usr/include/c++/${_minorver}
	ln -sf ${_minorver} ${DESTDIR}/usr/include/c++/${version}

	# Avoid conflict with gcc
	mv ${DESTDIR}/usr/lib/libcc1* ${DESTDIR}/usr/lib/gcc/${_triplet}/${_minorver}

	# Remove python stuff
	rm -rf ${DESTDIR}/usr/share/gcc-${version}/python

	# Conflicting manpages, provided by gcc
	rm -rf ${DESTDIR}/usr/share/man/man7

	# Version info files to avoid conflicts with gcc
	for f in cpp cppinternals gcc gccinstall gccint gdc \
		libgomp libitm libquadmath; do
		if [ -f ${DESTDIR}/usr/share/info/${f}.info ]; then
			mv ${DESTDIR}/usr/share/info/${f}.info \
			   ${DESTDIR}/usr/share/info/${f}-${_majorver}.info
		fi
	done

	# Provided by main libgcc
	rm -f ${DESTDIR}/usr/lib/gcc/${_triplet}/${_minorver}/libgcc_s.so* \
		${DESTDIR}/usr/lib/gcc/${_triplet}/lib/libgcc_s.so* \
		${DESTDIR}/usr/lib/gcc/${_triplet}/lib64/libgcc_s.so* \
		${DESTDIR}/usr/lib/gcc/${_triplet}/lib32/libgcc_s.so*

	# Move pkg-config file into a path pkg-config knows about
	# mv ${DESTDIR}/usr/lib/gcc/${_triplet}/${_minorver}/pkgconfig \
	#   ${DESTDIR}/usr/lib/
}

gcc11-gdc_package() {
	lib32disabled=yes
	repository=bootstrap
	depends="${sourcepkg}>=${_minorver}"
	short_desc+=" - D compiler frontend"
	pkg_install() {
		vmove "usr/bin/*gdc*"
		vmove "usr/lib/gcc/${_triplet}/${_minorver}/include/d"
		vmove usr/lib/gcc/${_triplet}/${_minorver}/d21
		vmove "usr/lib/gcc/${_triplet}/${_minorver}/libgphobos.*"
		vmove "usr/lib/gcc/${_triplet}/${_minorver}/libgdruntime.*"
		vmove "usr/share/info/gdc*"
		vmove "usr/share/man/man1/gdc*"
	}
}
