#!/bin/sh
#
# Copyright 2003 Wichert Akkerman <wichert@wiggy.net>
#
# Simple script to generate a debian/ directory for a Linux kernel.

set -eu

is_enabled() {
	grep -q "^$1=y" include/config/auto.conf
}

if_enabled_echo() {
	if is_enabled "$1"; then
		echo -n "$2"
	elif [ $# -ge 3 ]; then
		echo -n "$3"
	fi
}

set_debarch() {
	if [ "${KBUILD_DEBARCH:+set}" ]; then
		debarch="$KBUILD_DEBARCH"
		return
	fi

	# Attempt to find the correct Debian architecture
	case "$UTS_MACHINE" in
	i386|alpha|m68k|riscv*)
		debarch="$UTS_MACHINE" ;;
	x86_64)
		debarch=amd64 ;;
	sparc*)
		debarch=sparc$(if_enabled_echo CONFIG_64BIT 64) ;;
	s390*)
		debarch=s390x ;;
	ppc*)
		if is_enabled CONFIG_64BIT; then
			debarch=ppc64$(if_enabled_echo CONFIG_CPU_LITTLE_ENDIAN el)
		else
			debarch=powerpc$(if_enabled_echo CONFIG_SPE spe)
		fi
		;;
	parisc*)
		debarch=hppa ;;
	mips*)
		if is_enabled CONFIG_CPU_LITTLE_ENDIAN; then
			debarch=mips$(if_enabled_echo CONFIG_64BIT 64)$(if_enabled_echo CONFIG_CPU_MIPSR6 r6)el
		elif is_enabled CONFIG_CPU_MIPSR6; then
			debarch=mips$(if_enabled_echo CONFIG_64BIT 64)r6
		else
			debarch=mips
		fi
		;;
	aarch64|arm64)
		debarch=arm64 ;;
	arm*)
		if is_enabled CONFIG_AEABI; then
			debarch=arm$(if_enabled_echo CONFIG_VFP hf el)
		else
			debarch=arm
		fi
		;;
	openrisc)
		debarch=or1k ;;
	sh)
		if is_enabled CONFIG_CPU_SH3; then
			debarch=sh3$(if_enabled_echo CONFIG_CPU_BIG_ENDIAN eb)
		elif is_enabled CONFIG_CPU_SH4; then
			debarch=sh4$(if_enabled_echo CONFIG_CPU_BIG_ENDIAN eb)
		fi
		;;
	um)
		if is_enabled CONFIG_64BIT; then
			debarch=amd64
		else
			debarch=i386
		fi
		;;
	loongarch64)
		debarch=loong64 ;;
	esac
	if [ -z "$debarch" ]; then
		debarch=$(dpkg-architecture -qDEB_HOST_ARCH)
		echo "" >&2
		echo "** ** **  WARNING  ** ** **" >&2
		echo "" >&2
		echo "Your architecture doesn't have its equivalent" >&2
		echo "Debian userspace architecture defined!" >&2
		echo "Falling back to the current host architecture ($debarch)." >&2
		echo "Please add support for $UTS_MACHINE to ${0} ..." >&2
		echo "" >&2
	fi
}

# Create debian/source/ if it is a source package build
gen_source ()
{
	mkdir -p debian/source

	echo "3.0 (quilt)" > debian/source/format

	{
		echo "diff-ignore"
		echo "extend-diff-ignore = .*"
	} > debian/source/local-options

	# Add .config as a patch
	mkdir -p debian/patches
	{
		echo "Subject: Add .config"
		echo "Author: ${maintainer}"
		echo
		echo "--- /dev/null"
		echo "+++ linux/.config"
		diff -u /dev/null "${KCONFIG_CONFIG}" | tail -n +3
	} > debian/patches/config.patch
	echo config.patch > debian/patches/series

	"${srctree}/scripts/package/gen-diff-patch" debian/patches/diff.patch
	if [ -s debian/patches/diff.patch ]; then
		sed -i "
			1iSubject: Add local diff
			1iAuthor: ${maintainer}
			1i
		" debian/patches/diff.patch

		echo diff.patch >> debian/patches/series
	else
		rm -f debian/patches/diff.patch
	fi
}

rm -rf debian
mkdir debian

user=${KBUILD_BUILD_USER:-$(id -nu)}
name=${DEBFULLNAME:-${user}}
if [ "${DEBEMAIL:+set}" ]; then
	email=${DEBEMAIL}
else
	buildhost=${KBUILD_BUILD_HOST:-$(hostname -f 2>/dev/null || hostname)}
	email="${user}@${buildhost}"
fi
maintainer="${name} <${email}>"

while [ $# -gt 0 ]; do
	case "$1" in
	--need-source)
		gen_source
		shift
		;;
	*)
		break
		;;
	esac
done

# Some variables and settings used throughout the script
if [ "${KDEB_PKGVERSION:+set}" ]; then
	packageversion=$KDEB_PKGVERSION
else
	upstream_version=$("${srctree}/scripts/setlocalversion" --no-local "${srctree}" | sed 's/-\(rc[1-9]\)/~\1/')
	debian_revision=$("${srctree}/scripts/build-version")
	packageversion=${upstream_version}-${debian_revision}
fi
sourcename=${KDEB_SOURCENAME:-linux-upstream}

if [ "$ARCH" = "um" ] ; then
	packagename=user-mode-linux
else
	packagename=linux-image
fi

debarch=
set_debarch

# Try to determine distribution
if [ "${KDEB_CHANGELOG_DIST:+set}" ]; then
        distribution=$KDEB_CHANGELOG_DIST
# In some cases lsb_release returns the codename as n/a, which breaks dpkg-parsechangelog
elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ] && [ "$distribution" != "n/a" ]; then
        : # nothing to do in this case
else
        distribution="unstable"
        echo >&2 "Using default distribution of 'unstable' in the changelog"
        echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly"
fi

echo $debarch > debian/arch

host_gnu=$(dpkg-architecture -a "${debarch}" -q DEB_HOST_GNU_TYPE | sed 's/_/-/g')

# Generate a simple changelog template
cat <<EOF > debian/changelog
$sourcename ($packageversion) $distribution; urgency=low

  * Custom built Linux kernel.

 -- $maintainer  $(date -R)
EOF

# Generate a control file
cat <<EOF > debian/control
Source: $sourcename
Section: kernel
Priority: optional
Maintainer: $maintainer
Rules-Requires-Root: no
Build-Depends: debhelper-compat (= 12)
Build-Depends-Arch: bc, bison, flex,
 gcc-${host_gnu} <!pkg.${sourcename}.nokernelheaders>,
 kmod, libdw-dev:native, libelf-dev:native,
 libssl-dev:native, libssl-dev <!pkg.${sourcename}.nokernelheaders>,
 python3:native, rsync
Homepage: https://www.kernel.org/

Package: $packagename-${KERNELRELEASE}
Architecture: $debarch
Description: Linux kernel, version ${KERNELRELEASE}
 This package contains the Linux kernel, modules and corresponding other
 files, version: ${KERNELRELEASE}.
EOF

if [ "${SRCARCH}" != um ]; then
cat <<EOF >> debian/control

Package: linux-libc-dev
Section: devel
Provides: linux-kernel-headers
Architecture: $debarch
Description: Linux support headers for userspace development
 This package provides userspaces headers from the Linux kernel.  These headers
 are used by the installed headers for GNU glibc and other system libraries.
Multi-Arch: same
EOF

if is_enabled CONFIG_MODULES; then
cat <<EOF >> debian/control

Package: linux-headers-${KERNELRELEASE}
Architecture: $debarch
Build-Profiles: <!pkg.${sourcename}.nokernelheaders>
Description: Linux kernel headers for ${KERNELRELEASE} on $debarch
 This package provides kernel header files for ${KERNELRELEASE} on $debarch
 .
 This is useful for people who need to build external modules
EOF
fi
fi

if is_enabled CONFIG_DEBUG_INFO; then
cat <<EOF >> debian/control

Package: linux-image-${KERNELRELEASE}-dbg
Section: debug
Architecture: $debarch
Build-Profiles: <!pkg.${sourcename}.nokerneldbg>
Description: Linux kernel debugging symbols for ${KERNELRELEASE}
 This package will come in handy if you need to debug the kernel. It provides
 all the necessary debug symbols for the kernel and its modules.
EOF
fi

cat <<EOF > debian/rules.vars
ARCH := ${ARCH}
KERNELRELEASE := ${KERNELRELEASE}
EOF

cp "${srctree}/scripts/package/debian/copyright" debian/
cp "${srctree}/scripts/package/debian/rules" debian/

exit 0
