#!/usr/bin/make -f

include /usr/share/dpkg/architecture.mk
include /usr/share/dpkg/pkg-info.mk
export DEBIAN_REVISION ?= $(shell echo $(DEB_VERSION) | sed -e 's,.*+dfsg,+dfsg,')

ifneq ($(DEB_BUILD_GNU_TYPE),$(DEB_HOST_GNU_TYPE))
export CROSS_COMPILE ?= $(DEB_HOST_GNU_TYPE)-
cross_build_tools ?= y
endif

# Enable verbose build by default, disable when terse is specified.
ifneq (,$(filter terse,$(DEB_BUILD_OPTIONS)))
VERBOSE=0
else
VERBOSE=1
endif

# the upstream build passes LDFLAGS directly to ld instead of calling gcc for
# linking; so instead of passing -Wl,foo in LDFLAGS as in automake builds, one
# should set LDFLAGS to foo directly
comma := ,
LDFLAGS := $(patsubst -Wl$(comma)%,%,$(LDFLAGS))

notools := $(filter pkg.uboot.notools,$(DEB_BUILD_PROFILES))

# limit builds to only certain subarchitectures
# e.g. pkg.uboot.subarch.rockchip will only build rockchip targets.
ifeq (,$(filter pkg.uboot.subarch.%,$(DEB_BUILD_PROFILES)))
TARGETSUBARCH = .
else
TARGETSUBARCH = $(patsubst pkg.uboot.subarch.%,%,$(filter pkg.uboot.subarch.%,$(DEB_BUILD_PROFILES)))
endif

export OPENSBI=/usr/lib/riscv64-linux-gnu/opensbi/generic/fw_dynamic.bin

%:
	dh $@

configs/novena-rawsd_defconfig: configs/novena_defconfig
	sed -e 's,CONFIG_SPL_FS_FAT=y,# CONFIG_SPL_FS_FAT is not set,' \
		configs/novena_defconfig > configs/novena-rawsd_defconfig

configs/am335x_boneblack_defconfig: configs/am335x_evm_defconfig
	sed -e 's,CONFIG_OF_LIST=.*,CONFIG_OF_LIST="am335x-evm am335x-boneblack",g' \
		configs/am335x_evm_defconfig > configs/am335x_boneblack_defconfig

override_dh_auto_build-arch: TARGETARCH := $(DEB_HOST_ARCH)
override_dh_auto_build-arch: build-targets
ifeq ($(notools),)
  override_dh_auto_build-arch: build-tools
endif

override_dh_auto_build-indep: TARGETARCH := all
override_dh_auto_build-indep: build-targets

build-targets: configs/novena-rawsd_defconfig configs/am335x_boneblack_defconfig
	echo run build-targets for $(TARGETARCH)
	set -e; grep ^$(TARGETARCH)[^a-z0-9] debian/targets \
	    | grep $(TARGETSUBARCH) \
	    | while read arch subarch platform bl31 targets; do \
	        builddir=debian/build/$$platform; \
		case $$bl31 in \
			/usr/lib/arm-trusted-firmware/*) export BL31=$$bl31 ;; \
			*) targets="$$bl31 $$targets" ;\
				unset BL31 ;; \
		esac; \
		case $$platform in \
			novena-rawsd) targets="$$targets" ;\
				;; \
			sifive_fu540) \
				quilt pop riscv64/sifive-fu540-compressed-booti-support.patch ; \
				;; \
			*) targets="$$targets uboot.elf" ;\
				;; \
		esac;\
		case $$subarch in \
			-) subpackage="u-boot" ;\
				;; \
			*) subpackage="u-boot-$$subarch" ;\
				;; \
		esac;\
		case $$arch in \
			all:armhf) export CROSS_COMPILE=arm-linux-gnueabihf- ;;\
			all:arm64) export CROSS_COMPILE=aarch64-linux-gnu- ;;\
			all:mips) export CROSS_COMPILE=mips-linux-gnu- ;;\
			all:mipsel) export CROSS_COMPILE=mipsel-linux-gnu- ;;\
			all:mips64el) export CROSS_COMPILE=mips64el-linux-gnuabi64- ;;\
			all:powerpc) export CROSS_COMPILE=powerpc-linux-gnu- ;;\
			all:riscv64) export CROSS_COMPILE=riscv64-linux-gnu- ;;\
			all:i386) export CROSS_COMPILE=i686-linux-gnu- ;;\
			all:amd64) export CROSS_COMPILE=x86_64-linux-gnu- ;;\
			*) ;; \
		esac;\
		case $$subarch in \
			sunxi) export SCP=/dev/null ;;\
			*) unset SCP ;;\
		esac;\
		mkdir -p $$builddir; \
		dh_auto_build -- V=$(VERBOSE) O=$$builddir $${platform}_defconfig; \
		sed -i -e 's,CONFIG_FIT_SIGNATURE=y,# CONFIG_FIT_SIGNATURE is not set,g' $$builddir/.config; \
		dh_auto_build -- V=$(VERBOSE) O=$$builddir; \
		case "$$targets" in \
			*uboot.elf*) \
				install -m 644 $$builddir/u-boot $$builddir/uboot.elf; \
				$${CROSS_COMPILE}strip --remove-section=.comment \
					--remove-section=.note \
					$$builddir/uboot.elf; \
				;; \
		esac; \
		for target in $$targets; do \
			chmod -x $$builddir/$$target; \
			echo $$builddir/$$target /usr/lib/u-boot/$$platform/ \
				>> debian/build/targets.$$subarch; \
			echo $$platform >> debian/build/platforms.$$subarch; \
		done ; \
		cp $$builddir/.config $$builddir/config.$$platform; \
		echo $$builddir/config.$$platform /usr/share/doc/$$subpackage/configs/ \
			>> debian/build/targets.$$subarch; \
		case $$platform in \
			sifive_fu540) \
				quilt push -a ;\
				;; \
		esac;\
	done

TOOLSDIR := debian/build/tools
build-tools:
	dh_auto_build -- V=$(VERBOSE) O=$(TOOLSDIR) CROSS_COMPILE=$(CROSS_COMPILE) tools-only_defconfig
	cp $(TOOLSDIR)/.config $(TOOLSDIR)/config
	# board-independent tools
	dh_auto_build -- V=$(VERBOSE) O=$(TOOLSDIR) \
		CROSS_COMPILE=$(CROSS_COMPILE) \
		CROSS_BUILD_TOOLS=$(cross_build_tools) \
		NO_SDL=1 \
	    tools-only

# Only test when tools are built and native.
override_dh_auto_test-arch:
  ifeq ($(notools)$(cross_build_tools),)
	BASEDIR=$(TOOLSDIR) test/image/test-imagetools.sh
  endif
override_dh_auto_test-indep:

# Do not spend time searching for an install target in Makefile.
override_dh_auto_install:

override_dh_strip:
	# dh_strip tries to strip the cross compiled qemu images, which doesn't
	# work
	dh_strip -X qemu

override_dh_clean:
	rm -rf debian/build/
	rm -f configs/novena-rawsd_defconfig
	rm -f configs/am335x_boneblack_defconfig
	rm -f linux.itb linux.its
	dh_clean
	find . -type d -name __pycache__ -delete

override_dh_gencontrol:
	debian/bin/update-substvars
	dh_gencontrol
