#!/bin/bash

#
# build-modules: build dkms packages for all supplied flavours of a supplied kernel ABI version
#
# Copyright (C) 2024 Canonical Ltd.
# Author: Jacob Martin <jacob.martin@canonical.com>
#

set -e

if [ $# -lt 4 ]; then
	echo "Usage: $0 <build-dir> <out-dir> <kernel-abi-version> <flavours...>"
	exit 1
fi

BUILDDIR=$1
OUTDIR=$2
KERNEL_ABI_VERSION=$3
shift 3
FLAVOURS=("$@")

# Retrieve a value for a supplied key in a supplied dkms-versions line
parse_dkms-versions() {
	local key=$1
	shift 1

	for kv in "$@"; do
		if [[ "$kv" == "$key"* ]]; then
			echo "${kv##"$key="}"
			return 0
		fi
	done

	return 1
}

# Ensure path is exactly 160 characters.
dkms_dir_prefix() {
	dkms_20c=____________________
	dkms_160c=$dkms_20c$dkms_20c$dkms_20c$dkms_20c$dkms_20c$dkms_20c$dkms_20c$dkms_20c
	path=$1$dkms_160c
	echo "${path:0:156}dkms"
}

for flavour in "${FLAVOURS[@]}"; do
	while read -ra line; do
		name=${line[0]}
		version=${line[1]}
		modname=$(parse_dkms-versions "modulename" "${line[@]}" || echo "$name")
		debpath=$(parse_dkms-versions "debpath" "${line[@]}")
		debpath=${debpath//%version%/$version}
		debpath=${debpath//%package%/$name}
		dkmstree=$(dkms_dir_prefix "$BUILDDIR/$flavour/$name")
		buildheaders=$(parse_dkms-versions "buildheaders" "${line[@]}" || echo "false")

		echo name "$name", version "$version", debpath "$debpath", modulename "$modname"

		mkdir -p "$dkmstree/build" "$dkmstree/source"
		ln -s "/usr/src" "$dkmstree/headers"

		./debian/scripts/dkms-build "$dkmstree" "$KERNEL_ABI_VERSION-$flavour" --no-sign \
			"$name-dkms" "$OUTDIR/$flavour/$modname" "" "$name" "$debpath"

		if [ "$buildheaders" = true ]; then
			modhdrdir=$BUILDDIR/$flavour/headers/$modname
			mkdir -p "$modhdrdir"

			while read -r symver; do
				modsubdir=$(basename "$(dirname "$symver")")
				mkdir "$modhdrdir/$modsubdir"

				# Copy Module.symvers files
				cp "$symver" "$modhdrdir/$modsubdir"

				# Copy include dirs
				srcdir=$dkmstree/source/$name-$version
				cp -r "$srcdir/$modsubdir/include" "$modhdrdir/$modsubdir"
			done < <(find "$dkmstree" -name "Module.symvers")
		fi
	done < debian/dkms-versions
done
