#!/usr/bin/make -f

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

GCC_VERSION=15.2.0
DEB_SOURCE_VERSION=$(shell dpkg-parsechangelog -S Version)
DEB_VERSION := $(GCC_VERSION)-$(DEB_SOURCE_VERSION)

PACKAGE_GCC_RISCV=gcc-riscv64-unknown-elf
PACKAGE_GCC_SOURCE=gcc-riscv64-unknown-elf-source
TARGET_RISCV=riscv64-unknown-elf
TOP_DIR=$(shell pwd)
NPROC=$(shell nproc)

GCC_TAR_DIR=debian
GCC_BUILD_DIR_RISCV=$(TOP_DIR)/build-$(TARGET_RISCV)
GCC_SOURCE_DIR=gcc-$(GCC_VERSION)
GCC_DEB_TMP_DIR_RISCV=$(TOP_DIR)/debian/$(PACKAGE_GCC_RISCV)-tmp
GCC_SOURCE_DEB_TMP_DIR=$(TOP_DIR)/debian/$(PACKAGE_GCC_SOURCE)-tmp

export DEB_BUILD_MAINT_OPTIONS=hardening=+all,-format
ifeq ($(DEB_BUILD_ARCH),mips64el)
export DEB_CFLAGS_MAINT_APPEND=-mxgot
export DEB_CXXFLAGS_MAINT_APPEND=-mxgot
endif
ifeq ($(DEB_BUILD_ARCH),m68k)
export DEB_CFLAGS_MAINT_APPEND=-mlong-jump-table-offsets
export DEB_CXXFLAGS_MAINT_APPEND=-mlong-jump-table-offsets
endif

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

STAMPDIR=debian/stamp

unpack_stamp=$(STAMPDIR)/unpack
tar_stamp=$(STAMPDIR)/tar

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

CONFIGURE_GCC_FLAGS_LIBSTDC = \
	--disable-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_RISCV = \
	$(CONFIGURE_GCC_FLAGS_COMMON) \
	--target=$(TARGET_RISCV) \
	--enable-multilib \
	--includedir=/usr/$(TARGET_RISCV)/include \
	--infodir=/usr/share/doc/$(PACKAGE_GCC_RISCV)/info \
	--htmldir=/usr/share/doc/$(PACKAGE_GCC_RISCV)/html \
	--pdfdir=/usr/share/doc/$(PACKAGE_GCC_RISCV)/pdf \
	--with-cmodel=medany \
	--with-arch=rv64imafdc \
	$(TARGET_TOOLS_RISCV)

%:
	dh $@ --parallel --with autoreconf

$(unpack_stamp): $(tar_stamp)
	set -ex; \
		cd gcc-*; \
		for patch in ../debian/patches/*.patch; do \
			echo Applying patch "$$patch"; \
			patch -p1 < "$$patch"; \
		done
	touch $@

$(tar_stamp):
	tar xf $(GCC_TAR_DIR)/gcc-*.tar.*
	mkdir -p $(STAMPDIR)
	touch $@

override_dh_autoreconf: $(unpack_stamp)
	autoreconf2.69 -f -i $(GCC_SOURCE_DIR)

override_dh_auto_configure: $(unpack_stamp)
	dh_auto_configure -D$(GCC_SOURCE_DIR) -Bbuild-$(TARGET_RISCV) -- $(CONFIGURE_GCC_FLAGS_RISCV)

override_dh_auto_build:
	dh_auto_build -Bbuild-$(TARGET_RISCV) -- -j$(NPROC)

override_dh_auto_install:
	$(MAKE) install -C$(GCC_BUILD_DIR_RISCV) DESTDIR=$(GCC_DEB_TMP_DIR_RISCV)

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

override_dh_clean:
	rm -rf $(GCC_BUILD_DIR_RISCV)
	rm -rf $(GCC_DEB_TMP_DIR_RISCV)
	rm -rf $(GCC_SOURCE_DEB_TMP_DIR)
	rm -rf $(GCC_SOURCE_DIR)
	rm -rf $(STAMPDIR)
	dh_clean

override_dh_strip:
	dh_strip -X.a

override_dh_install:
	dh_install -p$(PACKAGE_GCC_RISCV) --sourcedir $(GCC_DEB_TMP_DIR_RISCV)
	mkdir -p $(GCC_SOURCE_DEB_TMP_DIR)/usr/src
	tar --exclude=autom4te.cache --sort=name --mtime="@$(SOURCE_DATE_EPOCH)" --owner=0 --group=0 --numeric-owner --mode=go-w,u+rw -C $(GCC_SOURCE_DIR) -c -f - . | xz -T0 > $(GCC_SOURCE_DEB_TMP_DIR)/usr/src/$(PACKAGE_GCC_SOURCE).tar.xz
	dh_install -p$(PACKAGE_GCC_SOURCE) --sourcedir $(GCC_SOURCE_DEB_TMP_DIR)

override_dh_compress:
	dh_compress -Xexamples/

override_dh_installchangelogs:
	dh_installchangelogs $(GCC_SOURCE_DIR)/ChangeLog

override_dh_gencontrol:
	dh_gencontrol -- -v$(DEB_VERSION) -Vgcc:Version=$(GCC_VERSION)

