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 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"
24 # Fix ownership and permissions
25 chown -R root:root "$pdir"
29 dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch}" -p$pname -P"$pdir"
30 dpkg --build "$pdir" ..
34 # Attempt to find the correct Debian architecture
35 case "$UTS_MACHINE" in
37 debarch="$UTS_MACHINE" ;;
43 debarch=s390$(grep -q CONFIG_64BIT=y $KCONFIG_CONFIG && echo x || true) ;;
45 debarch=$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo ppc64el || echo powerpc) ;;
49 debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;;
53 debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_CONFIG && echo el || true) ;;
55 debarch=$(dpkg --print-architecture)
57 echo "** ** ** WARNING ** ** **" >&2
59 echo "Your architecture doesn't have it's equivalent" >&2
60 echo "Debian userspace architecture defined!" >&2
61 echo "Falling back to using your current userspace instead!" >&2
62 echo "Please add support for $UTS_MACHINE to ${0} ..." >&2
65 if [ -n "$KBUILD_DEBARCH" ] ; then
66 debarch="$KBUILD_DEBARCH"
68 forcearch="-DArchitecture=$debarch"
72 # Some variables and settings used throughout the script
73 version=$KERNELRELEASE
74 revision=$(cat .version)
75 if [ -n "$KDEB_PKGVERSION" ]; then
76 packageversion=$KDEB_PKGVERSION
78 packageversion=$version-$revision
80 tmpdir="$objtree/debian/tmp"
81 fwdir="$objtree/debian/fwtmp"
82 kernel_headers_dir="$objtree/debian/hdrtmp"
83 libc_headers_dir="$objtree/debian/headertmp"
84 dbg_dir="$objtree/debian/dbgtmp"
85 packagename=linux-image-$version
86 fwpackagename=linux-firmware-image-$version
87 kernel_headers_packagename=linux-headers-$version
88 libc_headers_packagename=linux-libc-dev
89 dbg_packagename=$packagename-dbg
94 if [ "$ARCH" = "um" ] ; then
95 packagename=user-mode-linux-$version
98 # Not all arches have the same installed path in debian
99 # XXX: have each arch Makefile export a variable of the canonical image install
103 installed_image_path="usr/bin/linux-$version"
106 installed_image_path="boot/vmlinux-$version"
109 installed_image_path="boot/vmlinuz-$version"
112 BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)"
114 # Setup the directory structure
115 rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir"
116 mkdir -m 755 -p "$tmpdir/DEBIAN"
117 mkdir -p "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename"
118 mkdir -m 755 -p "$fwdir/DEBIAN"
119 mkdir -p "$fwdir/lib/firmware/$version/" "$fwdir/usr/share/doc/$fwpackagename"
120 mkdir -m 755 -p "$libc_headers_dir/DEBIAN"
121 mkdir -p "$libc_headers_dir/usr/share/doc/$libc_headers_packagename"
122 mkdir -m 755 -p "$kernel_headers_dir/DEBIAN"
123 mkdir -p "$kernel_headers_dir/usr/share/doc/$kernel_headers_packagename"
124 mkdir -p "$kernel_headers_dir/lib/modules/$version/"
125 if [ "$ARCH" = "um" ] ; then
126 mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin"
128 if [ -n "$BUILD_DEBUG" ] ; then
129 mkdir -p "$dbg_dir/usr/share/doc/$dbg_packagename"
130 mkdir -m 755 -p "$dbg_dir/DEBIAN"
133 # Build and install the kernel
134 if [ "$ARCH" = "um" ] ; then
136 cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
137 cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config"
138 gzip "$tmpdir/usr/share/doc/$packagename/config"
140 cp System.map "$tmpdir/boot/System.map-$version"
141 cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version"
143 # Not all arches include the boot path in KBUILD_IMAGE
144 if [ -e $KBUILD_IMAGE ]; then
145 cp $KBUILD_IMAGE "$tmpdir/$installed_image_path"
147 cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/$installed_image_path"
150 if grep -q "^CONFIG_OF=y" $KCONFIG_CONFIG ; then
151 # Only some architectures with OF support have this target
152 if grep -q dtbs_install "${srctree}/arch/$SRCARCH/Makefile"; then
153 $MAKE KBUILD_SRC= INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install
157 if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then
158 INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install
159 rm -f "$tmpdir/lib/modules/$version/build"
160 rm -f "$tmpdir/lib/modules/$version/source"
161 if [ "$ARCH" = "um" ] ; then
162 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
163 rmdir "$tmpdir/lib/modules/$version"
165 if [ -n "$BUILD_DEBUG" ] ; then
166 for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do
167 module=lib/modules/$module
168 mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module)
169 # only keep debug symbols in the debug file
170 $OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module
171 # strip original module from debug symbols
172 $OBJCOPY --strip-debug $tmpdir/$module
173 # then add a link to those
174 $OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module
177 # resign stripped modules
178 MODULE_SIG_ALL="$(grep -s '^CONFIG_MODULE_SIG_ALL=y' $KCONFIG_CONFIG || true)"
179 if [ -n "$MODULE_SIG_ALL" ]; then
180 INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_sign
185 if [ "$ARCH" != "um" ]; then
186 $MAKE headers_check KBUILD_SRC=
187 $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
190 # Install the maintainer scripts
191 # Note: hook scripts under /etc/kernel are also executed by official Debian
192 # kernel packages, as well as kernel packages built using make-kpkg.
193 # make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and
194 # so do we; recent versions of dracut and initramfs-tools will obey this.
195 debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
196 if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then
201 for script in postinst postrm preinst prerm ; do
202 mkdir -p "$tmpdir$debhookdir/$script.d"
203 cat <<EOF > "$tmpdir/DEBIAN/$script"
208 # Pass maintainer script parameters to hook scripts
209 export DEB_MAINT_PARAMS="\$*"
211 # Tell initramfs builder whether it's wanted
212 export INITRD=$want_initrd
214 test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d
217 chmod 755 "$tmpdir/DEBIAN/$script"
220 # Try to determine maintainer and email values
221 if [ -n "$DEBEMAIL" ]; then
223 elif [ -n "$EMAIL" ]; then
226 email=$(id -nu)@$(hostname -f)
228 if [ -n "$DEBFULLNAME" ]; then
230 elif [ -n "$NAME" ]; then
235 maintainer="$name <$email>"
237 # Try to determine distribution
238 if [ -n "$KDEB_CHANGELOG_DIST" ]; then
239 distribution=$KDEB_CHANGELOG_DIST
240 elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ]; then
241 : # nothing to do in this case
243 distribution="unstable"
244 echo >&2 "Using default distribution of 'unstable' in the changelog"
245 echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly"
248 # Generate a simple changelog template
249 cat <<EOF > debian/changelog
250 linux-upstream ($packageversion) $distribution; urgency=low
252 * Custom built Linux kernel.
254 -- $maintainer $(date -R)
257 # Generate copyright file
258 cat <<EOF > debian/copyright
259 This is a packacked upstream version of the Linux kernel.
261 The sources may be found at most Linux ftp sites, including:
262 ftp://ftp.kernel.org/pub/linux/kernel
264 Copyright: 1991 - 2015 Linus Torvalds and others.
266 The git repository for mainline kernel development is at:
267 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
269 This program is free software; you can redistribute it and/or modify
270 it under the terms of the GNU General Public License as published by
271 the Free Software Foundation; version 2 dated June, 1991.
273 On Debian GNU/Linux systems, the complete text of the GNU General Public
274 License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
277 # Generate a control file
278 cat <<EOF > debian/control
279 Source: linux-upstream
282 Maintainer: $maintainer
283 Standards-Version: 3.8.4
284 Homepage: http://www.kernel.org/
287 if [ "$ARCH" = "um" ]; then
288 cat <<EOF >> debian/control
290 Package: $packagename
291 Provides: linux-image, linux-image-2.6, linux-modules-$version
293 Description: User Mode Linux kernel, version $version
294 User-mode Linux is a port of the Linux kernel to its own system call
295 interface. It provides a kind of virtual machine, which runs Linux
296 as a user process under another Linux kernel. This is useful for
297 kernel development, sandboxes, jails, experimentation, and
300 This package contains the Linux kernel, modules and corresponding other
301 files, version: $version.
305 cat <<EOF >> debian/control
307 Package: $packagename
308 Provides: linux-image, linux-image-2.6, linux-modules-$version
309 Suggests: $fwpackagename
311 Description: Linux kernel, version $version
312 This package contains the Linux kernel, modules and corresponding other
313 files, version: $version.
318 # Build kernel header package
319 (cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles"
320 (cd $srctree; find arch/$SRCARCH/include include scripts -type f) >> "$objtree/debian/hdrsrcfiles"
321 (cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles"
322 (cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles"
323 (cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles"
324 destdir=$kernel_headers_dir/usr/src/linux-headers-$version
326 (cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -)
327 (cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -)
328 (cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be
329 ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
330 rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
332 cat <<EOF >> debian/control
334 Package: $kernel_headers_packagename
335 Provides: linux-headers, linux-headers-2.6
337 Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch}
338 This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch}
340 This is useful for people who need to build external modules
343 # Do we have firmware? Move it out of the way and build it into a package.
344 if [ -e "$tmpdir/lib/firmware" ]; then
345 mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/"
346 rmdir "$tmpdir/lib/firmware"
348 cat <<EOF >> debian/control
350 Package: $fwpackagename
352 Description: Linux kernel firmware, version $version
353 This package contains firmware from the Linux kernel, version $version.
356 create_package "$fwpackagename" "$fwdir"
359 cat <<EOF >> debian/control
361 Package: $libc_headers_packagename
363 Provides: linux-kernel-headers
365 Description: Linux support headers for userspace development
366 This package provides userspaces headers from the Linux kernel. These headers
367 are used by the installed headers for GNU glibc and other system libraries.
370 if [ "$ARCH" != "um" ]; then
371 create_package "$kernel_headers_packagename" "$kernel_headers_dir"
372 create_package "$libc_headers_packagename" "$libc_headers_dir"
375 create_package "$packagename" "$tmpdir"
377 if [ -n "$BUILD_DEBUG" ] ; then
378 # Build debug package
379 # Different tools want the image in different locations
381 mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/
382 cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/
384 mkdir -p $dbg_dir/usr/lib/debug/boot/
385 ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version
387 ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version
389 cat <<EOF >> debian/control
391 Package: $dbg_packagename
393 Provides: linux-debug, linux-debug-$version
395 Description: Linux kernel debugging symbols for $version
396 This package will come in handy if you need to debug the kernel. It provides
397 all the necessary debug symbols for the kernel and its modules.
400 create_package "$dbg_packagename" "$dbg_dir"