xref: /openbmc/linux/scripts/package/builddeb (revision d0b73b48)
1#!/bin/sh
2#
3# builddeb 1.3
4# Copyright 2003 Wichert Akkerman <wichert@wiggy.net>
5#
6# Simple script to generate a deb package for a Linux kernel. All the
7# complexity of what to do with a kernel after it is installed or removed
8# is left to other scripts and packages: they can install scripts in the
9# /etc/kernel/{pre,post}{inst,rm}.d/ directories (or an alternative location
10# specified in KDEB_HOOKDIR) that will be called on package install and
11# removal.
12
13set -e
14
15create_package() {
16	local pname="$1" pdir="$2"
17
18	cp debian/copyright "$pdir/usr/share/doc/$pname/"
19	cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian"
20	gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian"
21	sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \
22		| xargs -r0 md5sum > DEBIAN/md5sums"
23
24	# Fix ownership and permissions
25	chown -R root:root "$pdir"
26	chmod -R go-w "$pdir"
27
28	# Attempt to find the correct Debian architecture
29	local forcearch="" debarch=""
30	case "$UTS_MACHINE" in
31	i386|ia64|alpha)
32		debarch="$UTS_MACHINE" ;;
33	x86_64)
34		debarch=amd64 ;;
35	sparc*)
36		debarch=sparc ;;
37	s390*)
38		debarch=s390 ;;
39	ppc*)
40		debarch=powerpc ;;
41	parisc*)
42		debarch=hppa ;;
43	mips*)
44		debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y .config && echo el) ;;
45	arm*)
46		debarch=arm$(grep -q CONFIG_AEABI=y .config && echo el) ;;
47	*)
48		echo "" >&2
49		echo "** ** **  WARNING  ** ** **" >&2
50		echo "" >&2
51		echo "Your architecture doesn't have it's equivalent" >&2
52		echo "Debian userspace architecture defined!" >&2
53		echo "Falling back to using your current userspace instead!" >&2
54		echo "Please add support for $UTS_MACHINE to ${0} ..." >&2
55		echo "" >&2
56	esac
57	if [ -n "$KBUILD_DEBARCH" ] ; then
58		debarch="$KBUILD_DEBARCH"
59	fi
60	if [ -n "$debarch" ] ; then
61		forcearch="-DArchitecture=$debarch"
62	fi
63
64	# Create the package
65	dpkg-gencontrol -isp $forcearch -p$pname -P"$pdir"
66	dpkg --build "$pdir" ..
67}
68
69# Some variables and settings used throughout the script
70version=$KERNELRELEASE
71revision=$(cat .version)
72if [ -n "$KDEB_PKGVERSION" ]; then
73	packageversion=$KDEB_PKGVERSION
74else
75	packageversion=$version-$revision
76fi
77tmpdir="$objtree/debian/tmp"
78fwdir="$objtree/debian/fwtmp"
79kernel_headers_dir="$objtree/debian/hdrtmp"
80libc_headers_dir="$objtree/debian/headertmp"
81packagename=linux-image-$version
82fwpackagename=linux-firmware-image
83kernel_headers_packagename=linux-headers-$version
84libc_headers_packagename=linux-libc-dev
85
86if [ "$ARCH" = "um" ] ; then
87	packagename=user-mode-linux-$version
88fi
89
90# Setup the directory structure
91rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir"
92mkdir -m 755 -p "$tmpdir/DEBIAN"
93mkdir -p  "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename"
94mkdir -m 755 -p "$fwdir/DEBIAN"
95mkdir -p "$fwdir/lib/firmware/$version/" "$fwdir/usr/share/doc/$fwpackagename"
96mkdir -m 755 -p "$libc_headers_dir/DEBIAN"
97mkdir -p "$libc_headers_dir/usr/share/doc/$libc_headers_packagename"
98mkdir -m 755 -p "$kernel_headers_dir/DEBIAN"
99mkdir -p "$kernel_headers_dir/usr/share/doc/$kernel_headers_packagename"
100mkdir -p "$kernel_headers_dir/lib/modules/$version/"
101if [ "$ARCH" = "um" ] ; then
102	mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin"
103fi
104
105# Build and install the kernel
106if [ "$ARCH" = "um" ] ; then
107	$MAKE linux
108	cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
109	cp .config "$tmpdir/usr/share/doc/$packagename/config"
110	gzip "$tmpdir/usr/share/doc/$packagename/config"
111	cp $KBUILD_IMAGE "$tmpdir/usr/bin/linux-$version"
112else
113	cp System.map "$tmpdir/boot/System.map-$version"
114	cp .config "$tmpdir/boot/config-$version"
115	# Not all arches include the boot path in KBUILD_IMAGE
116	if [ -e $KBUILD_IMAGE ]; then
117		cp $KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
118	else
119		cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
120	fi
121fi
122
123if grep -q '^CONFIG_MODULES=y' .config ; then
124	INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install
125	rm -f "$tmpdir/lib/modules/$version/build"
126	rm -f "$tmpdir/lib/modules/$version/source"
127	if [ "$ARCH" = "um" ] ; then
128		mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
129		rmdir "$tmpdir/lib/modules/$version"
130	fi
131fi
132
133if [ "$ARCH" != "um" ]; then
134	$MAKE headers_check KBUILD_SRC=
135	$MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
136fi
137
138# Install the maintainer scripts
139# Note: hook scripts under /etc/kernel are also executed by official Debian
140# kernel packages, as well as kernel packages built using make-kpkg
141debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
142for script in postinst postrm preinst prerm ; do
143	mkdir -p "$tmpdir$debhookdir/$script.d"
144	cat <<EOF > "$tmpdir/DEBIAN/$script"
145#!/bin/sh
146
147set -e
148
149# Pass maintainer script parameters to hook scripts
150export DEB_MAINT_PARAMS="\$*"
151
152test -d $debhookdir/$script.d && run-parts --arg="$version" $debhookdir/$script.d
153exit 0
154EOF
155	chmod 755 "$tmpdir/DEBIAN/$script"
156done
157
158# Try to determine maintainer and email values
159if [ -n "$DEBEMAIL" ]; then
160       email=$DEBEMAIL
161elif [ -n "$EMAIL" ]; then
162       email=$EMAIL
163else
164       email=$(id -nu)@$(hostname -f)
165fi
166if [ -n "$DEBFULLNAME" ]; then
167       name=$DEBFULLNAME
168elif [ -n "$NAME" ]; then
169       name=$NAME
170else
171       name="Anonymous"
172fi
173maintainer="$name <$email>"
174
175# Generate a simple changelog template
176cat <<EOF > debian/changelog
177linux-upstream ($packageversion) unstable; urgency=low
178
179  * Custom built Linux kernel.
180
181 -- $maintainer  $(date -R)
182EOF
183
184# Generate copyright file
185cat <<EOF > debian/copyright
186This is a packacked upstream version of the Linux kernel.
187
188The sources may be found at most Linux ftp sites, including:
189ftp://ftp.kernel.org/pub/linux/kernel
190
191Copyright: 1991 - 2009 Linus Torvalds and others.
192
193The git repository for mainline kernel development is at:
194git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
195
196    This program is free software; you can redistribute it and/or modify
197    it under the terms of the GNU General Public License as published by
198    the Free Software Foundation; version 2 dated June, 1991.
199
200On Debian GNU/Linux systems, the complete text of the GNU General Public
201License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
202EOF
203
204# Generate a control file
205cat <<EOF > debian/control
206Source: linux-upstream
207Section: kernel
208Priority: optional
209Maintainer: $maintainer
210Standards-Version: 3.8.4
211Homepage: http://www.kernel.org/
212EOF
213
214if [ "$ARCH" = "um" ]; then
215	cat <<EOF >> debian/control
216
217Package: $packagename
218Provides: linux-image, linux-image-2.6, linux-modules-$version
219Architecture: any
220Description: User Mode Linux kernel, version $version
221 User-mode Linux is a port of the Linux kernel to its own system call
222 interface.  It provides a kind of virtual machine, which runs Linux
223 as a user process under another Linux kernel.  This is useful for
224 kernel development, sandboxes, jails, experimentation, and
225 many other things.
226 .
227 This package contains the Linux kernel, modules and corresponding other
228 files, version: $version.
229EOF
230
231else
232	cat <<EOF >> debian/control
233
234Package: $packagename
235Provides: linux-image, linux-image-2.6, linux-modules-$version
236Suggests: $fwpackagename
237Architecture: any
238Description: Linux kernel, version $version
239 This package contains the Linux kernel, modules and corresponding other
240 files, version: $version.
241EOF
242
243fi
244
245# Build header package
246(cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl > "$objtree/debian/hdrsrcfiles")
247(cd $srctree; find arch/$SRCARCH/include include scripts -type f >> "$objtree/debian/hdrsrcfiles")
248(cd $objtree; find arch/$SRCARCH/include .config Module.symvers include scripts -type f >> "$objtree/debian/hdrobjfiles")
249destdir=$kernel_headers_dir/usr/src/linux-headers-$version
250mkdir -p "$destdir"
251(cd $srctree; tar -c -f - -T "$objtree/debian/hdrsrcfiles") | (cd $destdir; tar -xf -)
252(cd $objtree; tar -c -f - -T "$objtree/debian/hdrobjfiles") | (cd $destdir; tar -xf -)
253ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
254rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
255arch=$(dpkg --print-architecture)
256
257cat <<EOF >> debian/control
258
259Package: $kernel_headers_packagename
260Provides: linux-headers, linux-headers-2.6
261Architecture: $arch
262Description: Linux kernel headers for $KERNELRELEASE on $arch
263 This package provides kernel header files for $KERNELRELEASE on $arch
264 .
265 This is useful for people who need to build external modules
266EOF
267
268# Do we have firmware? Move it out of the way and build it into a package.
269if [ -e "$tmpdir/lib/firmware" ]; then
270	mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/"
271	rmdir "$tmpdir/lib/firmware"
272
273	cat <<EOF >> debian/control
274
275Package: $fwpackagename
276Architecture: all
277Description: Linux kernel firmware, version $version
278 This package contains firmware from the Linux kernel, version $version.
279EOF
280
281	create_package "$fwpackagename" "$fwdir"
282fi
283
284cat <<EOF >> debian/control
285
286Package: $libc_headers_packagename
287Section: devel
288Provides: linux-kernel-headers
289Architecture: any
290Description: Linux support headers for userspace development
291 This package provides userspaces headers from the Linux kernel.  These headers
292 are used by the installed headers for GNU glibc and other system libraries.
293EOF
294
295if [ "$ARCH" != "um" ]; then
296	create_package "$kernel_headers_packagename" "$kernel_headers_dir"
297	create_package "$libc_headers_packagename" "$libc_headers_dir"
298fi
299
300create_package "$packagename" "$tmpdir"
301
302exit 0
303