#!/usr/bin/make -f
# -*- makefile -*-
include /usr/share/dpkg/default.mk

# Common variables for all architectures
include debian/rules.d/common.mk

# Pull in some arch specific stuff
include debian/rules.d/arch/${DEB_BUILD_ARCH}.mk

BUILD_DIR ?= ${CURDIR}
KERNEL_SRC := linux
ZFS_SRC := zfs

%:
	dh $@ --with quilt

## Debian package metadata
debian/control: debian/templates/control.in
	sed -e 's/@KVNAME@/${KVNAME}/g' -e 's/@KVMAJMIN@/${KERNEL_MAJMIN}/g' < debian/templates/control.in > debian/control

debian/SOURCE:
	echo "git clone git@github.com:fabianishere/pve-edge-kernel.git \
		  git checkout ${PKG_GIT_VERSION} \
		  git submodule update --init --depth=1" > $@

## Debhelper phases
override_dh_quilt_patch:
	# Apply crack bundle
	git -C ${KERNEL_SRC} fetch ../crack.bundle $$(git -C ${KERNEL_SRC} ls-remote ../crack.bundle | cut -f1)
	git -C ${KERNEL_SRC} checkout -f FETCH_HEAD
	# Apply patches
	cd ${KERNEL_SRC}; \
		QUILT_PATCHES=../debian/patches  \
		QUILT_SERIES=series.linux \
		quilt --quiltrc /dev/null --color=always push -a || test $$? = 2
	cd ${ZFS_SRC}; \
    	QUILT_PATCHES=../debian/patches  \
    	QUILT_SERIES=series.zfs \
    	quilt --quiltrc /dev/null --color=always push -a || test $$? = 2

override_dh_quilt_unpatch:
	cd ${KERNEL_SRC}; \
		QUILT_PATCHES=../debian/patches \
		QUILT_SERIES=series.linux \
		quilt --quiltrc /dev/null pop -a || test $$? = 2
	cd ${ZFS_SRC}; \
    	QUILT_PATCHES=../debian/patches \
    	QUILT_SERIES=series.zfs \
    	quilt --quiltrc /dev/null pop -a || test $$? = 2
	rm -rf ${KERNEL_SRC}/.pc ${ZFS_SRC}/.pc

override_dh_autoreconf:
	dh_autoreconf -D ${ZFS_SRC}

override_dh_auto_configure: ${KERNEL_SRC}/.config

override_dh_auto_build:
	# Kernel
	dh_auto_build -D ${KERNEL_SRC} -- \
		CC="${PVE_KERNEL_CC}" \
		KCFLAGS="${PVE_KERNEL_CFLAGS}" \
		EXTRAVERSION="${EXTRAVERSION}" \
		LOCALVERSION="${LOCALVERSION}" \
		KBUILD_BUILD_VERSION_TIMESTAMP="${PKG_DISTRIBUTOR} ${DEB_VERSION} (${PKG_DATE_UTC_ISO})"
	# ZFS
	dh_auto_configure -D ${ZFS_SRC} -- CC="${PVE_ZFS_CC}" --with-config=kernel --with-linux=$(realpath ${KERNEL_SRC}) --with-linux-obj=$(realpath ${KERNEL_SRC})
	dh_auto_build -D ${ZFS_SRC}

override_dh_auto_install: debian/SOURCE .install_mark .tools_install_mark .headers_install_mark .usr_headers_install_mark
	dh_installdocs -A debian/copyright debian/SOURCE
	dh_installchangelogs
	dh_installman
	dh_strip_nondeterminism
	dh_compress
	dh_fixperms

override_dh_auto_clean: debian/control
	dh_clean
	dh_auto_clean -D ${KERNEL_SRC}
	dh_auto_clean -D ${ZFS_SRC}
	rm -f ${PVE_KERNEL_TEMPLATES} ${PVE_HEADER_TEMPLATES}
	rm -f debian/SOURCE debian/*.tmp .*_mark

## Kernel
PVE_KERNEL_TEMPLATES := $(patsubst debian/templates/pve-kernel.%.in, debian/${PVE_KERNEL_PKG}.%, $(wildcard debian/templates/pve-kernel.*.in))

${KERNEL_SRC}/.config:
	python3 ${KERNEL_SRC}/debian/scripts/misc/annotations -f ${KERNEL_SRC}/debian.master/config/annotations -a ${DEB_BUILD_ARCH} --export > ${KERNEL_SRC}/debian.master/config/config.ubuntu
	${KERNEL_SRC}/scripts/kconfig/merge_config.sh -m \
		-O ${KERNEL_SRC} \
		${KERNEL_SRC}/debian.master/config/config.ubuntu \
		debian/config/config.pve
	${MAKE} -C ${KERNEL_SRC} CC=${PVE_KERNEL_CC} olddefconfig

debian/${PVE_KERNEL_PKG}.%: debian/templates/pve-kernel.%.in
	sed -e 's/@@KVNAME@@/${KVNAME}/g' < debian/templates/pve-kernel.$*.in > debian/${PVE_KERNEL_PKG}.$*
	chmod +x debian/${PVE_KERNEL_PKG}.$*

.install_mark: ${PVE_KERNEL_TEMPLATES}
	rm -rf debian/${PVE_KERNEL_PKG}
	mkdir -p debian/${PVE_KERNEL_PKG}/lib/modules/${KVNAME}
	mkdir debian/${PVE_KERNEL_PKG}/boot
	install -m 644 ${KERNEL_SRC}/.config debian/${PVE_KERNEL_PKG}/boot/config-${KVNAME}
	install -m 644 ${KERNEL_SRC}/System.map debian/${PVE_KERNEL_PKG}/boot/System.map-${KVNAME}
	install -m 644 ${KERNEL_SRC}/${KERNEL_IMAGE_PATH} debian/${PVE_KERNEL_PKG}/boot/${KERNEL_INSTALL_FILE}-${KVNAME}
	${MAKE} -C ${KERNEL_SRC} INSTALL_MOD_PATH=${BUILD_DIR}/debian/${PVE_KERNEL_PKG}/ modules_install
	# install zfs drivers
	install -d -m 0755 debian/${PVE_KERNEL_PKG}/lib/modules/${KVNAME}/zfs
	install -m 644 ${ZFS_SRC}/module/avl/zavl.ko debian/${PVE_KERNEL_PKG}/lib/modules/${KVNAME}/zfs
	install -m 644 ${ZFS_SRC}/module/nvpair/znvpair.ko debian/${PVE_KERNEL_PKG}/lib/modules/${KVNAME}/zfs
	install -m 644 ${ZFS_SRC}/module/unicode/zunicode.ko debian/${PVE_KERNEL_PKG}/lib/modules/${KVNAME}/zfs
	install -m 644 ${ZFS_SRC}/module/zcommon/zcommon.ko debian/${PVE_KERNEL_PKG}/lib/modules/${KVNAME}/zfs
	install -m 644 ${ZFS_SRC}/module/icp/icp.ko debian/${PVE_KERNEL_PKG}/lib/modules/${KVNAME}/zfs
	install -m 644 ${ZFS_SRC}/module/zfs/zfs.ko debian/${PVE_KERNEL_PKG}/lib/modules/${KVNAME}/zfs
	install -m 644 ${ZFS_SRC}/module/lua/zlua.ko debian/${PVE_KERNEL_PKG}/lib/modules/${KVNAME}/zfs
	install -m 644 ${ZFS_SRC}/module/spl/spl.ko debian/${PVE_KERNEL_PKG}/lib/modules/${KVNAME}/zfs
	install -m 644 ${ZFS_SRC}/module/zstd/zzstd.ko debian/${PVE_KERNEL_PKG}/lib/modules/${KVNAME}/zfs
	# remove firmware
	rm -rf debian/${PVE_KERNEL_PKG}/lib/firmware
	# strip debug info
	find debian/${PVE_KERNEL_PKG}/lib/modules -name \*.ko -print | while read f ; do strip --strip-debug "$$f"; done
	# finalize
	/sbin/depmod -b debian/${PVE_KERNEL_PKG}/ ${KVNAME}
	# Autogenerate blacklist for watchdog devices (see README)
	install -m 0755 -d debian/${PVE_KERNEL_PKG}/lib/modprobe.d
	ls debian/${PVE_KERNEL_PKG}/lib/modules/${KVNAME}/kernel/drivers/watchdog/ > debian/watchdog-blacklist.tmp
	echo ipmi_watchdog.ko >> debian/watchdog-blacklist.tmp
	cat debian/watchdog-blacklist.tmp | sed -e 's/^/blacklist /' -e 's/.ko$$//' | sort -u > debian/${PVE_KERNEL_PKG}/lib/modprobe.d/blacklist_${PVE_KERNEL_PKG}.conf
	rm -f debian/${PVE_KERNEL_PKG}/lib/modules/${KVNAME}/source
	rm -f debian/${PVE_KERNEL_PKG}/lib/modules/${KVNAME}/build
	touch $@

## Kernel tools
.tools_compile_mark:
	dh_auto_build -D ${KERNEL_SRC}/tools/perf -- prefix=/usr \
		HAVE_NO_LIBBFD=1 \
		HAVE_CPLUS_DEMANGLE_SUPPORT=1 \
		NO_LIBPYTHON=1 \
		NO_LIBPERL=1 \
		NO_LIBCRYPTO=1 \
		PYTHON=python3
	echo "checking GPL-2 only perf binary for library linkage with incompatible licenses.."
	! ldd ${KERNEL_SRC}/tools/perf/perf | grep -q -E '\blibbfd'
	! ldd ${KERNEL_SRC}/tools/perf/perf | grep -q -E '\blibcrypto'
	${MAKE} -C ${KERNEL_SRC}/tools/perf man
	touch $@

.tools_install_mark: .tools_compile_mark
	rm -rf debian/${LINUX_TOOLS_PKG}
	mkdir -p debian/${LINUX_TOOLS_PKG}/usr/bin
	mkdir -p debian/${LINUX_TOOLS_PKG}/usr/share/man/man1
	install -m 755 ${BUILD_DIR}/${KERNEL_SRC}/tools/perf/perf debian/${LINUX_TOOLS_PKG}/usr/bin/perf_$(KERNEL_MAJMIN)
	for i in ${BUILD_DIR}/${KERNEL_SRC}/tools/perf/Documentation/*.1; do \
	    fname="$${i##*/}"; manname="$${fname%.1}"; \
	    install -m644 "$$i" "debian/${LINUX_TOOLS_PKG}/usr/share/man/man1/$${manname}_$(KERNEL_MAJMIN).1"; \
	done
	touch $@

## Headers
PVE_HEADER_TEMPLATES := $(patsubst debian/templates/pve-headers.%.in, debian/${PVE_HEADER_PKG}.%, $(wildcard debian/templates/pve-headers.*.in))

debian/${PVE_HEADER_PKG}.%: debian/templates/pve-headers.%.in
	sed -e 's/@@KVNAME@@/${KVNAME}/g' < debian/templates/pve-headers.$*.in > debian/${PVE_HEADER_PKG}.$*
	chmod +x debian/${PVE_HEADER_PKG}.$*

.headers_install_mark: ${PVE_HEADER_TEMPLATES}
	rm -rf debian/${PVE_HEADER_PKG}
	mkdir -p debian/${PVE_HEADER_PKG}/usr/src/linux-headers-${KVNAME}
	install -m 0644 ${KERNEL_SRC}/.config debian/${PVE_HEADER_PKG}/usr/src/linux-headers-${KVNAME}
	( \
		cd ${KERNEL_SRC}; \
		find . -path './debian/*' -prune \
               	-o -path './include/*' -prune \
                -o -path './scripts' -prune \
                -o -type f \
					\( \
						-name 'Makefile*' \
						-o -name 'Kconfig*' \
						-o -name 'Kbuild*' \
						-o -name '*.sh' \
						-o -name '*.pl' \
					\) \
					-print; \
		find include scripts -type f -o -type l; \
		find arch/${KERNEL_BUILD_ARCH} -maxdepth 1 -name Makefile\*; \
		find arch/${KERNEL_BUILD_ARCH} -name module.lds -o -name Kbuild.platforms -o -name Platform; \
		find $$(find arch/${KERNEL_BUILD_ARCH} -name include -o -name scripts -type d) -type f; \
		find arch/${KERNEL_BUILD_ARCH}/include Module.symvers include scripts -type f; \
		find tools/ -name 'objtool' -type f \
	) | rsync -avq --files-from=- ${KERNEL_SRC} debian/${PVE_HEADER_PKG}/usr/src/linux-headers-${KVNAME}
	mkdir -p debian/${PVE_HEADER_PKG}/lib/modules/${KVNAME}
	ln -sf /usr/src/linux-headers-${KVNAME} debian/${PVE_HEADER_PKG}/lib/modules/${KVNAME}/build
	touch $@

## User-space headers
.usr_headers_install_mark: PKG_DIR = debian/${PVE_USR_HEADER_PKG}
.usr_headers_install_mark: OUT_DIR = ${PKG_DIR}/usr
.usr_headers_install_mark:
	rm -rf '${PKG_DIR}'
	mkdir -p  '${PKG_DIR}'
	$(MAKE) -C ${KERNEL_SRC} headers_install ARCH=$(KERNEL_HEADER_ARCH) INSTALL_HDR_PATH='$(CURDIR)'/$(OUT_DIR)
	rm -rf $(OUT_DIR)/include/drm $(OUT_DIR)/include/scsi
	find $(OUT_DIR)/include \( -name .install -o -name ..install.cmd \) -execdir rm {} +
	# Move include/asm to arch-specific directory
	mkdir -p $(OUT_DIR)/include/$(DEB_HOST_MULTIARCH)
	mv $(OUT_DIR)/include/asm $(OUT_DIR)/include/$(DEB_HOST_MULTIARCH)/
	test ! -d $(OUT_DIR)/include/arch || \
		mv $(OUT_DIR)/include/arch $(OUT_DIR)/include/$(DEB_HOST_MULTIARCH)/
	touch $@
