#!/usr/bin/make -f

# For reproducible builds.
export DATE	 = env LC_ALL=POSIX date --utc --date="@$(SOURCE_DATE_EPOCH)"
export WHOAMI	 = echo buildd
export HOSTNAME	 = debian

# The generated object files are linked into kernel modules.
export DEB_BUILD_MAINT_OPTIONS = hardening=-stackprotector

# Avoid warnings on C++ compilation
export DEB_CFLAGS_MAINT_STRIP	 = -Werror=implicit-function-declaration

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

NVIDIA_RELEASE		 = $(DEB_VERSION_UPSTREAM)
NVIDIA_MAJOR		 = $(firstword $(subst ., ,$(NVIDIA_RELEASE)))
include debian/rules.defs
NVIDIA_TESLA		?=
LINUX_KMOD_VARIANT	?=
LINUX_KMOD_TESTED	?=
ARCH_LIST		?= amd64

version			 = $(NVIDIA_RELEASE)
version_major		 = $(NVIDIA_MAJOR)
variant			 = $(if $(NVIDIA_TESLA),tesla-$(NVIDIA_TESLA))
variant_description	 = $(if $(NVIDIA_TESLA), (Tesla $(NVIDIA_TESLA) version))
-variant		 = $(if $(variant),-$(variant))
nvidia			 = nvidia$(-variant)
current			 = $(if $(variant),$(variant),current)
module-current		 = $(current)$(LINUX_KMOD_VARIANT)
module			 = nvidia-$(module-current)
nvidia-kernel		 = $(nvidia)$(LINUX_KMOD_VARIANT)-kernel
debhelper_compat	:= $(shell sed -rn 's/.*debhelper-compat \(= ([0-9]+)\).*/\1/p' debian/control)

CONTROL_PREFIXES	 = nvidia-kernel
RENAME_nvidia-kernel	 = $(nvidia-kernel)
renamed_prefix		 = $(or $(RENAME_$1),$(subst nvidia,$(if $(filter %nvidia0 %nvidia1 %nvidia2,$1),$(nvidia-),$(nvidia)),$1))
CONTROL_PREFIXES_RENAMED = $(foreach p,$(CONTROL_PREFIXES),$(call renamed_prefix,$p))

# $1=file, $2=prefix
applyprefixrename	 = $(patsubst debian/$2%,debian/$(call renamed_prefix,$2)%,$1)
# $1=file, $2=prefixlist
applyprefixrenamelist	 = $(if $2,$(call applyprefixrenamelist,$(call applyprefixrename,$1,$(firstword $2)),$(wordlist 2,$(words $2),$2)),$1)

ALL_CONTROL	:= $(wildcard $(patsubst %,debian/%*,$(CONTROL_PREFIXES)))
LEGACY_CONTROL	:= $(wildcard $(patsubst %,debian/%*,$(CONTROL_PREFIXES_RENAMED)))
RENAME_CONTROL	 = $(filter-out $(LEGACY_CONTROL),$(ALL_CONTROL))
RENAMED_CONTROL	 = $(foreach f,$(RENAME_CONTROL),$(call applyprefixrenamelist,$f,$(CONTROL_PREFIXES)))

TEMPLATE_DIRS	 = debian
TEMPLATE_DIRS	+= debian/module/debian
TEMPLATE_DIRS	+= debian/tests
TEMPLATES	:= $(filter-out %.modules.in,$(wildcard $(addsuffix /*.in,$(TEMPLATE_DIRS))))

AUTOGEN		 = $(TEMPLATES:.in=)
AUTOGEN		+= $(RENAMED_CONTROL:.in=)
AUTOGEN		+= debian/module/debian/bug-control
AUTOGEN		+= debian/module/debian/control.modules.in
AUTOGEN		+= debian/bug-control
AUTOGEN		+= debian/substvars
AUTOGEN		+= $(AUTOKEEP)
AUTOKEEP	 =
AUTOKEEP	+= debian/tests/autopkgtest-pkg-dkms.conf
AUTOKEEP	+= debian/tests/control


.PHONY: binary binary-arch binary-indep build build-arch build-indep clean install
binary binary-arch binary-indep build build-arch build-indep clean install:
	dh $@

prepare: $(AUTOGEN)
	QUILT_PATCHES=debian/patches QUILT_SERIES=series-manual quilt --quiltrc /dev/null push -a || test $$? = 2
	cd kernel-open && QUILT_PATCHES=../debian/patches/module quilt --quiltrc /dev/null push -a || test $$? = 2

override_dh_auto_build: prepare
	dh_auto_build -- kernel-open/nvidia/nv-kernel.o_binary kernel-open/nvidia-modeset/nv-modeset-kernel.o_binary NV_VERBOSE=1
	find kernel-open -name '*.o_binary' -type l -exec sh -c 'ln -fv "$$(readlink -f "{}")" "{}"' \;

override_dh_auto_test: J_FLAG ?= $(patsubst parallel=%,-j%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
override_dh_auto_test: TEST_KERNEL ?= $(shell ls -dvr1 /lib/modules/*/build 2>/dev/null | cut -d/ -f4 | head -n 1)
override_dh_auto_test:
	$(RM) -r test-module-build
	cp -a kernel-open test-module-build
	$(MAKE) $(J_FLAG) -C test-module-build NV_VERBOSE=1 KERNEL_UNAME=$(TEST_KERNEL)

# nothing to do
override_dh_auto_install:

override_dh_auto_clean:
	$(MAKE) nvidia.clean nvidia-modeset.clean
	find kernel-open -name '*.o_binary' | xargs -r $(RM) -v
	$(RM) -r test-module-build

execute_after_dh_clean:
	cd kernel-open && QUILT_PATCHES=../debian/patches/module quilt --quiltrc /dev/null pop -a || test $$? = 2
	$(RM) -r kernel-open/.pc/
	test ! -s .pc/applied-patches || quilt --quiltrc /dev/null pop -a || test $$? = 2
	$(RM) -r .pc/
	$(RM) $(filter-out $(AUTOKEEP),$(AUTOGEN))
	$(if $(AUTOKEEP),$(MAKE) -f debian/rules $(AUTOKEEP))

execute_after_dh_install: pack-module-source

override_dh_bugfiles:
	dh_bugfiles -A

override_dh_gencontrol:
	dh_gencontrol -- \
		-V'nvidia:Version=$(version)' \
		-V'nvidia:Version:major=$(version_major)' \
		-V'nvidia=$(nvidia)' \
		-V'nvidia-kernel=$(nvidia-kernel)' \
		-V'nvidia:Variant=$(variant)' \
		-V'nvidia:VariantDesc=$(variant_description)' \
		-V'nvidia:debhelper-compat=$(debhelper_compat)' \
		-V'nvidia:kmod:tested:Linux=$(strip $(or $(LINUX_KMOD_TESTED_$(DEB_HOST_ARCH)),$(LINUX_KMOD_TESTED),???))' \
		-Vnvidia:Models="`cat debian/control.models`"

# used by dpkg-genchanges
debian/substvars:
	echo 'nvidia:VariantDesc=$(variant_description)' > $@
	echo 'nvidia:VariantDescShort=$(variant_description_short)' >> $@

module_source_pkg	 = debian/$(nvidia-kernel)-source
module_source_txz	 = $(module_source_pkg)/usr/src/$(nvidia-kernel).tar.xz

pack-module-source:
	find $(module_source_pkg) \( -name '*.binary' -o -name '*.in' -not -name '*.modules.in' \) -print -delete
	tar c \
		-C $(module_source_pkg)/usr/src \
		--numeric-owner --owner=0 --group=0 \
		--mode=a=rX,u+w \
		--sort=name \
		--mtime='@$(SOURCE_DATE_EPOCH)' \
		--clamp-mtime \
		--remove-files \
		modules | xz -T+1 -9 > $(module_source_txz)
	tar tfv $(module_source_txz)

############################################################################

.PHONY: autogen
autogen: $(AUTOGEN)

# Generating control files
%:: %.in debian/rules debian/rules.defs
	perl -p \
	-e 's{#VERSION#}{$(version)}g;' \
	-e 's{#MAJOR#}{$(version_major)}g;' \
	-e 's{#NVIDIA#}{$(nvidia)}g;' \
	-e 's{#VARIANT#}{$(-variant)}g;' \
	-e 's{#NVIDIA-KERNEL#}{$(nvidia-kernel)}g;' \
	-e 's{#MODULE#}{$(module)}g;' \
	-e 's{#MODULE_CURRENT#}{$(module-current)}g;' \
	-e 's{#ARCH_LIST#}{$(ARCH_LIST)}g;' \
	-e 's{#AUTOPKGTEST_ARCH_LIST#}{$(ARCH_LIST)}g;' \
	< $< > $@
	chmod --reference=$< $@

debian/module/debian/control.modules.in: debian/control debian/module/debian/control.modules.in.binary
	sed -n '/^#/d; 0,/^$$/p' $< > $@
	cat $(filter-out $<,$^) >> $@

debian/module/debian/bug-control: debian/bug-control
	cp $< $@
	echo "" >> $@
	echo "Submit-As: $(nvidia-kernel)-source" >> $@


define rename-template
$2%: $1%
	cp -a $$< $$@
endef
$(foreach p,$(CONTROL_PREFIXES),$(eval $(call rename-template,$p,$(call renamed_prefix,$p))))

include debian/bug-control.mk
