#!/usr/bin/make -f

MAKEFLAGS += --no-print-directory
BUILD_DIR = debian/repackage

CONTROL_FILES = $(wildcard debian/templates/*.in)
ARCH := $(shell dpkg --print-architecture)
FEATURESETS = none rt

# helper to compare strings
strequ=$(if $(subst x$1,,x$2)$(subst x$2,,x$1),,1)

comma:= ,

# stem of kernel image packages
kstem := linux-image

ifeq ($(GBP_KERNELVERSION),)
$(error GBP_KERNELVERSION is not set.)
endif

# $(call get_package_data,<feature>)
define get_package_data
kbasepkg_$1 := $(if $(call strequ,$1,none),$(kstem)-$(ARCH),$(kstem)-$1-$(ARCH))
kversion_$1 := $(GBP_KERNELVERSION)
kversion_apt_$1 := $$(shell apt-cache policy $$(kbasepkg_$1) | awk '/  Candidate: /{print $$$$2}')
$$(if $$(call strequ,$$(kversion_$1),$$(kversion_apt_$1)),,$$(error Check for update: $$(kbasepkg_$1) $$(kversion_$1) configured$(comma) but candidate is $$(kversion_apt_$1)))
kbasepkgfilename_$1 := $$(shell basename $$$$(apt-cache show $$(kbasepkg_$1)=$$(kversion_$1) | awk '/^Filename: /{print $$$$2}'))
kpkg_$1 := $$(shell apt-cache show $$(kbasepkg_$1)=$$(kversion_$1) | awk '/^Depends: /{print $$$$2}')
kpkgfilename_$1 := $$(shell basename $$$$(apt-cache show $$(kpkg_$1) | awk '/^Filename: /{print $$$$2}'))
nerve_pkg_$1 := $$(subst $(kstem)-,nerve-$(kstem)-slim-,$$(kpkg_$1))
nerve_basepkg_$1 := $$(subst $(kstem)-,nerve-$(kstem)-slim-,$$(kbasepkg_$1))
deb_version_$1 := $$(subst $(kstem)-,,$$(kpkg_$1))
kdebversion_$1 := $$(subst _$$(ARCH).deb,,$$(subst $$(kpkg_$1)_,,$$(kpkgfilename_$1)))
kbasedebversion_$1 := $$(subst _$$(ARCH).deb,,$$(subst $$(kbasepkg_$1)_,,$$(kbasepkgfilename_$1)))
endef

$(foreach feature,$(FEATURESETS),$(eval $(call get_package_data,$(feature))))

# uncomment for debugging
#$(foreach feature,$(FEATURESETS),$(info kversion_$(feature)=$(kversion_$(feature))))
#$(foreach feature,$(FEATURESETS),$(info kversion_apt_$(feature)=$(kversion_apt_$(feature))))
#$(foreach feature,$(FEATURESETS),$(info kbasepkg_$(feature)=$(kbasepkg_$(feature))))
#$(foreach feature,$(FEATURESETS),$(info kbasepkgfilename_$(feature)=$(kbasepkgfilename_$(feature))))
#$(foreach feature,$(FEATURESETS),$(info kpkg_$(feature)=$(kpkg_$(feature))))
#$(foreach feature,$(FEATURESETS),$(info kpkgfilename_$(feature)=$(kpkgfilename_$(feature))))
#$(foreach feature,$(FEATURESETS),$(info nerve_pkg_$(feature)=$(nerve_pkg_$(feature))))
#$(foreach feature,$(FEATURESETS),$(info nerve_basepkg_$(feature)=$(nerve_basepkg_$(feature))))
#$(foreach feature,$(FEATURESETS),$(info deb_version_$(feature)=$(deb_version_$(feature))))
#$(foreach feature,$(FEATURESETS),$(info kdebversion_$(feature)=$(kdebversion_$(feature))))
#$(foreach feature,$(FEATURESETS),$(info kbasedebversion_$(feature)=$(kbasedebversion_$(feature))))

# $(call download_debs_rule,<feature>)
define download_debs_rule
$(BUILD_DIR)/$1/$(ARCH)/$(kpkgfilename_$1):
	@echo "Downloading $(kpkg_$1)"
	@mkdir -p $$(@D) && \
	cd $$(@D) && \
	apt-get download $(kpkg_$1)=$(kdebversion_$1)

$(BUILD_DIR)/$1/$(ARCH)/$(kbasepkgfilename_$1):
	@echo "Downloading $(kbasepkg_$1)"
	@mkdir -p $$(@D) && \
	cd $$(@D) && \
	apt-get download $(kbasepkg_$1)=$(kbasedebversion_$1)
endef

$(foreach feature,$(FEATURESETS),$(eval $(call download_debs_rule,$(feature))))

# $(call unpack_debs_rule,<feature>)
define unpack_debs_rule
$(BUILD_DIR)/$1/$(ARCH)/$(kpkg_$1)/debian-binary: $(BUILD_DIR)/$1/$(ARCH)/$(kpkgfilename_$1)
	@echo "Unpacking and stripping $(kpkgfilename_$1)"
	@mkdir -p $(BUILD_DIR)/$1/$(ARCH)/$(kpkg_$1)/CONTENTS && ar p $$< data.tar.xz | tar -C $(BUILD_DIR)/$1/$(ARCH)/$(kpkg_$1)/CONTENTS --exclude ./usr/share/doc/* -Jxf -
	@# now filter unwanted items
	@modules_order=$$$$(ls -1 $(BUILD_DIR)/$1/$(ARCH)/$(kpkg_$1)/CONTENTS/lib/modules/*/modules.order);\
	while read -r line; do \
	  line=$$$$(echo "$$$$line" | awk '{$$$$1=$$$$1};NF'); \
	  [ -z "$$$$line" ] && continue; \
	  case $$$$line in \#*) continue;; esac; \
	  rm -rf $(BUILD_DIR)/$1/$(ARCH)/$(kpkg_$1)/CONTENTS/lib/modules/$(deb_version_$1)/$$$${line}; \
	  esc_line=$$$$(echo "$$$${line}" | sed 's#/#\\\/#g'); \
	  sed -i -e '/'$$$${esc_line}'/d' $$$${modules_order}; \
	done < debian/blacklist
endef

$(foreach feature,$(FEATURESETS),$(eval $(call unpack_debs_rule,$(feature))))

# $(call debian_install_rules,<feature>)
# for *.install, *.prerm, *.postrm, *.preinst and *.postinst
define debian_install_rules

debian/$(nerve_pkg_$1).%: $(BUILD_DIR)/$1/$(ARCH)/$(kpkgfilename_$1)
	@ar p $(BUILD_DIR)/$1/$(ARCH)/$(kpkgfilename_$1) control.tar.xz | \
	tar -JOxf - ./$$(patsubst debian/$(nerve_pkg_$1).%,%,$$@) > $$@

debian/$(nerve_pkg_$1).install:
	@echo "Generating $$@"
	@echo "$(BUILD_DIR)/$1/$(ARCH)/$(kpkg_$1)/CONTENTS/* /" > $$@

debian/$(nerve_basepkg_$1).install:
	@echo "Generating $$@"
	@mkdir -p $(BUILD_DIR)/$1/$(ARCH)/$(kbasepkg_$1)/CONTENTS/usr/share/doc
	@ln -s $(nerve_pkg_$1) $(BUILD_DIR)/$1/$(ARCH)/$(kbasepkg_$1)/CONTENTS/usr/share/doc/$(nerve_basepkg_$1)
	@echo "$(BUILD_DIR)/$1/$(ARCH)/$(kbasepkg_$1)/CONTENTS/* /" > $$@

endef

$(foreach feature,$(FEATURESETS),$(eval $(call debian_install_rules,$(feature))))

# $(call sh_read_control,<deb file>)
# helper to read debian/control to stdout
sh_read_control = ar p $1 control.tar.xz | tar -JOxf - ./control

debian/control: $(CONTROL_FILES) $(BUILD_DIR)/changelog.updated $(foreach feature,$(FEATURESETS),$(BUILD_DIR)/$(feature)/$(ARCH)/$(kpkgfilename_$(feature)) $(BUILD_DIR)/$(feature)/$(ARCH)/$(kbasepkgfilename_$(feature)) )
	@echo "Generating $@"
	@cp debian/templates/control.in $@
	@$(foreach feature,$(FEATURESETS),\
	  ORIG=$$($(call sh_read_control,$(BUILD_DIR)/$(feature)/$(ARCH)/$(kpkgfilename_$(feature))) | awk '/^Package:/{print $$2}') && \
	  $(call sh_read_control,$(BUILD_DIR)/$(feature)/$(ARCH)/$(kpkgfilename_$(feature))) | \
	  sed -e 's/^Package: $(kstem)/Package: nerve-$(kstem)-slim/g' \
              -e '/^Source:.*/d' \
	      -e '/^Maintainer:.*/d' \
	      -e '/^Version:.*/d' \
	      -e '/^Installed-Size:/d' \
	      -e "s/^Conflicts: /Conflicts: $${ORIG},/g" \
	      -e "s/^Replaces: /Replaces: $${ORIG},/g" \
	      -e 's/^\(Description: .*\)(signed)/\1(slim version for Nerve)/g' | \
	  sed -e 's/^Replaces: \(.*\)/Replaces: \1\nProvides: \1/g' >> $@ && \
	  echo "" >> $@; \
	  ORIG=$$($(call sh_read_control,$(BUILD_DIR)/$(feature)/$(ARCH)/$(kbasepkgfilename_$(feature))) | awk '/^Package:/{print $$2}') && \
	  $(call sh_read_control,$(BUILD_DIR)/$(feature)/$(ARCH)/$(kbasepkgfilename_$(feature))) | \
	  sed -e 's/^Package: $(kstem)/Package: nerve-$(kstem)-slim/g' \
              -e '/^Source:.*/d' \
	      -e '/^Maintainer:.*/d' \
	      -e '/^Version:.*/d' \
	      -e '/^Installed-Size:/d' \
	      -e "s/^Depends: $(kstem).*/Depends: $(nerve_pkg_$(feature)) (= $$(dpkg-parsechangelog -SVersion))/g" \
	      -e "s/^Provides: /Provides: $${ORIG},/g" \
	      >> $@ && \
	  echo "Conflicts: $${ORIG}" >> $@ && \
	  echo "Replaces: $${ORIG}" >> $@ && \
	  echo "" >> $@; \
	)

$(BUILD_DIR)/none/$(ARCH)/$(kpkg_none)/%: $(BUILD_DIR)/none/$(ARCH)/$(kpkgfilename_none)
	@mkdir -p $(@D)
	@name=$$(ar p $< data.tar.xz | tar -Jtvf - | grep -e "/usr/share/doc/.*/$$(basename $@)" | awk '{print $$6}'); \
	ar p $< data.tar.xz | tar -JOxf - $${name} > $@

debian/copyright: $(BUILD_DIR)/none/$(ARCH)/$(kpkg_none)/copyright
	@echo "Generating $@"
	@awk '/^Files: debian\/\*/{ found=1; print $$0 "\nCopyright: 2023 Nerve Development Team <dev@nerve.cloud>\nLicense: GPL-2"; next} \
	    /^\s*$$/ {found=0; print $$0; next } \
	  found!=1 {print $$0}' $< > $@

$(BUILD_DIR)/changelog.updated: $(BUILD_DIR)/none/$(ARCH)/$(kpkg_none)/changelog.gz
	@echo "Updating debian/changelog"
	@[ ! -f debian/changelog.orig ] && cp debian/changelog $(BUILD_DIR)/changelog.orig
	@ORIGVERSION=$$(gunzip -c $< | dpkg-parsechangelog -SVersion -l -); \
	PKGVERSION=$$(dpkg-parsechangelog -SVersion -l $(BUILD_DIR)/changelog.orig); \
	awk '/^nerve-linux-slim /{++f;p=1}p&&f==1;/^ -- /{p=0}' $(BUILD_DIR)/changelog.orig | \
	sed -e "s/^nerve-linux-slim ($${PKGVERSION})/nerve-linux-slim ($${ORIGVERSION}+$${PKGVERSION})/" > debian/changelog
	@sed -i "s/$$(dpkg-parsechangelog -Smaintainer)  $$(dpkg-parsechangelog -Sdate)/$$(dpkg-parsechangelog -Smaintainer)  $$(date -R)/" debian/changelog
	@echo "" >> debian/changelog
	@gunzip -c $< >> debian/changelog
	@touch $@

prepare: $(foreach feature,$(FEATURESETS),debian/$(nerve_pkg_$(feature)).install)
prepare: $(foreach feature,$(FEATURESETS),debian/$(nerve_pkg_$(feature)).prerm)
prepare: $(foreach feature,$(FEATURESETS),debian/$(nerve_pkg_$(feature)).preinst)
prepare: $(foreach feature,$(FEATURESETS),debian/$(nerve_pkg_$(feature)).postrm)
prepare: $(foreach feature,$(FEATURESETS),debian/$(nerve_pkg_$(feature)).postinst)
prepare: $(foreach feature,$(FEATURESETS),debian/$(nerve_basepkg_$(feature)).install)
prepare: debian/control
prepare: debian/copyright
prepare: $(BUILD_DIR)/changelog.updated

prepare-clean:
	@if [ -f $(BUILD_DIR)/changelog.orig ]; then mv $(BUILD_DIR)/changelog.orig debian/changelog; fi
	@rm -rf $(BUILD_DIR)
	@rm -f debian/control
	@rm -f debian/copyright
	@rm -f debian/nerve-$(kstem)-slim*.install
	@rm -f debian/nerve-$(kstem)-slim*.prerm
	@rm -f debian/nerve-$(kstem)-slim*.preinst
	@rm -f debian/nerve-$(kstem)-slim*.postrm
	@rm -f debian/nerve-$(kstem)-slim*.postinst

%:
	dh $@

install: $(foreach feature,$(FEATURESETS),$(BUILD_DIR)/$(feature)/$(ARCH)/$(kpkg_$(feature))/debian-binary )

override_dh_strip_nondeterminism:;
override_dh_strip:;
override_dh_makeshlibs:;
override_dh_shlibdeps:;

.PHONY: prepare prepare-clean

