xref: /linux-6.15/scripts/package/mkdebian (revision 7e752910)
1#!/bin/sh
2#
3# Copyright 2003 Wichert Akkerman <[email protected]>
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	upstream_version=$("${srctree}/scripts/setlocalversion" --no-local "${srctree}" | sed 's/-\(rc[1-9]\)/~\1/')
165	debian_revision=$("${srctree}/scripts/build-version")
166	packageversion=${upstream_version}-${debian_revision}
167fi
168sourcename=${KDEB_SOURCENAME:-linux-upstream}
169
170if [ "$ARCH" = "um" ] ; then
171	packagename=user-mode-linux
172else
173	packagename=linux-image
174fi
175
176debarch=
177set_debarch
178
179# Try to determine distribution
180if [ "${KDEB_CHANGELOG_DIST:+set}" ]; then
181        distribution=$KDEB_CHANGELOG_DIST
182# In some cases lsb_release returns the codename as n/a, which breaks dpkg-parsechangelog
183elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ] && [ "$distribution" != "n/a" ]; then
184        : # nothing to do in this case
185else
186        distribution="unstable"
187        echo >&2 "Using default distribution of 'unstable' in the changelog"
188        echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly"
189fi
190
191echo $debarch > debian/arch
192
193host_gnu=$(dpkg-architecture -a "${debarch}" -q DEB_HOST_GNU_TYPE | sed 's/_/-/g')
194
195# Generate a simple changelog template
196cat <<EOF > debian/changelog
197$sourcename ($packageversion) $distribution; urgency=low
198
199  * Custom built Linux kernel.
200
201 -- $maintainer  $(date -R)
202EOF
203
204# Generate a control file
205cat <<EOF > debian/control
206Source: $sourcename
207Section: kernel
208Priority: optional
209Maintainer: $maintainer
210Rules-Requires-Root: no
211Build-Depends: debhelper-compat (= 12)
212Build-Depends-Arch: bc, bison, flex,
213 gcc-${host_gnu} <!pkg.${sourcename}.nokernelheaders>,
214 kmod, libelf-dev:native,
215 libssl-dev:native, libssl-dev <!pkg.${sourcename}.nokernelheaders>,
216 python3:native, rsync
217Homepage: https://www.kernel.org/
218
219Package: $packagename-$version
220Architecture: $debarch
221Description: Linux kernel, version $version
222 This package contains the Linux kernel, modules and corresponding other
223 files, version: $version.
224EOF
225
226if [ "${SRCARCH}" != um ]; then
227cat <<EOF >> debian/control
228
229Package: linux-libc-dev
230Section: devel
231Provides: linux-kernel-headers
232Architecture: $debarch
233Description: Linux support headers for userspace development
234 This package provides userspaces headers from the Linux kernel.  These headers
235 are used by the installed headers for GNU glibc and other system libraries.
236Multi-Arch: same
237EOF
238
239if is_enabled CONFIG_MODULES; then
240cat <<EOF >> debian/control
241
242Package: linux-headers-$version
243Architecture: $debarch
244Build-Profiles: <!pkg.${sourcename}.nokernelheaders>
245Description: Linux kernel headers for $version on $debarch
246 This package provides kernel header files for $version on $debarch
247 .
248 This is useful for people who need to build external modules
249EOF
250fi
251fi
252
253if is_enabled CONFIG_DEBUG_INFO; then
254cat <<EOF >> debian/control
255
256Package: linux-image-$version-dbg
257Section: debug
258Architecture: $debarch
259Build-Profiles: <!pkg.${sourcename}.nokerneldbg>
260Description: Linux kernel debugging symbols for $version
261 This package will come in handy if you need to debug the kernel. It provides
262 all the necessary debug symbols for the kernel and its modules.
263EOF
264fi
265
266cat <<EOF > debian/rules.vars
267ARCH := ${ARCH}
268KERNELRELEASE := ${KERNELRELEASE}
269EOF
270
271cp "${srctree}/scripts/package/debian/copyright" debian/
272cp "${srctree}/scripts/package/debian/rules" debian/
273
274exit 0
275