xref: /linux/scripts/package/mkdebian (revision eb47ee018173f144f10eb38a3f7bd9f17ec6329e)
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	um)
74		if is_enabled CONFIG_64BIT; then
75			debarch=amd64
76		else
77			debarch=i386
78		fi
79		;;
80	loongarch64)
81		debarch=loong64 ;;
82	esac
83	if [ -z "$debarch" ]; then
84		debarch=$(dpkg-architecture -qDEB_HOST_ARCH)
85		echo "" >&2
86		echo "** ** **  WARNING  ** ** **" >&2
87		echo "" >&2
88		echo "Your architecture doesn't have its equivalent" >&2
89		echo "Debian userspace architecture defined!" >&2
90		echo "Falling back to the current host architecture ($debarch)." >&2
91		echo "Please add support for $UTS_MACHINE to ${0} ..." >&2
92		echo "" >&2
93	fi
94}
95
96# Create debian/source/ if it is a source package build
97gen_source ()
98{
99	mkdir -p debian/source
100
101	echo "3.0 (quilt)" > debian/source/format
102
103	{
104		echo "diff-ignore"
105		echo "extend-diff-ignore = .*"
106	} > debian/source/local-options
107
108	# Add .config as a patch
109	mkdir -p debian/patches
110	{
111		echo "Subject: Add .config"
112		echo "Author: ${maintainer}"
113		echo
114		echo "--- /dev/null"
115		echo "+++ linux/.config"
116		diff -u /dev/null "${KCONFIG_CONFIG}" | tail -n +3
117	} > debian/patches/config.patch
118	echo config.patch > debian/patches/series
119
120	"${srctree}/scripts/package/gen-diff-patch" debian/patches/diff.patch
121	if [ -s debian/patches/diff.patch ]; then
122		sed -i "
123			1iSubject: Add local diff
124			1iAuthor: ${maintainer}
125			1i
126		" debian/patches/diff.patch
127
128		echo diff.patch >> debian/patches/series
129	else
130		rm -f debian/patches/diff.patch
131	fi
132}
133
134rm -rf debian
135mkdir debian
136
137user=${KBUILD_BUILD_USER:-$(id -nu)}
138name=${DEBFULLNAME:-${user}}
139if [ "${DEBEMAIL:+set}" ]; then
140	email=${DEBEMAIL}
141else
142	buildhost=${KBUILD_BUILD_HOST:-$(hostname -f 2>/dev/null || hostname)}
143	email="${user}@${buildhost}"
144fi
145maintainer="${name} <${email}>"
146
147while [ $# -gt 0 ]; do
148	case "$1" in
149	--need-source)
150		gen_source
151		shift
152		;;
153	*)
154		break
155		;;
156	esac
157done
158
159# Some variables and settings used throughout the script
160version=$KERNELRELEASE
161if [ "${KDEB_PKGVERSION:+set}" ]; then
162	packageversion=$KDEB_PKGVERSION
163else
164	packageversion=$(${srctree}/scripts/setlocalversion --no-local ${srctree})-$($srctree/scripts/build-version)
165fi
166sourcename=${KDEB_SOURCENAME:-linux-upstream}
167
168if [ "$ARCH" = "um" ] ; then
169	packagename=user-mode-linux
170else
171	packagename=linux-image
172fi
173
174debarch=
175set_debarch
176
177# Try to determine distribution
178if [ "${KDEB_CHANGELOG_DIST:+set}" ]; then
179        distribution=$KDEB_CHANGELOG_DIST
180# In some cases lsb_release returns the codename as n/a, which breaks dpkg-parsechangelog
181elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ] && [ "$distribution" != "n/a" ]; then
182        : # nothing to do in this case
183else
184        distribution="unstable"
185        echo >&2 "Using default distribution of 'unstable' in the changelog"
186        echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly"
187fi
188
189echo $debarch > debian/arch
190
191host_gnu=$(dpkg-architecture -a "${debarch}" -q DEB_HOST_GNU_TYPE | sed 's/_/-/g')
192
193# Generate a simple changelog template
194cat <<EOF > debian/changelog
195$sourcename ($packageversion) $distribution; urgency=low
196
197  * Custom built Linux kernel.
198
199 -- $maintainer  $(date -R)
200EOF
201
202# Generate a control file
203cat <<EOF > debian/control
204Source: $sourcename
205Section: kernel
206Priority: optional
207Maintainer: $maintainer
208Rules-Requires-Root: no
209Build-Depends: debhelper-compat (= 12)
210Build-Depends-Arch: bc, bison, flex,
211 gcc-${host_gnu} <!pkg.${sourcename}.nokernelheaders>,
212 kmod, libelf-dev:native,
213 libssl-dev:native, libssl-dev <!pkg.${sourcename}.nokernelheaders>,
214 python3:native, rsync
215Homepage: https://www.kernel.org/
216
217Package: $packagename-$version
218Architecture: $debarch
219Description: Linux kernel, version $version
220 This package contains the Linux kernel, modules and corresponding other
221 files, version: $version.
222EOF
223
224if [ "${SRCARCH}" != um ]; then
225cat <<EOF >> debian/control
226
227Package: linux-libc-dev
228Section: devel
229Provides: linux-kernel-headers
230Architecture: $debarch
231Description: Linux support headers for userspace development
232 This package provides userspaces headers from the Linux kernel.  These headers
233 are used by the installed headers for GNU glibc and other system libraries.
234Multi-Arch: same
235EOF
236
237if is_enabled CONFIG_MODULES; then
238cat <<EOF >> debian/control
239
240Package: linux-headers-$version
241Architecture: $debarch
242Build-Profiles: <!pkg.${sourcename}.nokernelheaders>
243Description: Linux kernel headers for $version on $debarch
244 This package provides kernel header files for $version on $debarch
245 .
246 This is useful for people who need to build external modules
247EOF
248fi
249fi
250
251if is_enabled CONFIG_DEBUG_INFO; then
252cat <<EOF >> debian/control
253
254Package: linux-image-$version-dbg
255Section: debug
256Architecture: $debarch
257Build-Profiles: <!pkg.${sourcename}.nokerneldbg>
258Description: Linux kernel debugging symbols for $version
259 This package will come in handy if you need to debug the kernel. It provides
260 all the necessary debug symbols for the kernel and its modules.
261EOF
262fi
263
264cat <<EOF > debian/rules.vars
265ARCH := ${ARCH}
266KERNELRELEASE := ${KERNELRELEASE}
267EOF
268
269cp "${srctree}/scripts/package/debian/copyright" debian/
270cp "${srctree}/scripts/package/debian/rules" debian/
271
272exit 0
273