#!/usr/bin/make -f

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

DEB_HOST_ARCH		?= $(shell dpkg-architecture -qDEB_HOST_ARCH)

include debian/rules.defs
version			 = $(NVIDIA_RELEASE)
legacy			 = $(if $(NVIDIA_LEGACY),-legacy-$(NVIDIA_LEGACY)xx)
legacy_description	 = $(if $(NVIDIA_LEGACY), ($(NVIDIA_LEGACY)xx legacy version))
perfkit			 =
watch_pattern		 = $(or $(WATCH_PATTERN),$(if $(NVIDIA_LEGACY),$(NVIDIA_LEGACY)\.[\d\.\-]+),[\d\.\-]+)
filename_x86		 = $(NVIDIA_FILENAME_X86)
filename_x86_64		 = $(NVIDIA_FILENAME_X86_64)
dirname_x86		 = $(NVIDIA_DIRNAME_X86)
dirname_x86_64		 = $(NVIDIA_DIRNAME_X86_64)

ALL_CONTROL	:= $(wildcard debian/nvidia-glx* debian/libgl1-nvidia* debian/nvidia-kernel*)
LEGACY_CONTROL	:= $(wildcard debian/nvidia-glx$(legacy)* debian/libgl1-nvidia$(legacy)* debian/nvidia-kernel$(legacy)*)
RENAME_CONTROL	 = $(filter-out $(LEGACY_CONTROL),$(ALL_CONTROL))
RENAMED_CONTROL	 = $(patsubst debian/nvidia-glx%,debian/nvidia-glx$(legacy)%,\
			$(patsubst debian/libgl1-nvidia%,debian/libgl1-nvidia$(legacy)%,\
			$(patsubst debian/nvidia-kernel%,debian/nvidia-kernel$(legacy)%,\
				$(RENAME_CONTROL))))
TEMPLATES	:= $(wildcard debian/*.in debian/module/debian/*.in)
AUTOGEN		+= $(patsubst %.in,%,$(TEMPLATES))
AUTOGEN		+= debian/module/debian/changelog
AUTOGEN		+= $(patsubst %.in,%,$(RENAMED_CONTROL))
AUTOKEEP	 = debian/watch
AUTOCLEAN	 = $(filter-out $(AUTOKEEP),$(AUTOGEN))

module_source	 = debian/nvidia-kernel$(legacy)-source/usr/src/modules/nvidia-kernel$(legacy)
module_tbz	 = $(subst /modules/,/,$(module_source)).tar.bz2
dkms_source	 = debian/nvidia-kernel$(legacy)-dkms/usr/src/nvidia-$(version)

.PHONY: autogen prepare
autogen: $(AUTOGEN)
prepare: autogen unpack-stamp nvidia.ids


unpack-stamp: ${filename_x86} ${filename_x86_64}
	dh_testdir
	# extract both so we can fetch the kernel object code for both arches
	sh ${filename_x86} --extract-only
	sh ${filename_x86_64} --extract-only
	ln -s ${dirname_x86} NVIDIA-Linux-i386
	ln -s ${dirname_x86_64} NVIDIA-Linux-amd64
	ln -s NVIDIA-Linux-$(DEB_HOST_ARCH) NVIDIA-Linux
	test -d NVIDIA-Linux-i386/usr || \
		$(MAKE) -C NVIDIA-Linux-i386 -f ../debian/restore-upstream-directory-structure
	test -d NVIDIA-Linux-amd64/usr || \
		$(MAKE) -C NVIDIA-Linux-amd64 -f ../debian/restore-upstream-directory-structure
	test -f NVIDIA-Linux/usr/share/doc/README.txt || \
		mv NVIDIA-Linux/usr/share/doc/README NVIDIA-Linux/usr/share/doc/README.txt
	ls -al
	touch $@

nv-kernel.ids: unpack-stamp
	sh debian/extract-pci-ids.sh NVIDIA-Linux/usr/src/nv/nv-kernel.o \
		| tr a-f A-F | sort -u > $@
	@set -e -x ; \
	if ! cmp -s debian/nv-kernel.ids nv-kernel.ids ; then \
		diff -u debian/nv-kernel.ids nv-kernel.ids || true ; \
		: "*** Supported PCI IDs have changed. See diff above. Aborting. ***"; \
		exit 1 ; \
	fi

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

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

override_dh_auto_clean:
	rm -f NVIDIA-Linux-i386 NVIDIA-Linux-amd64 NVIDIA-Linux
	rm -fr $(dirname_x86) $(dirname_x86_64)
	rm -fr debian/temp
	rm -fr kernel-source-tree
	rm -f nvidia.ids nv-kernel.ids pci.ids.nvidia*

override_dh_clean:
	dh_clean
	rm -f $(AUTOCLEAN)
	$(MAKE) -f debian/rules $(AUTOKEEP)

override_dh_auto_configure: prepare

# Build two kernel module source tarballs for use with
#  - module-assistant and make-kpkg
#  - dkms
.PHONY: install-into-tmp build-kernel-source-tree build-kernel-dkms-tree kernel-source-tree
override_dh_auto_install: install-into-tmp build-kernel-source-tree build-kernel-dkms-tree

install-into-tmp:
	# "Install" into debian/tmp.
	cp -al NVIDIA-Linux/ debian/tmp

	# Create xorg.conf.sample
	test ! -f debian/tmp/usr/share/doc/XF86Config.sample || \
	sed \
	    -e 's/XF86Config(4\/5)/xorg.conf(5)/g' \
	    -e 's/XF86Config/xorg.conf/g' \
	    -e 's/XFree86/Xorg/g' \
	    < debian/tmp/usr/share/doc/XF86Config.sample \
	    > debian/tmp/usr/share/doc/xorg.conf.sample

build-kernel-source-tree: install-into-tmp
	# Build the nvidia-kernel-source tree.
	mkdir -p $(module_source)
	mv debian/tmp/usr/src/nv/* $(module_source)/
	# This copy of the changelog is going to be installed into the module
	# binary packages.
	cp -a debian/tmp/usr/share/doc/NVIDIA_Changelog $(module_source)/

	# We don't want these makefiles that don't work with kbuild.
	rm $(module_source)/makefile
	rm $(module_source)/Makefile.nvidia

	# We want both 32 and 64 bit versions of nv-kernel.o.  Do not use a
	# name matching *.o to prevent accidental deletion by some clean
	# target.
	cp -a NVIDIA-Linux-i386/usr/src/nv/nv-kernel.o \
	    $(module_source)/nv-kernel.o.i386
	cp -a NVIDIA-Linux-amd64/usr/src/nv/nv-kernel.o \
	    $(module_source)/nv-kernel.o.x86_64
	rm -f $(module_source)/nv-kernel.o

	# Install a debian/ tree and new conftest files that work purely
	# with kbuild and don't require root into the module package.
	cp -a debian/module/* $(module_source)/
	cp -a debian/copyright $(module_source)/debian/
	cp -a debian/bug-script $(module_source)/debian/
	cp -a debian/bug-control $(module_source)/debian/

	# Fix permissions.
	chmod -R a-sx,u=rwX,go=rX $(module_source)/../..
	chmod a+x $(module_source)/debian/rules
	chmod a+x $(module_source)/conftest.sh

	# Build the tarball.
	tar cfj $(module_tbz) \
	    --owner=root --group=src -C $(module_source)/../.. \
	    --exclude '*.in' --exclude '.svn' modules
	tar tfvj $(module_tbz)

build-kernel-dkms-tree: build-kernel-source-tree
	# Use the nvidia-kernel-source source to create the DKMS tree.
	mkdir -p $(dir $(dkms_source))
	mv $(module_source) $(dkms_source)
	rmdir $(dir $(module_source))
	cd $(dkms_source) \
	    && QUILT_PATCHES=debian/patches quilt --quiltrc /dev/null push -a || test $$? = 2 \
	    && rm -rf .pc debian
	ls -la $(dkms_source)
	dh_dkms -V $(version)

# This target is not used by the package build process.  You can use it if
# you want to work with the patches that get applied to the module source.
kernel-source-tree: prepare build-kernel-source-tree
	rm -rf $@
	cp -a $(module_source) $@
	cd $@ && QUILT_PATCHES=debian/patches quilt --quiltrc /dev/null push -a || test $$? = 2

override_dh_install:
	dh_install --list-missing

override_dh_installchangelogs:
	dh_installchangelogs debian/tmp/usr/share/doc/NVIDIA_Changelog

override_dh_bugfiles:
	dh_bugfiles -A

override_dh_makeshlibs:
	dh_makeshlibs -Xvdpau/libvdpau_nvidia.so -Xtls/libnvidia-tls.so
	# Redirect shlibs for libGL.so.1 to libgl1-mesa-glx | libgl1.
	test ! -d debian/libgl1-nvidia$(legacy)-glx || \
		sed -i -e '/^libGL 1 /s/.*/libGL 1 libgl1-mesa-glx | libgl1/' debian/libgl1-nvidia$(legacy)-glx/DEBIAN/shlibs
	test ! -d debian/libgl1-nvidia$(legacy)-glx-ia32 || \
		sed -i -e '/^libGL 1 /s/.*/libGL 1 ia32-libs (>= 20090804)/' debian/libgl1-nvidia$(legacy)-glx-ia32/DEBIAN/shlibs
	# Remove libGL.so from symbols files in order not to override our special shlibs files.
	test ! -d debian/libgl1-nvidia$(legacy)-glx || \
		sed -i -e '/^libGL\.so/,/^lib/{/^libGL\.so\|^ /d}' debian/libgl1-nvidia$(legacy)-glx/DEBIAN/symbols
	test ! -d debian/libgl1-nvidia$(legacy)-glx-ia32 || \
		sed -i -e '/^libGL\.so/,/^lib/{/^libGL\.so\|^ /d}' debian/libgl1-nvidia$(legacy)-glx-ia32/DEBIAN/symbols

override_dh_gencontrol:
	dh_gencontrol -- -V'nvidia:Version=$(version)' -V'nvidia:Legacy=$(legacy)' \
		-V'nvidia:LegacyDesc=$(legacy_description)' -V'nvidia:Perfkit=$(perfkit)' \
		-Vnvidia:Models="`cat debian/control.models`"

# 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_strip:


# Generating control files
%::	%.in debian/rules.defs
	perl -p \
	-e 's{#VERSION#}{$(version)}g;' \
	-e 's{#LEGACY#}{$(legacy)}g;' \
	-e 's{#!i386#}{$(if $(filter i386,$(DEB_HOST_ARCH)),#)}g;' \
	-e 's{#!amd64#}{$(if $(filter amd64,$(DEB_HOST_ARCH)),#)}g;' \
	-e 's{#WATCH_PATTERN#}{$(subst \,\\,$(watch_pattern))}g;' \
	< $< > $@

debian/module/debian/changelog: debian/changelog
	sed '1s/^nvidia-graphics-drivers/nvidia-kernel/g' $< > $@

# 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 > $@

# Renaming control files for legacy packaging
ifneq (,$(legacy))
nvidia-glx$(legacy)%: nvidia-glx%
	cp -a $< $@

libgl1-nvidia$(legacy)%: libgl1-nvidia%
	cp -a $< $@

nvidia-kernel$(legacy)%: nvidia-kernel%
	cp -a $< $@
endif


.PHONY: get-orig-source
get-orig-source:
	rm -rf get-orig-source || true
	mkdir get-orig-source
	uscan --no-symlink --download-current-version --pasv \
	    --destdir get-orig-source
	test `ls get-orig-source/* | wc -l` = 2  # we need exactly 2 downloaded files
	@set -e -x ; \
	    cd get-orig-source ; \
	    newversion=$$(ls *-x86-*.run | sed -e 's/.*-\([0-9.]*\)\(-.*\)\?\.run/\1/') ; \
	    mkdir nvidia-graphics-drivers-$${newversion}.orig ; \
	    mv *.run nvidia-graphics-drivers-$${newversion}.orig/ ; \
	    chmod 0755 nvidia-graphics-drivers-$${newversion}.orig/* ; \
	    tar cfvz ../nvidia-graphics-drivers$(legacy)_$$newversion.orig.tar.gz \
		--owner=root --group=src \
		nvidia-graphics-drivers-$${newversion}.orig
	rm -rf get-orig-source
