# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
pkgname=binutils
pkgver=2.45.1
_gold_ver=2.44 # last even version of $pkgver
pkgrel=0
pkgdesc="Tools necessary to build programs"
url="https://www.gnu.org/software/binutils/"
makedepends_build="bison flex texinfo"
makedepends_host="zlib-dev"
arch="all"
license="GPL-2.0-or-later AND LGPL-2.1-or-later AND BSD-3-Clause"
subpackages="$pkgname-dev $pkgname-doc"
source="https://ftp.gnu.org/gnu/binutils/binutils-$pkgver.tar.xz
	https://ftp.gnu.org/gnu/binutils/binutils-with-gold-$_gold_ver.tar.xz
	0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch
	binutils-ld-fix-static-linking.patch
	s390x-pie.patch
	"
options="!check"
builddir="$srcdir/$pkgname-$pkgver"

if [ "$CBUILD" = "$CTARGET" ]; then
	_alpine_archs="
		aarch64
		armhf
		armv7
		loongarch64
		ppc64le
		riscv64
		s390x
		x86
		x86_64
		"
fi

if [ -z "$BOOTSTRAP" ]; then
	makedepends_host="$makedepends_host jansson-dev zstd-dev"
	_noboot_configure="--enable-jansson --with-zstd"

	for _target_arch in $_alpine_archs; do
		if [ "$_target_arch" != "$CARCH" ]; then
			_cross_targets="$_cross_targets $_target_arch"
			subpackages="
				$subpackages
				$pkgname-$_target_arch:_cross_target
				"
		fi
	done
fi

if [ "$CHOST" != "$CTARGET" ]; then
	pkgname="$pkgname-$CTARGET_ARCH"
	subpackages=""
	sonameprefix="$pkgname:"
fi

_gold_configure="--disable-gold"
if [ "$CHOST" = "$CBUILD" ] && [ "$CBUILD" = "$CTARGET" ] && [ "$CTARGET_ARCH" != "riscv64" ] && [ "$CTARGET_ARCH" != "loongarch64" ]; then
	subpackages="$subpackages $pkgname-gold"
	_gold_configure="--enable-gold"
fi

# secfixes:
#   2.44-r2:
#     - CVE-2025-1153
#     - CVE-2025-3198
#   2.44-r0:
#     - CVE-2025-0840
#   2.40-r10:
#     - CVE-2023-1972
#   2.40-r0:
#     - CVE-2023-1579
#   2.39-r2:
#     - CVE-2022-38533
#   2.39-r0:
#     - CVE-2022-38126
#   2.35.2-r1:
#     - CVE-2021-3487
#   2.32-r0:
#     - CVE-2018-19931
#     - CVE-2018-19932
#     - CVE-2018-20002
#     - CVE-2018-20712
#   2.28-r1:
#     - CVE-2017-7614

prepare() {
	default_prepare
	rm -rf "$builddir"/gold "$builddir"/elfcpp
	mv "$srcdir"/binutils-with-gold-*/gold "$builddir"/gold
	mv "$srcdir"/binutils-with-gold-*/elfcpp "$builddir"/elfcpp
}

build() {
	_configure "$CTARGET" "$CTARGET_ARCH" "$_gold_configure"
	local _target_arch

	for _target_arch in $_cross_targets; do
		_configure \
			"$(arch_to_hostspec "$_target_arch")" \
			"$_target_arch" \
			"--disable-gold" &
	done
	wait

	for _builddir in "$srcdir"/build-*; do
		make -C "$_builddir"
	done
}

_configure() {
	local target="$1" target_arch="$2" _gold_configure="$3"
	local _sysroot=/
	local _cross_configure="--enable-install-libiberty --enable-shared --enable-plugins"
	local _arch_configure=""

	if [ "$CHOST" != "$CTARGET" ]; then
		_sysroot="$CBUILDROOT"
	fi
	if [ "$CARCH" != "$target_arch" ]; then
		_cross_configure="--disable-install-libbfd --disable-install-libiberty --disable-plugins"
	fi

	if [ "$target_arch" = "x86_64" ]; then
		_arch_configure="--enable-targets=x86_64-pep"
	fi

	mkdir -p "$srcdir/build-$target_arch"
	cd "$srcdir/build-$target_arch"

	CFLAGS="$CFLAGS -O2" \
	CXXFLAGS="$CXXFLAGS -O2" \
	"$builddir"/configure \
		--build=$CBUILD \
		--host=$CHOST \
		--target="$target" \
		--with-build-sysroot="$CBUILDROOT" \
		--with-sysroot=$_sysroot \
		--prefix=/usr \
		--mandir=/usr/share/man \
		--infodir=/usr/share/info \
		--sysconfdir=/etc \
		$_arch_configure \
		$_cross_configure \
		$_gold_configure \
		$_noboot_configure \
		--disable-gdb \
		--disable-gprofng \
		--disable-multilib \
		--disable-nls \
		--disable-werror \
		--enable-64-bit-bfd \
		--enable-colored-disassembly \
		--enable-default-execstack=no \
		--enable-default-hash-style=gnu \
		--enable-deterministic-archives \
		--enable-ld=default \
		--enable-new-dtags \
		--enable-relro \
		--enable-threads \
		--with-bugurl="https://gitlab.alpinelinux.org/alpine/aports/-/issues" \
		--with-mmap \
		--with-pic \
		--with-system-zlib
	make configure-host configure-target
}

package() {
	for _target_arch in $_cross_targets; do
		make -C "$srcdir/build-$_target_arch" install DESTDIR="$pkgdir"
		if [ -d "$pkgdir"/usr/lib64 ]; then
			mv "$pkgdir"/usr/lib64/* "$pkgdir"/usr/lib/
			rmdir "$pkgdir"/usr/lib64
		fi
		rm -r "${pkgdir:?}"/usr/share "${pkgdir:?}"/usr/lib
	done

	make -C "$srcdir/build-$CTARGET_ARCH" install DESTDIR="$pkgdir"
	if [ "$CHOST" != "$CTARGET" ]; then
		# creating cross tools: remove any files that would conflict
		# with the native tools, or other cross tools
		rm -r "${pkgdir:?}"/usr/share "${pkgdir:?}"/usr/lib
	fi
}

gold() {
	pkgdesc="GNU binutils - gold linker (deprecated)"

	amove usr/bin/ld.gold
	amove usr/$CTARGET/bin/ld.gold
}

_cross_target() {
	local target_arch="${subpkgname#*-}"
	local target="$(arch_to_hostspec "$target_arch")"
	pkgdesc="Tools necessary to build programs for $target_arch"

	amove \
		usr/bin/$target-* \
		usr/$target
}

sha512sums="
ea030419eba387579ab717be7e3223fc99e93b586860b06003c12489f93441640d4082736f76aa5e98233db4f46e232f536a45e471486de1f5b64e1b827c167e  binutils-2.45.1.tar.xz
1d8688f1b6f1bc64cfd1f82e3af05b8ace1d709d4fa819acb4d12d74e1b69b4314d98fb4281dacc9b5fa51ff7370d0249f540ec016fd137aa701502d72426301  binutils-with-gold-2.44.tar.xz
70ec22bd72ef6dddecfd970613387dd4a8cdc8730dd3cbf03d5a0c3a7c4d839383167bb06dad21bf7c235329fd44b5dc4aefe762f68544f17155cf002bf1be4a  0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch
ecee33b0e435aa704af1c334e560f201638ff79e199aa11ed78a72f7c9b46f85fbb227af5748e735fd681d1965fcc42ac81b0c8824e540430ce0c706c81e8b49  binutils-ld-fix-static-linking.patch
762ee44a847d56467294adad113562ba0bafbb90828530f93e7e2ee383bf7d52be58c5def6a2ff0e1ae7d24ab6682f220f7c6fe2fecab2b55fd4d31ef55e0e58  s390x-pie.patch
"
