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