4 # Copyright 2003 Wichert Akkerman <wichert@wiggy.net>
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
16 local pname="$1" pdir="$2"
18 mkdir -m 755 -p "$pdir/DEBIAN"
19 mkdir -p "$pdir/usr/share/doc/$pname"
20 cp debian/copyright "$pdir/usr/share/doc/$pname/"
21 cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian"
22 gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian"
23 sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \
24 | xargs -r0 md5sum > DEBIAN/md5sums"
26 # Fix ownership and permissions
27 chown -R root:root "$pdir"
31 dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch}" -p$pname -P"$pdir"
32 dpkg --build "$pdir" ..
36 # Attempt to find the correct Debian architecture
37 case "$UTS_MACHINE" in
39 debarch="$UTS_MACHINE" ;;
45 debarch=s390$(grep -q CONFIG_64BIT=y $KCONFIG_CONFIG && echo x || true) ;;
47 debarch=$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo ppc64el || echo powerpc) ;;
51 debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;;
55 debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_CONFIG && echo el || true) ;;
57 debarch=$(dpkg --print-architecture)
59 echo "** ** ** WARNING ** ** **" >&2
61 echo "Your architecture doesn't have it's equivalent" >&2
62 echo "Debian userspace architecture defined!" >&2
63 echo "Falling back to using your current userspace instead!" >&2
64 echo "Please add support for $UTS_MACHINE to ${0} ..." >&2
67 if [ -n "$KBUILD_DEBARCH" ] ; then
68 debarch="$KBUILD_DEBARCH"
70 forcearch="-DArchitecture=$debarch"
74 # Some variables and settings used throughout the script
75 version=$KERNELRELEASE
76 revision=$(cat .version)
77 if [ -n "$KDEB_PKGVERSION" ]; then
78 packageversion=$KDEB_PKGVERSION
80 packageversion=$version-$revision
82 tmpdir="$objtree/debian/tmp"
83 fwdir="$objtree/debian/fwtmp"
84 kernel_headers_dir="$objtree/debian/hdrtmp"
85 libc_headers_dir="$objtree/debian/headertmp"
86 dbg_dir="$objtree/debian/dbgtmp"
87 packagename=linux-image-$version
88 fwpackagename=linux-firmware-image-$version
89 kernel_headers_packagename=linux-headers-$version
90 libc_headers_packagename=linux-libc-dev
91 dbg_packagename=$packagename-dbg
96 if [ "$ARCH" = "um" ] ; then
97 packagename=user-mode-linux-$version
100 # Not all arches have the same installed path in debian
101 # XXX: have each arch Makefile export a variable of the canonical image install
105 installed_image_path="usr/bin/linux-$version"
108 installed_image_path="boot/vmlinux-$version"
111 installed_image_path="boot/vmlinuz-$version"
114 BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)"
116 # Setup the directory structure
117 rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir"
118 mkdir -m 755 -p "$tmpdir/DEBIAN"
119 mkdir -p "$tmpdir/lib" "$tmpdir/boot"
120 mkdir -p "$fwdir/lib/firmware/$version/"
121 mkdir -p "$kernel_headers_dir/lib/modules/$version/"
123 # Build and install the kernel
124 if [ "$ARCH" = "um" ] ; then
125 mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename"
127 cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
128 cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config"
129 gzip "$tmpdir/usr/share/doc/$packagename/config"
131 cp System.map "$tmpdir/boot/System.map-$version"
132 cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version"
134 # Not all arches include the boot path in KBUILD_IMAGE
135 if [ -e $KBUILD_IMAGE ]; then
136 cp $KBUILD_IMAGE "$tmpdir/$installed_image_path"
138 cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/$installed_image_path"
141 if grep -q "^CONFIG_OF=y" $KCONFIG_CONFIG ; then
142 # Only some architectures with OF support have this target
143 if grep -q dtbs_install "${srctree}/arch/$SRCARCH/Makefile"; then
144 $MAKE KBUILD_SRC= INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install
148 if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then
149 INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install
150 rm -f "$tmpdir/lib/modules/$version/build"
151 rm -f "$tmpdir/lib/modules/$version/source"
152 if [ "$ARCH" = "um" ] ; then
153 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
154 rmdir "$tmpdir/lib/modules/$version"
156 if [ -n "$BUILD_DEBUG" ] ; then
157 for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do
158 module=lib/modules/$module
159 mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module)
160 # only keep debug symbols in the debug file
161 $OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module
162 # strip original module from debug symbols
163 $OBJCOPY --strip-debug $tmpdir/$module
164 # then add a link to those
165 $OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module
168 # resign stripped modules
169 MODULE_SIG_ALL="$(grep -s '^CONFIG_MODULE_SIG_ALL=y' $KCONFIG_CONFIG || true)"
170 if [ -n "$MODULE_SIG_ALL" ]; then
171 INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_sign
176 if [ "$ARCH" != "um" ]; then
177 $MAKE headers_check KBUILD_SRC=
178 $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
181 # Install the maintainer scripts
182 # Note: hook scripts under /etc/kernel are also executed by official Debian
183 # kernel packages, as well as kernel packages built using make-kpkg.
184 # make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and
185 # so do we; recent versions of dracut and initramfs-tools will obey this.
186 debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
187 if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then
192 for script in postinst postrm preinst prerm ; do
193 mkdir -p "$tmpdir$debhookdir/$script.d"
194 cat <<EOF > "$tmpdir/DEBIAN/$script"
199 # Pass maintainer script parameters to hook scripts
200 export DEB_MAINT_PARAMS="\$*"
202 # Tell initramfs builder whether it's wanted
203 export INITRD=$want_initrd
205 test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d
208 chmod 755 "$tmpdir/DEBIAN/$script"
211 # Try to determine maintainer and email values
212 if [ -n "$DEBEMAIL" ]; then
214 elif [ -n "$EMAIL" ]; then
217 email=$(id -nu)@$(hostname -f)
219 if [ -n "$DEBFULLNAME" ]; then
221 elif [ -n "$NAME" ]; then
226 maintainer="$name <$email>"
228 # Try to determine distribution
229 if [ -n "$KDEB_CHANGELOG_DIST" ]; then
230 distribution=$KDEB_CHANGELOG_DIST
231 elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ]; then
232 : # nothing to do in this case
234 distribution="unstable"
235 echo >&2 "Using default distribution of 'unstable' in the changelog"
236 echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly"
239 # Generate a simple changelog template
240 cat <<EOF > debian/changelog
241 linux-upstream ($packageversion) $distribution; urgency=low
243 * Custom built Linux kernel.
245 -- $maintainer $(date -R)
248 # Generate copyright file
249 cat <<EOF > debian/copyright
250 This is a packacked upstream version of the Linux kernel.
252 The sources may be found at most Linux ftp sites, including:
253 ftp://ftp.kernel.org/pub/linux/kernel
255 Copyright: 1991 - 2015 Linus Torvalds and others.
257 The git repository for mainline kernel development is at:
258 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
260 This program is free software; you can redistribute it and/or modify
261 it under the terms of the GNU General Public License as published by
262 the Free Software Foundation; version 2 dated June, 1991.
264 On Debian GNU/Linux systems, the complete text of the GNU General Public
265 License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
268 # Generate a control file
269 cat <<EOF > debian/control
270 Source: linux-upstream
273 Maintainer: $maintainer
274 Standards-Version: 3.8.4
275 Homepage: http://www.kernel.org/
278 if [ "$ARCH" = "um" ]; then
279 cat <<EOF >> debian/control
281 Package: $packagename
282 Provides: linux-image, linux-image-2.6, linux-modules-$version
284 Description: User Mode Linux kernel, version $version
285 User-mode Linux is a port of the Linux kernel to its own system call
286 interface. It provides a kind of virtual machine, which runs Linux
287 as a user process under another Linux kernel. This is useful for
288 kernel development, sandboxes, jails, experimentation, and
291 This package contains the Linux kernel, modules and corresponding other
292 files, version: $version.
296 cat <<EOF >> debian/control
298 Package: $packagename
299 Provides: linux-image, linux-image-2.6, linux-modules-$version
300 Suggests: $fwpackagename
302 Description: Linux kernel, version $version
303 This package contains the Linux kernel, modules and corresponding other
304 files, version: $version.
309 # Build kernel header package
310 (cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles"
311 (cd $srctree; find arch/$SRCARCH/include include scripts -type f) >> "$objtree/debian/hdrsrcfiles"
312 (cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles"
313 (cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles"
314 (cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles"
315 destdir=$kernel_headers_dir/usr/src/linux-headers-$version
317 (cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -)
318 (cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -)
319 (cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be
320 ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
321 rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
323 cat <<EOF >> debian/control
325 Package: $kernel_headers_packagename
326 Provides: linux-headers, linux-headers-2.6
328 Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch}
329 This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch}
331 This is useful for people who need to build external modules
334 # Do we have firmware? Move it out of the way and build it into a package.
335 if [ -e "$tmpdir/lib/firmware" ]; then
336 mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/"
337 rmdir "$tmpdir/lib/firmware"
339 cat <<EOF >> debian/control
341 Package: $fwpackagename
343 Description: Linux kernel firmware, version $version
344 This package contains firmware from the Linux kernel, version $version.
347 create_package "$fwpackagename" "$fwdir"
350 cat <<EOF >> debian/control
352 Package: $libc_headers_packagename
354 Provides: linux-kernel-headers
356 Description: Linux support headers for userspace development
357 This package provides userspaces headers from the Linux kernel. These headers
358 are used by the installed headers for GNU glibc and other system libraries.
361 if [ "$ARCH" != "um" ]; then
362 create_package "$kernel_headers_packagename" "$kernel_headers_dir"
363 create_package "$libc_headers_packagename" "$libc_headers_dir"
366 create_package "$packagename" "$tmpdir"
368 if [ -n "$BUILD_DEBUG" ] ; then
369 # Build debug package
370 # Different tools want the image in different locations
372 mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/
373 cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/
375 mkdir -p $dbg_dir/usr/lib/debug/boot/
376 ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version
378 ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version
380 cat <<EOF >> debian/control
382 Package: $dbg_packagename
384 Provides: linux-debug, linux-debug-$version
386 Description: Linux kernel debugging symbols for $version
387 This package will come in handy if you need to debug the kernel. It provides
388 all the necessary debug symbols for the kernel and its modules.
391 create_package "$dbg_packagename" "$dbg_dir"