#!/bin/bash
set -e

validate_unique()
{
	[ "$#" = "2" ]
	local duplicates=$(echo $2 | tr " " "\n" | sort | uniq -d)
	if [ "$duplicates" ]; then
		echo "EE: duplicate values in $1" 1>&2
		exit 1
	fi
}

# Pick out relevant version and package information including our predecessor
# packages: linux -> linux-restricted-modules-signatures -> linux-restricted-modules
src_package=$(LC_ALL=C dpkg-parsechangelog -SSource)
src_version=$(LC_ALL=C dpkg-parsechangelog -SVersion)
src_abi=$(echo "${src_version}" | sed -ne 's/\([0-9]*\.[0-9]*\.[0-9]*\-[0-9]*\)\..*/\1/p')
src_series=$(LC_ALL=C dpkg-parsechangelog -SDistribution | sed -e 's/-\(security\|updates\|proposed\)$//')

# linux/5.8.0-41.46
src_main_package=$(echo "${src_package}" | sed -e 's/-restricted-generate//')
src_main_version=$(echo ${src_version} | sed -e 's/+[0-9][0-9\.]*$//') 

# linux-restricted-generate/5.8.0-41.46[+1]

# linux-restricted-signatures/5.8.0-41.46[+1]

# linux-restricted-modules/5.8.0-41.46[+1]
src_lrm_package=$(echo "${src_package}" | sed -e 's/-restricted-generate/-restricted-modules/')
src_lrm_version=${src_version}

cat - "debian/rules.in" >"debian/rules.gen" <<EOL
#! /usr/bin/make -f

src_package := ${src_package}
src_version = ${src_version}
src_abi = ${src_abi}
src_series = ${src_series}
src_lrm_package = ${src_lrm_package}
src_lrm_version = ${src_lrm_version}

EOL

: >"debian/control.interlock-up"

nvidia_desktop=
nvidia_server=
nvidia_ignore=
while read command arg
do
	case "$command" in
	option)		;;
	suppress)		nvidia_ignore="$nvidia_ignore $arg"; continue ;;
	*)		continue ;;
	esac

	case "$arg" in
	desktop)	nvidia_desktop=y ;;
	server)		nvidia_server=y ;;
	esac
done <"debian/package.config"

build_archs=
while read command flavour archs
do
	case "$command" in
	build)		;;
	*)		continue ;;
	esac

	validate_unique "archs" "$archs"
	cat - >>"debian/control.interlock-up" <<EOL
 linux-headers-${src_abi}-${flavour} (>= ${src_main_version}) [${archs}],
EOL

	for arch in $archs
	do
		case " $build_archs " in
		*\ $arch\ *)    ;;
		*)              build_archs="$build_archs $arch" ;;
		esac
	done

	while read package version extra
	do
		case "$package" in
		nvidia-graphics-drivers-*-server)
			[ -z "$nvidia_server" ] && continue
			;;
		nvidia-graphics-drivers-*)
			[ -z "$nvidia_desktop" ] && continue
			;;
		*) continue ;;
		esac
		case " $nvidia_ignore " in
		*\ $package\ *)		continue ;;
		esac

		case " $extra " in
		*\ signonly\ *)		continue ;;
		esac

		# If package specifies arch= keys, only build it on
		# the intersection of kernel flavour arches & the
		# package arches, otherwise build for all kernel
		# flavour arches.
		pkg_archs=
		variant=
		for cmd in $extra
		do
			case "$cmd" in
			arch=*) pkg_archs="$pkg_archs ${cmd#arch=}" ;;
			variant=*) variant="-${cmd#variant=}" ;;
			esac
		done
		# No package arches set, build for everything
		if [ -z "$pkg_archs" ]; then
			pkg_archs=$archs
		else
			# Package arches set, build for intersection
			validate_unique "pkg_archs" "$pkg_archs"
			pkg_archs=$(sort <(echo $archs | tr " " "\n") <(echo $pkg_archs | tr " " "\n") | uniq -d | tr "\n" " ")
			# No intersection, skip
			if [ -z "$pkg_archs" ]; then
				continue
			fi
		fi

		targets=$(echo "$pkg_archs" | sed -e 's/\</nvidia-/g')
		suffix_minus=$(echo "$package$variant" | sed -e 's/nvidia-graphics-drivers-//')
		suffix_under=$(echo "$suffix_minus" | sed -e 's/-/_/g')
		suffix_short=$(echo "$suffix_minus" | sed -e 's/-server/srv/g')

		echo "II: build $package for $flavour $pkg_archs"

		cat - >>"debian/control.interlock-up" <<EOL
 linux-objects-nvidia-${suffix_minus}-${src_abi}-${flavour} (>= ${src_lrm_version}) [${pkg_archs}],
EOL

		# debian/rules.gen
		# XXX: BUILD should help us here.
		if [ "$variant" = "-open" ]; then
			cat - >>"debian/rules.gen" <<EOL

# $package $version $suffix_minus $suffix_under $suffix_short
$targets::
	install -d \$(custom_dir)/${src_abi}-${flavour}/open/nvidia-${suffix_short}
	cp -rp /lib/modules/${src_abi}-${flavour}/kernel/nvidia-${suffix_short}/*.ko \$(custom_dir)/${src_abi}-${flavour}/open/nvidia-${suffix_short}
EOL
		else
			cat - >>"debian/rules.gen" <<EOL

# $package $version $suffix_minus $suffix_under $suffix_short
$targets::
	install -d \$(custom_dir)/${src_abi}-${flavour}/signatures/nvidia-${suffix_short}
	cp -rp /lib/modules/${src_abi}-${flavour}/kernel/nvidia-${suffix_short}/bits \$(custom_dir)/${src_abi}-${flavour}/signatures/nvidia-${suffix_short}
	( \\
		cd \$(custom_dir)/${src_abi}-${flavour}/signatures/nvidia-${suffix_short}/bits || exit 1; \\
		sed -i 's/sha256sum \-c SHA256SUMS/csplit -z SHA256SUMS \/nvidia\/ \{\*\} \&\& sha256sum -c xx*/' BUILD; \\
		sh BUILD unsigned || exit 1; \\
		mv *.ko ..; \\
	)
	rm -rf \$(custom_dir)/${src_abi}-${flavour}/signatures/nvidia-${suffix_short}/bits
EOL
		fi

	done <"debian/dkms-versions"
done <"debian/package.config"

{
	cat "debian/control.common" "-" <<EOL

Package: ${src_package}
Architecture:${build_archs}
Section: kernel
Description: Build interlock package
 Build interlock package.  You do not want to install this package.
EOL
} | sed \
	-e "/@BUILD-INTERLOCK@/{"		\
	-e " r debian/control.interlock-up"	\
	-e " d"					\
	-e " }"					\
	-e "s/@SRCPKGNAME@/${src_package}/g"	\
	-e "s/@ABI@/${src_abi}/g"		\
    >"debian/control"

rm -f "debian/control.interlock-up"
