xref: /linux/scripts/package/mkdebian (revision bf52ca5912c07664276c7b94db820fa2d638b681)
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
182# Generate a simple changelog template
183cat <<EOF > debian/changelog
184$sourcename ($packageversion) $distribution; urgency=low
185
186  * Custom built Linux kernel.
187
188 -- $maintainer  $(date -R)
189EOF
190
191# Generate a control file
192cat <<EOF > debian/control
193Source: $sourcename
194Section: kernel
195Priority: optional
196Maintainer: $maintainer
197Rules-Requires-Root: no
198Build-Depends: debhelper-compat (= 12)
199Build-Depends-Arch: bc, bison, cpio, flex, kmod, libelf-dev:native, libssl-dev:native, rsync
200Homepage: https://www.kernel.org/
201
202Package: $packagename-$version
203Architecture: $debarch
204Description: Linux kernel, version $version
205 This package contains the Linux kernel, modules and corresponding other
206 files, version: $version.
207EOF
208
209if [ "${SRCARCH}" != um ]; then
210cat <<EOF >> debian/control
211
212Package: linux-libc-dev
213Section: devel
214Provides: linux-kernel-headers
215Architecture: $debarch
216Description: Linux support headers for userspace development
217 This package provides userspaces headers from the Linux kernel.  These headers
218 are used by the installed headers for GNU glibc and other system libraries.
219Multi-Arch: same
220EOF
221
222if is_enabled CONFIG_MODULES; then
223cat <<EOF >> debian/control
224
225Package: linux-headers-$version
226Architecture: $debarch
227Description: Linux kernel headers for $version on $debarch
228 This package provides kernel header files for $version on $debarch
229 .
230 This is useful for people who need to build external modules
231EOF
232fi
233fi
234
235if is_enabled CONFIG_DEBUG_INFO; then
236cat <<EOF >> debian/control
237
238Package: linux-image-$version-dbg
239Section: debug
240Architecture: $debarch
241Description: Linux kernel debugging symbols for $version
242 This package will come in handy if you need to debug the kernel. It provides
243 all the necessary debug symbols for the kernel and its modules.
244EOF
245fi
246
247cat <<EOF > debian/rules.vars
248ARCH := ${ARCH}
249KERNELRELEASE := ${KERNELRELEASE}
250EOF
251
252cp "${srctree}/scripts/package/debian/copyright" debian/
253cp "${srctree}/scripts/package/debian/rules" debian/
254
255exit 0
256