#! /usr/bin/make -f

##export DH_VERBOSE := 1

#VERSION := $(shell LC_ALL=C dpkg-parsechangelog | grep ^Version: | cut -d ' ' -f 2)
arch = $(shell dpkg-architecture -qDEB_HOST_ARCH)

# Work out the source package name and version. The version
# is identical to this package less any rebuild suffix (+lrmN).
src_package := $(shell LC_ALL=C dpkg-parsechangelog -S Source)
src_fullversion = $(shell LC_ALL=C dpkg-parsechangelog -S Version)
src_abi = $(shell echo "$(src_fullversion)" | sed -ne 's/\([0-9]*\.[0-9]*\.[0-9]*\-[0-9]*\)\..*/\1/p')
src_version = $(shell echo $(src_fullversion) | sed -e 's/+[0-9][0-9]*//')
src_series = $(shell dpkg-parsechangelog -S Distribution | sed -e 's/-\(security\|updates\|proposed\)$$//')

VARIANT_PROVIDES=$(shell echo "$(src_package)" | sed -e 's/linux-restricted-modules-//')

dkms_nvidia_390_version=$(shell gawk '/^nvidia-graphics-drivers-390/ { print $$2; }' debian/dkms-versions)
dkms_nvidia_418_version=$(shell gawk '/^nvidia-graphics-drivers-418/ { print $$2; }' debian/dkms-versions)

# Get variants, assumng primary if debian/variants is not present
variants = --
ifneq (,$(wildcard debian/variants))
	variants := $(shell cat debian/variants)
endif

control_files := debian/control.common
# control files only wanted for the primary variant
primary_control_files := $(shell LC_ALL=C ls -d debian/control.d/transitionals-* 2>/dev/null)
ifneq ($(filter --, $(variants)),)
	control_files += $(primary_control_files)
endif
control_files += $(filter-out $(primary_control_files),$(shell LC_ALL=C ls -d debian/control.d/*))

test:
	echo "$(src_fullversion) $(src_version)"

define variant_payload
variant="$$(echo '$(variant)' | sed -e 's/--//')"; \
sed -e "s/\$${variant:suffix}/$$variant/g" \
    -e "s/\$${variant:provides\(\|-image\|-headers\)}/$${variant_provides:+linux\1-$$variant_provides}/" <$$i; \
variant_provides=''; \
echo "";
endef

# We build our control file.  This has to be done before dh runs otherwise
# we have no binary files and we will not run the appropriate targets.
pre-clean: $(control_files)
	rm -f debian/control.tmp
	for i in $^; do 						  \
		if grep -q "{variant:" $$i; then 			  \
			variant_provides="$(VARIANT_PROVIDES)";		  \
			$(foreach variant,$(variants),$(variant_payload)) \
		else							  \
			cat $$i;					  \
			echo "";					  \
		fi;							  \
	done | sed							  \
		-e 's/SRCPKGNAME/$(src_package)/g'			  \
		-e "s/ABI/$(src_abi)/g"					  \
		-e "s/VERSION/$(src_version)/g"				  \
		-e "s/@SERIES@/$(src_series)/g"				  \
		>debian/control.tmp
	rm -f debian/control
	mv debian/control.tmp debian/control
	rm -rf ./$(src_version) UNSIGNED SIGNED
	rm -f 	debian/linux-modules-*.install				\
		debian/linux-modules-*.preinst 				\
		debian/linux-modules-*.prerm 				\
		debian/linux-modules-*.postinst 			\
		debian/linux-modules-*.postrm
	rm -rf $(dkms_dir)

.PHONY: pre-clean

debian/scripts/fix-filenames: debian/scripts/fix-filenames.c
	cc -o $@ $^

clean:: pre-clean debian/scripts/fix-filenames

%:
	dh $@

# Ensure the directory prefix is exactly 100 characters long so pathnames are the
# exact same length in any binary files produced by the builds.  These will be
# commonised later.
dkms_20d=....................
dkms_100d=$(dkms_20d)$(dkms_20d)$(dkms_20d)$(dkms_20d)$(dkms_20d)
dkms_100c=$(shell echo '$(dkms_100d)' | sed -e 's/\./_/g')
#dkms_dir=$(shell echo '$(CURDIR)/$(dkms_100c)' | \
#	sed -e 's/\($(dkms_100d)\).*/\1/' -e 's/^\(.*\)....$$/\1dkms/')
define dkms_dir_prefix =
$(strip $(shell echo '$(1)/$(dkms_100c)' | \
	sed -e 's/\($(dkms_100d)\).*/\1/' -e 's/^\(.*\)....$$/\1dkms/'))
endef
dkms_dir=$(call dkms_dir_prefix,$(CURDIR))

define build_dkms =
	$(SHELL) debian/scripts/dkms-build $(dkms_dir) $(1) --lrm $(2) $(3) $(4) $(5)
endef

ifeq ($(arch),ppc64el)
instfile=vmlinux
else
instfile=vmlinuz
endif

define install_control =
	for which in $(5);							\
	do									\
		template="debian/templates/$(3).$$which.in";			\
		script="debian/$(1).$$which";					\
		sed -e 's/@abiname@/$(src_abi)/g'				\
		    -e 's/@localversion@/-$(2)/g'				\
		    -e 's/@image-stem@/$(instfile)/g'				\
		    -e 's/@nvidia-ver@/$(4)/g'					\
			<"$$template" >"$$script";				\
	done
endef

signatures=$(wildcard /usr/lib/linux/$(src_abi)-*)
flavours=$(patsubst /usr/lib/linux/$(src_abi)-%,nvidia-%,$(signatures))

nvidia-%:
	rm -rf $(dkms_dir)/build $(dkms_dir)/source
	mkdir -p $(dkms_dir)/build $(dkms_dir)/source
	install -d debian/linux-modules-nvidia-390-$(src_abi)-$*
	install -d debian/linux-modules-nvidia-390-$(src_abi)-$*/usr/lib/linux/triggers
	$(call build_dkms, $(src_abi)-$*, linux-modules-nvidia-390-$(src_abi)-$*, $(CURDIR)/debian/linux-modules-nvidia-390-$(src_abi)-$*/lib/modules/$(src_abi)-$*/kernel, nvidia-390, pool/restricted/n/nvidia-graphics-drivers-390/nvidia-kernel-source-390_$(dkms_nvidia_390_version)_$(arch).deb pool/restricted/n/nvidia-graphics-drivers-390/nvidia-dkms-390_$(dkms_nvidia_390_version)_$(arch).deb)
	$(call install_control,linux-modules-nvidia-390-$(src_abi)-$*,$*,nvidia,390,postinst postrm prerm config templates)

	install -d debian/linux-modules-nvidia-418-$(src_abi)-$*
	install -d debian/linux-modules-nvidia-418-$(src_abi)-$*/usr/lib/linux/triggers
	$(call build_dkms, $(src_abi)-$*, linux-modules-nvidia-418-$(src_abi)-$*, $(CURDIR)/debian/linux-modules-nvidia-418-$(src_abi)-$*/lib/modules/$(src_abi)-$*/kernel, nvidia-418, pool/restricted/n/nvidia-graphics-drivers-418/nvidia-kernel-source-418_$(dkms_nvidia_418_version)_$(arch).deb pool/restricted/n/nvidia-graphics-drivers-418/nvidia-dkms-418_$(dkms_nvidia_418_version)_$(arch).deb)
	$(call install_control,linux-modules-nvidia-418-$(src_abi)-$*,$*,nvidia,418,postinst postrm prerm config templates)

prepare-dkms:
	mkdir -p $(dkms_dir)
	ln -s /usr/src $(dkms_dir)/headers

override_dh_auto_install: prepare-dkms $(flavours)
	dh_install

gencontrol_flags  = -Vdkms:nvidia-390-modules="nvidia-dkms-390 (= $(dkms_nvidia_390_version))"
gencontrol_flags += -Vdkms:nvidia-418-modules="nvidia-dkms-418 (= $(dkms_nvidia_418_version))"

override_dh_gencontrol:
	dh_gencontrol -- $(gencontrol_flags)
