#!/usr/bin/make -f

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

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

include debian/rules.defs
NVIDIA_LEGACY		?=
WATCH_VERSION		?= $(NVIDIA_LEGACY)
WATCH_PATTERN		?=
GIT_BRANCH		?= $(if $(variant),$(variant)/main,$(version_major))
XORG_ABI_LIST		?=
XORG_BOUND		?=
LINUX_KMOD_VARIANT	?=
LINUX_KMOD_TESTED	?=
NVIDIA_LEGACY_CHECK	?=
NVIDIA_SETTINGS		?= nvidia-settings$(-variant)
ARCH_CANDIDATES		?= amd64 i386 armhf
ARCH_LIST		?= amd64
ARCH_DEPS_i386		?=
BLOB_ARCH_LIST		?= $(strip $(DEB_HOST_ARCH) $(ARCH_DEPS_$(DEB_HOST_ARCH)))
NO_DRIVER_ARCH_LIST	?=
NO_AUTOPKGTEST_ARCH_LIST?=
NO_UVM_ARCH_LIST	?=
NO_VULKAN_ARCH_LIST	?=

NVIDIA_RELEASE		 = $(DEB_VERSION_UPSTREAM)
version			 = $(NVIDIA_RELEASE)
version_major		 = $(firstword $(subst ., ,$(version)))
variant			 = $(if $(NVIDIA_LEGACY),legacy-$(NVIDIA_LEGACY)xx)
variant_description	 = $(if $(NVIDIA_LEGACY), ($(NVIDIA_LEGACY)xx legacy version))
variant_description_short= $(if $(NVIDIA_LEGACY), ($(NVIDIA_LEGACY)xx legacy))
-variant		 = $(if $(variant),-$(variant))
trailing_minus		 = $(if $(filter %0 %1 %2 %3 %4 %5 %6 %7 %8 %9,$(variant)),-)
nvidia			 = nvidia$(-variant)
nvidia-			 = $(nvidia)$(trailing_minus)
nvidia_if_variant	 = $(if $(variant),$(nvidia)-)
current			 = $(if $(variant),$(variant),current)
module-current		 = $(current)$(LINUX_KMOD_VARIANT)
module			 = nvidia-$(module-current)
nvidia-kernel		 = $(nvidia)$(LINUX_KMOD_VARIANT)-kernel
libcuda1		 = lib$(nvidia_if_variant)cuda1
watch_pattern		 = $(or $(WATCH_PATTERN),$(if $(WATCH_VERSION),$(WATCH_VERSION)(?:\.[\d\.\-]+)?),\d[\d\.\-]*)
debhelper_compat	:= $(shell sed -rn 's/.*debhelper-compat \(= ([0-9]+)\).*/\1/p' debian/control)
has_driver		 = $(filter $(DEB_HOST_ARCH),$(DRIVER_ARCH_LIST))
has_uvm			 = $(filter $(DEB_HOST_ARCH),$(filter-out $(NO_UVM_ARCH_LIST),$(ARCH_LIST)))
has_vulkan		 = $(filter $(DEB_HOST_ARCH),$(filter-out $(NO_VULKAN_ARCH_LIST),$(ARCH_LIST)))
DRIVER_ARCH_LIST	 = $(filter-out $(NO_DRIVER_ARCH_LIST),$(ARCH_LIST))
AUTOPKGTEST_ARCH_LIST	 = $(filter-out $(NO_AUTOPKGTEST_ARCH_LIST),$(DRIVER_ARCH_LIST))

# this needs the internal names (i.e. upstream's names, not our renamed files)
unload_modules		 =
unload_modules		+= nvidia-drm
unload_modules		+= nvidia-modeset
unload_modules		+= $(if $(has_uvm),nvidia-uvm)
unload_modules		+= nvidia

# system libdir
libdir			?= usr/lib/$(DEB_HOST_MULTIARCH)
# nvidia version specific directory below $(libdir)
nvidia_private		 = nvidia/$(current)

CONTROL_PREFIXES	 = nvidia-driver nvidia-kernel nvidia-alternative xserver-xorg-video-nvidia
CONTROL_PREFIXES	+= libnvidia
CONTROL_PREFIXES	+= libgl1-nvidia
CONTROL_PREFIXES	+= libglx-nvidia0
CONTROL_PREFIXES	+= libegl1-nvidia
CONTROL_PREFIXES	+= libegl-nvidia0
CONTROL_PREFIXES	+= libgles-nvidia1 libgles-nvidia2
CONTROL_PREFIXES	+= nvidia-vdpau-driver
CONTROL_PREFIXES	+= libcuda1
CONTROL_PREFIXES	+= libnvcuvid1
CONTROL_PREFIXES	+= nvidia-smi
CONTROL_PREFIXES	+= nvidia-opencl-icd
RENAME_libcuda1		 = $(libcuda1)
RENAME_libnvcuvid1	 = lib$(nvidia_if_variant)nvcuvid1
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/module/debian/patches
TEMPLATE_DIRS	+= debian/detect
TEMPLATE_DIRS	+= debian/tests
TEMPLATES	:= $(wildcard $(addsuffix /*.in,$(TEMPLATE_DIRS)))

AUTOGEN		 = $(TEMPLATES:.in=)
AUTOGEN		+= $(RENAMED_CONTROL:.in=)
AUTOGEN		+= debian/module/debian/bug-control
AUTOGEN		+= debian/module/debian/control.template
AUTOGEN		+= debian/bug-control
AUTOGEN		+= debian/substvars
AUTOGEN		+= debian/nv-readme.ids
AUTOGEN		+= nvidia-amd64.ids
AUTOGEN		+= $(if $(has_vulkan),glvnd/nvidia_icd.json nonglvnd/nvidia_icd.json)
AUTOGEN		+= $(AUTOKEEP)
AUTOKEEP	 = debian/watch
AUTOKEEP	+= debian/tests/autopkgtest-pkg-dkms.conf
AUTOKEEP	+= debian/tests/control
AUTOKEEP	+= debian/control
AUTOCLEAN	 = $(filter-out $(AUTOKEEP),$(AUTOGEN))

empty		 =
space		 = $(empty) $(empty)
comma		 = ,
xorg_depends	 = $(foreach abi, $(XORG_ABI_LIST), xorg-video-abi-$(abi) |)
xorg_depends	+= $(comma) xserver-xorg-core $(XORG_BOUND)
xorg_provides	 = xorg-driver-video


.PHONY: autogen prepare patch
autogen: debian/control $(AUTOGEN)
prepare: autogen unpack-stamp
ifneq (,$(has_driver))
prepare: nvidia.ids compare-copyright-license
endif
patch: prepare

NVIDIA-Linux-%:
	sh $*/${NVIDIA_FILENAME_$*} --extract-only
	ln -s ${NVIDIA_DIRNAME_$*} $@
	gunzip $@/*.1.gz

# Unpack all architectures, we may need files from all of them.
unpack-stamp: $(patsubst %,NVIDIA-Linux-%,$(ARCH_LIST))
	$(if $(filter $(DEB_HOST_ARCH),$(ARCH_LIST)),,$(error Architecture $(DEB_HOST_ARCH) unsupported.))
	dh_testdir
	$(RM) NVIDIA-Linux
	ln -s NVIDIA-Linux-$(DEB_HOST_ARCH) NVIDIA-Linux
ifneq (,$(has_driver))
	QUILT_PATCHES=debian/patches QUILT_SERIES=series-postunpack quilt --quiltrc /dev/null push -a || test $$? = 2
	sed -i 's/==/=/g' NVIDIA-Linux/nvidia-bug-report.sh
endif
	ls -al
	touch $@

nvidia_icd.json.template	 = NVIDIA-Linux/nvidia_icd.json.template
$(nvidia_icd.json.template): unpack-stamp
glvnd/nvidia_icd.json: $(nvidia_icd.json.template)
	mkdir -p $(@D)
	sed 's/__NV_VK_ICD__/libGLX_nvidia.so.0/' $< > $@
nonglvnd/nvidia_icd.json: $(nvidia_icd.json.template)
	mkdir -p $(@D)
	sed 's/__NV_VK_ICD__/libGL.so.1/' $< > $@

debian/nv-readme.ids: debian/nv-readme.ids.common debian/nv-readme.ids.$(DEB_HOST_ARCH)
	cat $^ | sort -u > $@

nv-readme.ids: unpack-stamp debian/nv-readme.ids
	sed -r	-e '0,/A. Supported|APPENDIX A: SUPPORTED/d' \
		-e '0,/Appendix A. Supported|APPENDIX A: SUPPORTED/d' \
		-e '0,/^Below|APPENDIX B/{/ 0x/s/.*  0x([0-9a-fA-F]{4}).*/10de\1/p; /^(.{41}|.{49}) [0-9a-fA-F]{4} /s/^(.{41}|.{49}) ([0-9a-fA-F]{4}) .*/10de\2/p};d' \
		NVIDIA-Linux/README.txt \
		| tr a-f A-F | sort -u > $@
	@set -e -x ; \
	if ! cmp -s debian/$@ $@ ; then \
		diff -u debian/$@ $@ || true ; \
		: "*** Supported PCI IDs have changed. See diff above. Aborting. ***"; \
		exit 1 ; \
	fi

nvidia.ids: nv-readme.ids
	cp $< $@

nvidia-amd64.ids: debian/nv-readme.ids.amd64
	cp $< $@

# Reformat the LICENSE to the format needed for debian/copyright.
LICENSE.txt: unpack-stamp
	sed -e 's/^ *//; s/ *$$//; s/^$$/./; s/^/ /;' NVIDIA-Linux/LICENSE > $@

# Compare the license in debian/copyright with the LICENSE shipped in the archive.
compare-copyright-license: LICENSE.txt
	sed -e '1,/^License: NVIDIA-graphics-drivers/d; 1,/^License: NVIDIA-graphics-drivers$$/d; /^$$\|^Comment:$$/,$$d; /^ \.$$/d' debian/copyright > copyright.tmp
	sed -e '/^ \.$$/d' LICENSE.txt > LICENSE.tmp
	diff -w copyright.tmp LICENSE.tmp
	$(RM) copyright.tmp LICENSE.tmp

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

override_dh_auto_clean:
	$(RM) -r .pc
	$(RM) NVIDIA-Linux
	$(RM) -r $(foreach a,$(ARCH_LIST),NVIDIA-Linux-$a $(NVIDIA_DIRNAME_$a))
	$(RM) -r build
	$(RM) -r glvnd nonglvnd
	$(RM) -r kernel-source-tree
	$(RM) nvidia.ids nv-readme.ids pci.ids.nvidia*
	$(RM) LICENSE.txt LICENSE.tmp copyright.tmp
	test ! -d debian/po || debconf-updatepo

override_dh_clean:
	dh_clean
	$(RM) $(AUTOCLEAN)
	$(MAKE) -f debian/rules $(AUTOKEEP)
# this will fail unless debian/control{,.md5sum} is up-to-date
	md5sum --check debian/control.md5sum --status || \
		$(MAKE) -f debian/rules debian/control-real

CONTROL_FILES	 = debian/control.in debian/gen-control.pl debian/rules debian/rules.defs

debian/control: $(CONTROL_FILES) debian/changelog
	md5sum --check debian/control.md5sum --status || \
		$(MAKE) -f debian/rules debian/control-real
	touch $@

override_dh_auto_configure: prepare

build-stamp: unpack-stamp
	$(RM) -r build
	cp -al NVIDIA-Linux/ build
	# Use the amd64 changelog for all architectures to be M-A:same safe.
	cp -al NVIDIA-Linux-amd64/NVIDIA_Changelog build/
	$(RM) -r build/32
	$(RM) -r build/libglvnd_install_checker
ifneq (,$(has_driver))
	gzip -9fn build/nvidia-smi.1

	# This copy of the changelog is going to be installed into the module
	# binary packages.
	cp -al build/NVIDIA_Changelog build/kernel/

	# We may need nv-kernel.o for several architectures to accomodate
	# all kernel flavors.
	$(RM) build/kernel/nvidia/nv-kernel.o_binary
	$(foreach a,$(BLOB_ARCH_LIST),cp -al NVIDIA-Linux-$a/kernel/nvidia/nv-kernel.o_binary build/kernel/nvidia/nv-kernel-$a.o_binary ;)
	$(RM) build/kernel/nvidia-modeset/nv-modeset-kernel.o_binary
	$(foreach a,$(BLOB_ARCH_LIST),cp -al NVIDIA-Linux-$a/kernel/nvidia-modeset/nv-modeset-kernel.o_binary build/kernel/nvidia-modeset/nv-modeset-kernel-$a.o_binary ;)

	# Fix permissions.
	chmod -R a-sx,u=rwX,go=rX build/kernel
endif

	touch $@

override_dh_auto_build: build-stamp

override_dh_auto_install:
	$(RM) -r debian/tmp
	cp -al build/ debian/tmp

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

ifneq (,$(has_driver))
override_dh_install:
	dh_install

	find $(module_source_pkg) \( -name '*.binary' -o -name '*.in' -not -name '*.modules.in' \) -print -delete
	tar c \
		-C $(module_source_pkg)/usr/src \
		--owner=root --group=root \
		--mode=a=rX,u+w \
		--sort=name \
		--mtime='@$(SOURCE_DATE_EPOCH)' \
		--clamp-mtime \
		modules | xz -9 > $(module_source_txz)
	tar tfv $(module_source_txz)
	$(RM) -r $(module_source_pkg)/usr/src/modules
endif

kernel-source-tree: build-stamp $(AUTOGEN)
	$(RM) -r $@
	cp -a build/kernel $@
	cd $@ && QUILT_PATCHES=../debian/module/debian/patches quilt --quiltrc /dev/null push -a || test $$? = 2

ifneq (,$(has_driver))
# Test that the patches can be applied to the module source
# and a module can be built.
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: kernel-source-tree
ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
	$(MAKE) $(J_FLAG) -C $< NV_VERBOSE=1 KERNEL_UNAME=$(TEST_KERNEL)
endif
endif

override_dh_installchangelogs:
	dh_installchangelogs debian/tmp/NVIDIA_Changelog

override_dh_dkms:
	dh_dkms -V $(version)

override_dh_bugfiles:
	dh_bugfiles -A

override_dh_missing:
	dh_missing --fail-missing

override_dh_shlibdeps:
	dh_shlibdeps -l/$(libdir)/$(nvidia_private)
	test -z "$$(ls debian/*.substvars 2>/dev/null)" || sed -r -i 's/libnvidia-(e?glcore)-$(version)/lib$(nvidia)-\1 (= $${binary:Version})/g' debian/*.substvars

override_dh_gencontrol:
	dh_gencontrol -- \
		-V'nvidia:Version=$(version)' \
		-V'nvidia:Version:major=$(version_major)' \
		-V'nvidia:xorgDepends=$(xorg_depends)' \
		-V'nvidia:xorgProvides=$(xorg_provides)' \
		-V'nvidia=$(nvidia)' \
		-V'nvidia-=$(nvidia-)' \
		-V'nvidia-if-variant=$(nvidia_if_variant)' \
		-V'nvidia-kernel=$(nvidia-kernel)' \
		-V'nvidia:Variant=$(variant)' \
		-V'nvidia:VariantDesc=$(variant_description)' \
		-V'nvidia:VariantDescShort=$(variant_description_short)' \
		-V'nvidia:legacy-check=$(NVIDIA_LEGACY_CHECK)' \
		-V'libcuda1=$(libcuda1)' \
		-V'nvidia-settings=$(NVIDIA_SETTINGS)' \
		-V'nvidia:debhelper-compat=$(debhelper_compat)' \
		$(foreach a,$(ARCH_CANDIDATES),-V'arch:$a=$(filter $a,$(DRIVER_ARCH_LIST))') \
		-V'nvidia:kmod:binary=$${nvidia-kernel}-dkms (= $${binary:Version}) | $${nvidia-kernel}-$${nvidia:Version}' \
		-V'nvidia:kmod:source=$${nvidia-kernel}-dkms (>= $${nvidia:Version}) | $${nvidia-kernel}-source (>= $${nvidia:Version})' \
		-V'nvidia:kmod:tested:Linux=$(strip $(or $(LINUX_KMOD_TESTED_$(DEB_HOST_ARCH)),$(LINUX_KMOD_TESTED),???))' \
		-V'nvidia:kmod:blob:archlist=$(subst $(space),$(comma)$(space),$(BLOB_ARCH_LIST)) architecture$(if $(filter 1,$(words $(BLOB_ARCH_LIST))),,s)' \
		-Vnvidia:kmod:Description="`cat debian/control.kmod`" \
		-Vnvidia:Models="`cat debian/control.models`"

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

# Do not run dh_strip here.  The NVIDIA license says:
#
#     2.1.2 Linux/FreeBSD Exception.  Notwithstanding the foregoing terms of
#     Section 2.1.1, SOFTWARE designed exclusively for use on the Linux or
#     FreeBSD operating systems, or other operating systems derived from the
#     source code to these operating systems, may be copied and
#     redistributed, provided that the binary files thereof are not modified
#     in any way (except for unzipping of compressed files).
#
# Stripping the binary modules would constitute modifying the binary files
# in a way other than unzipping of compressed files.
override_dh_dwz:
override_dh_strip:
override_dh_strip_nondeterminism:

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

# 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{#WATCH_PATTERN#}{$(subst \,\\,$(watch_pattern))}g;' \
	-e 's{#LIBDIR#}{$(libdir)}g;' \
	-e 's{#PRIVATE#}{$(nvidia_private)}g;' \
	-e 's{#UNLOAD_MODULES#}{$(strip $(unload_modules))}g;' \
	-e 's{#ARCH_LIST#}{$(DRIVER_ARCH_LIST)}g;' \
	-e 's{#AUTOPKGTEST_ARCH_LIST#}{$(AUTOPKGTEST_ARCH_LIST)}g;' \
	-e 's{#HAS_UVM#}{$(if $(has_uvm),,#)}g;' \
	-e 's{#!armhf#}{$(if $(filter armhf,$(DEB_HOST_ARCH)),#)}g;' \
	-e 's{#tls#}{$(if $(filter armhf,$(DEB_HOST_ARCH)),,tls/)}g;' \
	$(EXTRA_SUBSTITUTIONS) \
	< $< > $@
	chmod --reference=$< $@

debian/module/debian/patches/series: EXTRA_SUBSTITUTIONS =
debian/nvidia-kernel-dkms.dkms: debian/module/debian/patches/series
debian/nvidia-kernel-dkms.dkms: EXTRA_SUBSTITUTIONS += -e 's{\#MODULE_PATCHES\#}{$(patsubst %,%,$(shell grep -v ^\# debian/module/debian/patches/series))}g;'

debian/module/debian/control.template: 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" >> $@


# Renaming control files for variant packaging
define rename-template
$2%: $1%
	cp -a $$< $$@
endef
ifneq (,$(variant))
$(foreach p,$(CONTROL_PREFIXES),$(eval $(call rename-template,$p,$(call renamed_prefix,$p))))
endif

include debian/bug-control.mk

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

# intentionally fails to prevent being run during build
debian/control-real: $(CONTROL_FILES)
	debian/gen-control.pl \
		-V'nvidia=$(nvidia)' \
		-V'nvidia-=$(nvidia-)' \
		-V'nvidia-if-variant=$(nvidia_if_variant)' \
		-V'nvidia-kernel=$(nvidia-kernel)' \
		-V'nvidia:Variant=$(-variant)' \
		-V'libcuda1=$(libcuda1)' \
		-V'Vcs-Git:Branch=$(if $(GIT_BRANCH), -b $(GIT_BRANCH))' \
		$(foreach a,$(ARCH_CANDIDATES),-V'arch:$a=$(filter $a,$(DRIVER_ARCH_LIST))') \
		-- \
		debian/control.in > debian/control.new
	mv debian/control.new debian/control
	md5sum debian/control $^ > debian/control.md5sum
	@echo
	@echo This target is made to fail intentionally, to make sure
	@echo that it is NEVER run during the automated build. Please
	@echo ignore the following error, the debian/control file has
	@echo been generated SUCCESSFULLY.
	@echo
	exit 1

# only invoked manually
%.txt: %.list
	cat $< \
	| sed -e 's/^10DE.... *//; /^$$/d' \
	| uniq \
	| sed -e 's/ /#/g; s/#*$$/,/; $$ s/,$$/./' \
	| ( tr '\n' ' '; echo ) \
	| fold -s -w 78 \
	| sed -e 's/#/ /g; s/ *$$//' > $@

# only invoked manually
pci.ids.nvidia: /usr/share/misc/pci.ids
	sed -nr '/^10de/,/^10df/ { /^\t\t/d; /\t/ { s/  (.*) \[(.*)\]$$/  \2 [\1]/; s/^\t/10de/; p} }' $< > $@.tmp
	cut -c 1-8 $@.tmp | tr a-f A-F > $@.tmp1
	cut -c 9- $@.tmp | paste -d '' $@.tmp1 - > $@
	$(RM) $@.tmp $@.tmp1

# only invoked manually
%.names: %.ids pci.ids.nvidia
	cat $< | \
	while read id ; do \
		grep ^$$id pci.ids.nvidia || echo $$id ; \
	done > $@

# only invoked manually
file-lists: $(patsubst %,debian/files_$(NVIDIA_RELEASE)_%,$(DRIVER_ARCH_LIST))
debian/files_$(NVIDIA_RELEASE)_%: NVIDIA-Linux-%
	(cd $< && find .) | sed 's/$(NVIDIA_RELEASE)/VERSION/g' | sort > $@

# only invoked manually
check-whitespace:
	grep -r --exclude-dir=.svn --exclude-dir=.git --exclude '*.patch' -E '\s$$' debian || true

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

CACHE			?= ../.cache
ORIGDIR			?= nvidia-graphics-drivers-$(NVIDIA_RELEASE).orig
TARBALL_BASE		?= nvidia-graphics-drivers$(-variant)_$(NVIDIA_RELEASE).orig
TARBALL_SUFFIX		?= .tar.gz
TARBALL			?= $(TARBALL_BASE)$(TARBALL_SUFFIX)
ORIGDIR.empty		?= $(ORIGDIR)
TARBALL.empty		?= $(TARBALL)

# $1 = arch
get_download_url	 = $(or $(HTTPURL_PREFIX_$(strip $1)),$(HTTPURL_PREFIX))/$(if $(HTTPURL_ARCHDIR_$(strip $1)),$(HTTPURL_ARCHDIR_$(strip $1))/)$(or $(HTTPURL_VERDIR),$(NVIDIA_RELEASE))/$(NVIDIA_FILENAME_$(strip $1))
get_origdir		 = $(or $(ORIGDIR.$(strip $1)),$(ORIGDIR)-$(strip $1))
get_tarball		 = $(or $(TARBALL.$(strip $1)),$(TARBALL_BASE)-$(strip $1)$(TARBALL_SUFFIX))

get-orig-source-prepare:
	$(RM) -r get-orig-source
	mkdir get-orig-source

get-orig-source-prepare/%: get-orig-source-prepare
	$(RM) $(call get_tarball,$*)
	mkdir get-orig-source/$(call get_origdir,$*)

get-orig-source-download/%: get-orig-source-prepare
	ln -v $(CACHE)/$(NVIDIA_FILENAME_$*) get-orig-source/ 2>/dev/null || \
		wget $(call get_download_url,$*) -P get-orig-source/
	if [ -d $(CACHE) ] && [ ! -f $(CACHE)/$(NVIDIA_FILENAME_$*) ]; then \
		ln -v get-orig-source/$(NVIDIA_FILENAME_$*) $(CACHE) ; fi

get-orig-source-files/%: get-orig-source-prepare/% get-orig-source-download/%
	@set -e -x ; \
	    cd get-orig-source ; \
	    mv $(NVIDIA_FILENAME_$*) $(call get_origdir,$*)/ ; \
	    chmod 0755 $(call get_origdir,$*)/* ; \
	    touch $(call get_origdir,$*).stamp -r $$(ls -tr $$(find $(call get_origdir,$*) -type f) | tail -n 1)

get-orig-source-pack/%: get-orig-source-files/%
	@set -e -x ; \
	    cd get-orig-source ; \
	    tar cv \
	        --clamp-mtime --mtime="./$(call get_origdir,$*).stamp" \
	        --sort=name \
		--owner=root --group=src \
		$(call get_origdir,$*) \
		| gzip -n -9 > $(call get_tarball,$*) ; \
	    touch $(call get_tarball,$*) -r $(call get_origdir,$*).stamp
	mv get-orig-source/$(call get_tarball,$*) .

get-orig-source-files/empty: get-orig-source-prepare/empty $(foreach a,$(DRIVER_ARCH_LIST),get-orig-source-pack/$a)
	touch get-orig-source/$(call get_origdir,empty).stamp -r $$(ls -tr $(foreach a,$(DRIVER_ARCH_LIST),$(call get_tarball,$a)) | tail -n 1)

.PHONY: get-orig-source
get-orig-source: get-orig-source-pack/empty
	$(RM) -r get-orig-source

ifneq (,$(variant))
get-orig-source-link/%:
	ln -sf $(subst $(-variant),,$(call get_tarball,$*)) $(call get_tarball,$*)

.PHONY: get-orig-links
get-orig-links: get-orig-source-link/empty $(foreach a,$(DRIVER_ARCH_LIST),get-orig-source-link/$a)
endif

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

# The tarballs are kept in a separate git repository and use the git-lfs
# storage backend. To keep the local disk usage low, this repository is
# checked out sparsely, only tarballs for versions that have been built
# locally will be available locally.

UPSTREAM_NAME		 = nvidia-graphics-drivers
UPSTREAM_VERSION	 = $(NVIDIA_RELEASE)
TARBALL_LIST		 = $(foreach a,empty $(DRIVER_ARCH_LIST),$(call get_tarball,$a))

GIT			?= git
TARBALL_REPOSITORY	 = https://salsa.debian.org/nvidia-team/tarballs-$(UPSTREAM_NAME).git
TARBALL_TREE		 = ../tarballs-$(UPSTREAM_NAME)

define sparse-checkout-current
	grep '^$(UPSTREAM_VERSION)/' $(TARBALL_TREE)/.git/info/sparse-checkout || \
		echo '$(UPSTREAM_VERSION)/*' >> $(TARBALL_TREE)/.git/info/sparse-checkout

endef

define test-file-exists
	test -f $1

endef

$(TARBALL_TREE):
	$(RM) -r $@.tmp
	$(GIT) clone --no-checkout $(TARBALL_REPOSITORY) $@.tmp
	cd $@.tmp && $(GIT) lfs install --local
	cd $@.tmp && $(GIT) config --local core.sparsecheckout true
	echo .gitattributes >> $@.tmp/.git/info/sparse-checkout
	cd $@.tmp && $(GIT) checkout
	mv $@.tmp $@

$(TARBALL_TREE)/$(UPSTREAM_VERSION): | $(TARBALL_TREE)
	$(sparse-checkout-current)
	cd $(TARBALL_TREE) && $(GIT) pull --ff-only && $(GIT) checkout

tarball-tree: $(TARBALL_TREE)

# only invoked manually
writable-tarball-tree: tarball-tree
	cd $(TARBALL_TREE) && $(GIT) remote set-url origin $(patsubst https://salsa.debian.org/%,git@salsa.debian.org:%,$(TARBALL_REPOSITORY))

# invoked from gbp buildpackage preexport hook
check-current-tarballs: $(TARBALL_TREE)/$(UPSTREAM_VERSION)
	$(foreach t,$(TARBALL_LIST),$(call test-file-exists,$(TARBALL_TREE)/$(UPSTREAM_VERSION)/$t))

# only invoked manually
ifeq (,$(variant))
commit-current-tarballs: MSG = add $(UPSTREAM_VERSION) tarballs
commit-current-tarballs: get-orig-source
else
commit-current-tarballs: MSG = add $(UPSTREAM_VERSION) $(variant) symlinks
commit-current-tarballs: get-orig-links
endif
commit-current-tarballs:
	$(sparse-checkout-current)
	mkdir -p $(TARBALL_TREE)/$(UPSTREAM_VERSION)
	mv $(TARBALL_LIST) $(TARBALL_TREE)/$(UPSTREAM_VERSION)/
	cd $(TARBALL_TREE) && $(GIT) add $(UPSTREAM_VERSION) && if $(GIT) status -s $(UPSTREAM_VERSION) | grep ^A ; then $(GIT) commit -m "$(MSG)" $(UPSTREAM_VERSION) ; fi