#!/usr/bin/make -f

include /usr/share/dpkg/pkg-info.mk

MULTILIB_LIST_ARM="--with-multilib-list=rmprofile,aprofile"

TARGET_ARM=arm-none-eabi
TARGET_AARCH64=aarch64-none-elf
PACKAGE_GCC_ARM=gcc-$(TARGET_ARM)
PACKAGE_GCC_AARCH64=gcc-$(TARGET_AARCH64)
PACKAGE_GCC_SOURCE=gcc-arm-none-eabi-source
PACKAGE_LIBSTDCXX_ARM=libstdc++-$(TARGET_ARM)
PACKAGE_LIBSTDCXX_ARM_COMMON=libstdc++-$(TARGET_ARM)-common
PACKAGE_LIBSTDCXX_AARCH64=libstdc++-$(TARGET_AARCH64)
TOP_DIR=$(shell pwd)

UPSTREAM_URL=https://developer.arm.com/-/media/Files/downloads/gnu/15.2.rel1/srcrel/arm-gnu-toolchain-src-snapshot-15.2.rel1.tar.xz
GCC_BUILD_DIR_ARM=$(TOP_DIR)/build-$(TARGET_ARM)
GCC_BUILD_DIR_AARCH64=$(TOP_DIR)/build-$(TARGET_AARCH64)
GCC_SOURCE_DIR=$(TOP_DIR)/src
GCC_DEB_TMP_DIR_ARM=$(TOP_DIR)/debian/$(PACKAGE_LIBSTDCXX_ARM)-tmp
GCC_DEB_TMP_DIR_AARCH64=$(TOP_DIR)/debian/$(PACKAGE_LIBSTDCXX_AARCH64)-tmp

LIBSTDCXX_BUILD_DIR_ARM=$(GCC_BUILD_DIR_ARM)/libstdc++-v3
LIBSTDCXX_BUILD_DIR_AARCH64=$(GCC_BUILD_DIR_AARCH64)/libstdc++-v3

STAMP_DIR=$(TOP_DIR)/debian/stamp
UNPACK=$(STAMP_DIR)/unpack
GCC_SOURCE_VERSION := $(shell dpkg-query -W -f="\$${Version}\n" $(PACKAGE_GCC_SOURCE))
PACKAGE_VERSION := $(GCC_SOURCE_VERSION)+$(DEB_VERSION)

# these need to match the flags used in gcc-arm-none-eabi

export DEB_BUILD_MAINT_OPTIONS=hardening=-format
BUILDFLAGS:=$(shell dpkg-buildflags --export=configure) INHIBIT_LIBC_CFLAGS="-DUSE_TM_CLONE_REGISTRY=0"

TARGET_TOOLS_ARM=\
	AR_FOR_TARGET=$(TARGET_ARM)-ar \
	AS_FOR_TARGET=$(TARGET_ARM)-as \
	LD_FOR_TARGET=$(TARGET_ARM)-ld \
	NM_FOR_TARGET=$(TARGET_ARM)-nm \
	OBJDUMP_FOR_TARGET=$(TARGET_ARM)-objdump \
	RANLIB_FOR_TARGET=$(TARGET_ARM)-ranlib \
	READELF_FOR_TARGET=$(TARGET_ARM)-readelf \
	STRIP_FOR_TARGET=$(TARGET_ARM)-strip

TARGET_TOOLS_AARCH64=\
	AR_FOR_TARGET=$(TARGET_AARCH64)-ar \
	AS_FOR_TARGET=$(TARGET_AARCH64)-as \
	LD_FOR_TARGET=$(TARGET_AARCH64)-ld \
	NM_FOR_TARGET=$(TARGET_AARCH64)-nm \
	OBJDUMP_FOR_TARGET=$(TARGET_AARCH64)-objdump \
	RANLIB_FOR_TARGET=$(TARGET_AARCH64)-ranlib \
	READELF_FOR_TARGET=$(TARGET_AARCH64)-readelf \
	STRIP_FOR_TARGET=$(TARGET_AARCH64)-strip

CONFIGURE_GCC_FLAGS_LIBSTDC = \
	--enable-libstdcxx \
	--enable-hosted-libstdcxx

CONFIGURE_GCC_FLAGS_COMMON = \
	--with-gcc-major-version-only \
	--mandir=/usr/share/man \
	--enable-languages=c,c++,lto \
	--enable-multilib-space \
	--disable-decimal-float \
	--disable-libffi \
	--disable-libgomp \
	--disable-libmudflap \
	--disable-libquadmath \
	--disable-libssp \
	--disable-libstdcxx-pch \
	--disable-nls \
	--disable-shared \
	--disable-threads \
	--enable-tls \
	--build=$(DEB_BUILD_GNU_TYPE) \
	--with-system-zlib \
	--with-gnu-as \
	--with-gnu-ld \
	"--with-pkgversion=$(DEB_VERSION)" \
	--without-included-gettext \
	--prefix=/usr \
	--libexecdir=/usr/libexec \
	--libdir=/usr/lib \
	--host=$(DEB_HOST_GNU_TYPE) \
	--with-headers=no \
	--with-picolibc \
	--without-newlib \
	$(CONFIGURE_GCC_FLAGS_LIBSTDC) \
	$(BUILDFLAGS) \
	SED=/bin/sed \
	SHELL=/bin/sh \
	BASH=/bin/bash \
	CONFIG_SHELL=/bin/bash \

CONFIGURE_GCC_FLAGS_ARM = \
	$(CONFIGURE_GCC_FLAGS_COMMON) \
	--target=$(TARGET_ARM) \
	--enable-multilib \
	--infodir=/usr/share/doc/$(PACKAGE_LIBSTDCXX_ARM)/info \
	--htmldir=/usr/share/doc/$(PACKAGE_LIBSTDCXX_ARM)/html \
	--pdfdir=/usr/share/doc/$(PACKAGE_LIBSTDCXX_ARM)/pdf \
	$(MULTILIB_LIST_ARM) \
	$(TARGET_TOOLS_ARM)

CONFIGURE_GCC_FLAGS_AARCH64 = \
	$(CONFIGURE_GCC_FLAGS_COMMON) \
	--target=$(TARGET_AARCH64) \
	--disable-multilib \
	--infodir=/usr/share/doc/$(PACKAGE_LIBSTDCXX_AARCH64)/info \
	--htmldir=/usr/share/doc/$(PACKAGE_LIBSTDCXX_AARCH64)/html \
	--pdfdir=/usr/share/doc/$(PACKAGE_LIBSTDCXX_AARCH64)/pdf \
	$(TARGET_TOOLS_AARCH64)

%:
	dh $@

override_dh_auto_configure: $(UNPACK)
	dh_auto_configure -D$(GCC_SOURCE_DIR) -Bbuild-$(TARGET_AARCH64) -- $(CONFIGURE_GCC_FLAGS_AARCH64)
	dh_auto_configure -D$(GCC_SOURCE_DIR) -Bbuild-$(TARGET_ARM) -- $(CONFIGURE_GCC_FLAGS_ARM)

override_dh_auto_build:
	dh_auto_build -Bbuild-$(TARGET_AARCH64) -- all-target-libstdc++-v3
	dh_auto_build -Bbuild-$(TARGET_ARM) -- all-target-libstdc++-v3

# remove the libtool dregs
override_dh_auto_install:
	$(MAKE) install-target-libstdc++-v3 -C$(GCC_BUILD_DIR_AARCH64) DESTDIR=$(GCC_DEB_TMP_DIR_AARCH64)
	find $(GCC_DEB_TMP_DIR_AARCH64) -name *.la -exec rm '{}' +
	$(MAKE) install-target-libstdc++-v3 -C$(GCC_BUILD_DIR_ARM) DESTDIR=$(GCC_DEB_TMP_DIR_ARM)
	find $(GCC_DEB_TMP_DIR_ARM) -name *.la -exec rm '{}' +

override_dh_auto_test:
	@echo "no testing, that's way too painful"

override_dh_clean:
	rm -rf build-$(TARGET_ARM)
	rm -rf build-$(TARGET_AARCH64)
	rm -rf $(GCC_BUILD_DIR_ARM)
	rm -rf $(GCC_BUILD_DIR_AARCH64)
	rm -rf $(GCC_DEB_TMP_DIR_ARM)
	rm -rf $(GCC_DEB_TMP_DIR_ARM_AARCH64)
	rm -rf $(GCC_SOURCE_DEB_TMP_DIR)
	dh_clean

override_dh_strip:
	dh_strip -X.a

override_dh_install:
	dh_install -p$(PACKAGE_LIBSTDCXX_AARCH64) --sourcedir $(GCC_DEB_TMP_DIR_AARCH64)
	dh_install -p$(PACKAGE_LIBSTDCXX_ARM) --sourcedir $(GCC_DEB_TMP_DIR_ARM)
	dh_install -p$(PACKAGE_LIBSTDCXX_ARM_COMMON) --sourcedir $(GCC_DEB_TMP_DIR_ARM)

$(UNPACK):
	mkdir -p $(STAMP_DIR)
	mkdir -p $(GCC_SOURCE_DIR)
	tar xf /usr/src/$(PACKAGE_GCC_SOURCE).tar.* -C $(GCC_SOURCE_DIR)
	touch $@

override_dh_gencontrol:
	dh_gencontrol -- -v$(PACKAGE_VERSION) -Vgcc:Version=$(GCC_SOURCE_VERSION)

