#!/usr/bin/make -f
#
# debian/rules for kernel-source.
#
# GNU copyright 1997 to 1999 by Joey Hess.
# Copyright (c) 1999-2004 Herbert Xu <herbert@gondor.apana.org.au>
# Copyright (c) 2004 Jens Schmalzing <jensen@debian.org>
#

include /usr/share/dpkg/architecture.mk

# Used when you need to 'escape' a comma.
comma = ,

SERIES=$(shell dpkg-parsechangelog -SDistribution | sed -e 's/-\(security\|updates\|proposed\)$$//')
SOURCE=$(shell dpkg-parsechangelog -SSource)
KERNEL_SOURCE=$(shell echo "$(SOURCE)" | sed -e 's/-meta//')

# 5 digit versions (2.6.38[.-]<abi>.<upload>, 3 digit kernel base versions (2.6.38)
KERNEL_UPLOAD_VERSION=$(shell dpkg-parsechangelog -SVersion | sed -ne 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)[\.\-]\([0-9]*\)\.\([0-9]*\).*/\1.\2.\3-\4.\5/p')
KERNEL_ABI_VERSION=$(shell echo "$(KERNEL_UPLOAD_VERSION)" | sed -ne 's/\.[0-9]*$$//p')
KERNEL_VERSION=$(shell echo "$(KERNEL_ABI_VERSION)" | sed -ne 's/[\.\-][0-9]*$$//p')

# Get variants, assuming primary if debian/variants is not present
variants = --
ifneq (,$(wildcard debian/variants))
	variants := $(shell cat debian/variants)
endif

control_files := debian/control.common
# control files only wanted for the primary variant
primary_control_files := $(shell LC_ALL=C ls -d debian/control.d/primary debian/control.d/transitionals-* 2>/dev/null)
dkms_control_files :=
ifneq ($(filter --,$(variants)),)
	control_files += $(primary_control_files)
endif
control_files += $(filter-out $(primary_control_files) $(wildcard debian/control.d/dkms-*),$(shell LC_ALL=C ls -d debian/control.d/*))

SHELL := sh -e

clean: debian/control
	dh_testdir
	dh_testroot
	dh_clean

# DKMS
all_dkms_modules =
$(foreach _line,$(shell gawk '{ OFS = "!"; $$1 = $$1; print }' debian/dkms-versions), \
  $(eval _params = $(subst !, ,$(_line))) \
  $(eval _deb_pkgname = $(firstword $(_params))) \
  $(eval _deb_version = $(word 2,$(_params))) \
  $(if $(filter modulename=%,$(_params)), \
    $(eval _m = $(word 2,$(subst =, ,$(filter modulename=%,$(_params))))) \
    , \
    $(info modulename for $(_deb_pkgname) not specified in dkms-versions. Assume $(_deb_pkgname).) \
    $(eval _m = $(_deb_pkgname)) \
  ) \
  $(eval all_dkms_modules += $(_m)) \
  $(eval dkms_$(_m)_version = $(_deb_version)) \
  $(if $(filter arch=%,$(_params)), \
    $(eval dkms_$(_m)_archs = $(patsubst arch=%,%,$(filter arch=%,$(_params)))) \
    , \
    $(eval dkms_$(_m)_archs = any) \
  ) \
  $(eval dkms_$(_m)_rprovides = $(patsubst rprovides=%,%,$(filter rprovides=%,$(_params)))) \
  $(eval dkms_$(_m)_type = $(word 1,$(patsubst type=%,%,$(filter type=%,$(_params))) built-in)) \
  $(eval all_$(dkms_$(_m)_type)_dkms_modules += $(_m)) \
  $(if $(filter standalone,$(dkms_$(_m)_type)), \
    $(eval dkms_$(_m)_rprovides += $(_m)-prebuilt-kernel) \
    $(eval dkms_control_files += debian/control.d/dkms-$(_m)) \
  ) \
)
dkms_virtualbox_version=$(KERNEL_ABI_VERSION)
dkms_wireguard_version := 1.0.0

debian/control.d/dkms-%: module = $(patsubst debian/control.d/dkms-%,%,$@)
debian/control.d/dkms-%: module_archs = $(dkms_$(patsubst debian/control.d/dkms-%,%,$@)_archs)
debian/control.d/dkms-%: debian/control.dkms
	for cf in $(filter-out debian/control.common $(primary_control_files),$(control_files)); do \
	    flavour=$$(basename $$cf); \
	    flavour_archs=$$(gawk "/^Package: linux-image-$${flavour}\\\$$/ { getline; \$$1=\"\"; print; }" $$cf); \
	    available_archs=$${flavour_archs}; \
	    if ! test "$(module_archs)" = "any"; then \
	        available_archs=$$(echo "$${flavour_archs} $(module_archs)" | tr " " "\n" | sort | uniq -d); \
	        test -n "$${available_archs}" || continue; \
	    fi; \
	    [ "$$flavour" = "virtual" ] && continue; \
	    cat debian/control.dkms | sed \
	            -e "s/MODULE/$(module)/g" \
	            -e "s/ARCH/$${available_archs}/g" \
	            -e "s/FLAVOUR/$${flavour}/g"; \
	done >$@.tmp
	rm -f $@
	mv $@.tmp $@

debian/control: tp_key=test:provides\(-full\|-image\|-headers\|-modules-extra\)
debian/control: $(control_files) $(dkms_control_files)
	for i in $^; do \
		if grep -q "{variant:" $$i; then \
			variant_first='yes'; \
			for variant in $(variants); do \
				variant="$$(echo "$$variant" | sed -e 's/--//')"; \
				sed \
					-e "s/\$${variant:suffix}/$$variant/g" \
					-e "s/\(\$${$(tp_key)[^}]*}\)/$${variant_first:+\1}/g" \
					<$$i; \
				echo ""; \
				variant_first=''; \
			done; \
		else \
			cat $$i; \
			echo ""; \
		fi; \
	done | sed \
		-e 's/\$${$(tp_key)\([^}]*\)}/kernel-testing--$(KERNEL_SOURCE)-\1-\2,/g' \
		-e 's/@SERIES@/$(SERIES)/g' \
		-e 's/@KERNEL_ABI_VERSION@/$(KERNEL_ABI_VERSION)/g' \
		-e 's/@SRCPKGNAME@/$(SOURCE)/g' \
		-e 's/@KERNEL_SOURCE@/$(KERNEL_SOURCE)/g' \
	    >$@.tmp
	rm -f $@
	mv $@.tmp $@

.PHONY: debian/control

gencontrol_flags = -Vkernel-version=$(KERNEL_VERSION)
gencontrol_flags += -Vkernel-abi-version=$(KERNEL_ABI_VERSION)
gencontrol_flags += \
  $(foreach _m,$(all_dkms_modules), \
    $(if $(filter $(DEB_HOST_ARCH),$(subst any,$(DEB_HOST_ARCH),$(dkms_$(_m)_archs))), \
      $(if $(filter standalone,$(dkms_$(_m)_type)), \
        -Vdkms:$(_m)-modules="$(foreach _p,$(dkms_$(_m)_rprovides),$(_p) (= $(dkms_$(_m)_version))$(comma) )" \
        , \
        -Vdkms:$(_m)-modules="$(foreach _p,$(filter %-modules,$(dkms_$(_m)_rprovides)),$(_p) (= $(dkms_$(_m)_version))$(comma) )" \
      ) \
    ) \
  )
gencontrol_flags += -Vdkms:virtualbox-guest-modules="virtualbox-guest-modules (= $(dkms_virtualbox_version)),"
gencontrol_flags += -Vdkms:wireguard-linux-compat-modules="wireguard-modules (= $(dkms_wireguard_version)),"

gencontrol_flags += -Vkernel-default-branch="-jetson"
gencontrol_flags += -Vkernel-upload-version=$(KERNEL_UPLOAD_VERSION)

build-%:
	:

install-%: build-%
	dh_testdir
	dh_testroot
	dh_prep

binary-arch: t=-a
binary-indep: t=-i
binary-%: debian/control install-%
	dh_testdir
	dh_testroot

	dh_installdirs $(t)
	dh_installdocs $(t)
	dh_installchangelogs $(t)
	dh_compress $(t)
	dh_fixperms $(t)
	dh_installdeb $(t)
	dh_gencontrol $(t) -- $(gencontrol_flags)
	dh_md5sums $(t)
	dh_builddeb $(t)

build: build-indep build-arch
binary: binary-indep binary-arch

.PHONY: clean
