#! /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.  We assume the source package
# is the name of this package with -restricted-modules stripped.  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 | grep ^Version: | cut -d ' ' -f 2)
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]*//')
series = $(shell dpkg-parsechangelog | sed -ne 's/^Distribution: *//p' | 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_440_version=$(shell gawk '/^nvidia-graphics-drivers-440/ { 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-*)
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@/$(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

%:
	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) $(6)
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-440-$(src_abi)-$*
	install -d debian/linux-modules-nvidia-440-$(src_abi)-$*/usr/lib/linux/triggers
	$(call build_dkms, $(src_abi)-$*, linux-modules-nvidia-440-$(src_abi)-$*, $(CURDIR)/debian/linux-modules-nvidia-440-$(src_abi)-$*/lib/modules/$(src_abi)-$*/kernel, "", nvidia-440, pool/restricted/n/nvidia-graphics-drivers-440/nvidia-kernel-source-440_$(dkms_nvidia_440_version)_$(arch).deb pool/restricted/n/nvidia-graphics-drivers-440/nvidia-dkms-440_$(dkms_nvidia_440_version)_$(arch).deb)
	$(call install_control,linux-modules-nvidia-440-$(src_abi)-$*,$*,nvidia,440,postinst postrm prerm config templates)

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

override_dh_prep: debian/scripts/fix-filenames
	dh_prep

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-440-modules="nvidia-dkms-440 (= $(dkms_nvidia_440_version))"

override_dh_gencontrol:
	dh_gencontrol -- $(gencontrol_flags)
