1#!/bin/sh
2#
3# Copyright 2003 Wichert Akkerman <wichert@wiggy.net>
4#
5# Simple script to generate a debian/ directory for a Linux kernel.
6
7set -eu
8
9is_enabled() {
10	grep -q "^$1=y" include/config/auto.conf
11}
12
13if_enabled_echo() {
14	if is_enabled "$1"; then
15		echo -n "$2"
16	elif [ $# -ge 3 ]; then
17		echo -n "$3"
18	fi
19}
20
21set_debarch() {
22	if [ "${KBUILD_DEBARCH:+set}" ]; then
23		debarch="$KBUILD_DEBARCH"
24		return
25	fi
26
27	# Attempt to find the correct Debian architecture
28	case "$UTS_MACHINE" in
29	i386|alpha|m68k|riscv*)
30		debarch="$UTS_MACHINE" ;;
31	x86_64)
32		debarch=amd64 ;;
33	sparc*)
34		debarch=sparc$(if_enabled_echo CONFIG_64BIT 64) ;;
35	s390*)
36		debarch=s390x ;;
37	ppc*)
38		if is_enabled CONFIG_64BIT; then
39			debarch=ppc64$(if_enabled_echo CONFIG_CPU_LITTLE_ENDIAN el)
40		else
41			debarch=powerpc$(if_enabled_echo CONFIG_SPE spe)
42		fi
43		;;
44	parisc*)
45		debarch=hppa ;;
46	mips*)
47		if is_enabled CONFIG_CPU_LITTLE_ENDIAN; then
48			debarch=mips$(if_enabled_echo CONFIG_64BIT 64)$(if_enabled_echo CONFIG_CPU_MIPSR6 r6)el
49		elif is_enabled CONFIG_CPU_MIPSR6; then
50			debarch=mips$(if_enabled_echo CONFIG_64BIT 64)r6
51		else
52			debarch=mips
53		fi
54		;;
55	aarch64|arm64)
56		debarch=arm64 ;;
57	arm*)
58		if is_enabled CONFIG_AEABI; then
59			debarch=arm$(if_enabled_echo CONFIG_VFP hf el)
60		else
61			debarch=arm
62		fi
63		;;
64	openrisc)
65		debarch=or1k ;;
66	sh)
67		if is_enabled CONFIG_CPU_SH3; then
68			debarch=sh3$(if_enabled_echo CONFIG_CPU_BIG_ENDIAN eb)
69		elif is_enabled CONFIG_CPU_SH4; then
70			debarch=sh4$(if_enabled_echo CONFIG_CPU_BIG_ENDIAN eb)
71		fi
72		;;
73	esac
74	if [ -z "$debarch" ]; then
75		debarch=$(dpkg-architecture -qDEB_HOST_ARCH)
76		echo "" >&2
77		echo "** ** **  WARNING  ** ** **" >&2
78		echo "" >&2
79		echo "Your architecture doesn't have its equivalent" >&2
80		echo "Debian userspace architecture defined!" >&2
81		echo "Falling back to the current host architecture ($debarch)." >&2
82		echo "Please add support for $UTS_MACHINE to ${0} ..." >&2
83		echo "" >&2
84	fi
85}
86
87# Create debian/source/ if it is a source package build
88gen_source ()
89{
90	mkdir -p debian/source
91
92	echo "3.0 (quilt)" > debian/source/format
93
94	{
95		echo "diff-ignore"
96		echo "extend-diff-ignore = .*"
97	} > debian/source/local-options
98
99	# Add .config as a patch
100	mkdir -p debian/patches
101	{
102		echo "Subject: Add .config"
103		echo "Author: ${maintainer}"
104		echo
105		echo "--- /dev/null"
106		echo "+++ linux/.config"
107		diff -u /dev/null "${KCONFIG_CONFIG}" | tail -n +3
108	} > debian/patches/config.patch
109	echo config.patch > debian/patches/series
110
111	"${srctree}/scripts/package/gen-diff-patch" debian/patches/diff.patch
112	if [ -s debian/patches/diff.patch ]; then
113		sed -i "
114			1iSubject: Add local diff
115			1iAuthor: ${maintainer}
116			1i
117		" debian/patches/diff.patch
118
119		echo diff.patch >> debian/patches/series
120	else
121		rm -f debian/patches/diff.patch
122	fi
123}
124
125rm -rf debian
126mkdir debian
127
128user=${KBUILD_BUILD_USER:-$(id -nu)}
129name=${DEBFULLNAME:-${user}}
130if [ "${DEBEMAIL:+set}" ]; then
131	email=${DEBEMAIL}
132else
133	buildhost=${KBUILD_BUILD_HOST:-$(hostname -f 2>/dev/null || hostname)}
134	email="${user}@${buildhost}"
135fi
136maintainer="${name} <${email}>"
137
138while [ $# -gt 0 ]; do
139	case "$1" in
140	--need-source)
141		gen_source
142		shift
143		;;
144	*)
145		break
146		;;
147	esac
148done
149
150# Some variables and settings used throughout the script
151version=$KERNELRELEASE
152if [ "${KDEB_PKGVERSION:+set}" ]; then
153	packageversion=$KDEB_PKGVERSION
154else
155	packageversion=$(${srctree}/scripts/setlocalversion --no-local ${srctree})-$($srctree/scripts/build-version)
156fi
157sourcename=${KDEB_SOURCENAME:-linux-upstream}
158
159if [ "$ARCH" = "um" ] ; then
160	packagename=user-mode-linux
161else
162	packagename=linux-image
163fi
164
165debarch=
166set_debarch
167
168# Try to determine distribution
169if [ "${KDEB_CHANGELOG_DIST:+set}" ]; then
170        distribution=$KDEB_CHANGELOG_DIST
171# In some cases lsb_release returns the codename as n/a, which breaks dpkg-parsechangelog
172elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ] && [ "$distribution" != "n/a" ]; then
173        : # nothing to do in this case
174else
175        distribution="unstable"
176        echo >&2 "Using default distribution of 'unstable' in the changelog"
177        echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly"
178fi
179
180echo $debarch > debian/arch
181
182host_gnu=$(dpkg-architecture -a "${debarch}" -q DEB_HOST_GNU_TYPE | sed 's/_/-/g')
183
184# Generate a simple changelog template
185cat <<EOF > debian/changelog
186$sourcename ($packageversion) $distribution; urgency=low
187
188  * Custom built Linux kernel.
189
190 -- $maintainer  $(date -R)
191EOF
192
193# Generate a control file
194cat <<EOF > debian/control
195Source: $sourcename
196Section: kernel
197Priority: optional
198Maintainer: $maintainer
199Rules-Requires-Root: no
200Build-Depends: debhelper-compat (= 12)
201Build-Depends-Arch: bc, bison, cpio, flex,
202 gcc-${host_gnu} <!pkg.${sourcename}.nokernelheaders>,
203 kmod, libelf-dev:native,
204 libssl-dev:native, libssl-dev <!pkg.${sourcename}.nokernelheaders>,
205 rsync
206Homepage: https://www.kernel.org/
207
208Package: $packagename-$version
209Architecture: $debarch
210Description: Linux kernel, version $version
211 This package contains the Linux kernel, modules and corresponding other
212 files, version: $version.
213EOF
214
215if [ "${SRCARCH}" != um ]; then
216cat <<EOF >> debian/control
217
218Package: linux-libc-dev
219Section: devel
220Provides: linux-kernel-headers
221Architecture: $debarch
222Description: Linux support headers for userspace development
223 This package provides userspaces headers from the Linux kernel.  These headers
224 are used by the installed headers for GNU glibc and other system libraries.
225Multi-Arch: same
226EOF
227
228if is_enabled CONFIG_MODULES; then
229cat <<EOF >> debian/control
230
231Package: linux-headers-$version
232Architecture: $debarch
233Build-Profiles: <!pkg.${sourcename}.nokernelheaders>
234Description: Linux kernel headers for $version on $debarch
235 This package provides kernel header files for $version on $debarch
236 .
237 This is useful for people who need to build external modules
238EOF
239fi
240fi
241
242if is_enabled CONFIG_DEBUG_INFO; then
243cat <<EOF >> debian/control
244
245Package: linux-image-$version-dbg
246Section: debug
247Architecture: $debarch
248Build-Profiles: <!pkg.${sourcename}.nokerneldbg>
249Description: Linux kernel debugging symbols for $version
250 This package will come in handy if you need to debug the kernel. It provides
251 all the necessary debug symbols for the kernel and its modules.
252EOF
253fi
254
255cat <<EOF > debian/rules.vars
256ARCH := ${ARCH}
257KERNELRELEASE := ${KERNELRELEASE}
258EOF
259
260cp "${srctree}/scripts/package/debian/copyright" debian/
261cp "${srctree}/scripts/package/debian/rules" debian/
262
263exit 0
264