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

set -e

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 [ -n "$KBUILD_DEBARCH" ] ; then
		debarch="$KBUILD_DEBARCH"
		return
	fi

	# Attempt to find the correct Debian architecture
	case "$UTS_MACHINE" in
	i386|ia64|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
		;;
	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

email=${DEBEMAIL-$EMAIL}

# use email string directly if it contains <email>
if echo "${email}" | grep -q '<.*>'; then
	maintainer=${email}
else
	# or construct the maintainer string
	user=${KBUILD_BUILD_USER-$(id -nu)}
	name=${DEBFULLNAME-${user}}
	if [ -z "${email}" ]; then
		buildhost=${KBUILD_BUILD_HOST-$(hostname -f 2>/dev/null || hostname)}
		email="${user}@${buildhost}"
	fi
	maintainer="${name} <${email}>"
fi

if [ "$1" = --need-source ]; then
	gen_source
fi

# Some variables and settings used throughout the script
version=$KERNELRELEASE
if [ -n "$KDEB_PKGVERSION" ]; then
	packageversion=$KDEB_PKGVERSION
else
	packageversion=$(${srctree}/scripts/setlocalversion --no-local ${srctree})-$($srctree/init/build-version)
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 [ -n "$KDEB_CHANGELOG_DIST" ]; 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
extra_build_depends=", $(if_enabled_echo CONFIG_UNWINDER_ORC libelf-dev:native)"
extra_build_depends="$extra_build_depends, $(if_enabled_echo CONFIG_SYSTEM_TRUSTED_KEYRING libssl-dev:native)"

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

  * Custom built GNU Linux-libre.

 -- $maintainer  $(date -R)
EOF

# Generate copyright file
cat <<EOF > debian/copyright
This is a packaged upstream version of the GNU Linux-libre.

The sources may be found at most Linux archive sites, including:
https://linux-libre.fsfla.org/

Copyright: 1991 - 2018 Linus Torvalds and others.

The git repository for mainline kernel development is at:
/*(DEBLOBBED)*/

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; version 2 dated June, 1991.

On Debian GNU/Linux systems, the complete text of the GNU General Public
License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
EOF

# Generate a control file
cat <<EOF > debian/control
Source: $sourcename
Section: kernel
Priority: optional
Maintainer: $maintainer
Rules-Requires-Root: no
Build-Depends: bc, debhelper, rsync, kmod, cpio, bison, flex $extra_build_depends
Homepage: https://linux-libre.fsfla.org/

Package: $packagename-$version
Architecture: $debarch
Description: GNU Linux-libre, version $version
 This package contains the GNU Linux-libre, modules and corresponding other
 files, version: $version.
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 GNU Linux-libre.  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-$version
Architecture: $debarch
Description: GNU Linux-libre headers for $version on $debarch
 This package provides kernel header files for $version 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-$version-dbg
Section: debug
Architecture: $debarch
Description: GNU Linux-libre debugging symbols for $version
 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
#!$(command -v $MAKE) -f

srctree ?= .
KERNELRELEASE = ${KERNELRELEASE}

.PHONY: clean build build-arch build-indep binary binary-arch binary-indep

build-indep:
build-arch:
	\$(MAKE) -f \$(srctree)/Makefile ARCH=${ARCH} \
	KERNELRELEASE=\$(KERNELRELEASE) \
	\$(shell \$(srctree)/scripts/package/deb-build-option) \
	olddefconfig all

build: build-arch

binary-indep:
binary-arch: build-arch
	\$(MAKE) -f \$(srctree)/Makefile ARCH=${ARCH} \
	KERNELRELEASE=\$(KERNELRELEASE) intdeb-pkg

clean:
	rm -rf debian/files debian/linux-*
	\$(MAKE) -f \$(srctree)/Makefile ARCH=${ARCH} clean

binary: binary-arch
EOF
chmod +x debian/rules

exit 0
