]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - scripts/package/builddeb
Merge remote-tracking branch 'file-locks/linux-next'
[karo-tx-linux.git] / scripts / package / builddeb
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
13 set -e
14
15 create_package() {
16         local pname="$1" pdir="$2"
17
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"
25
26         # Fix ownership and permissions
27         chown -R root:root "$pdir"
28         chmod -R go-w "$pdir"
29
30         # Create the package
31         dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch}" -p$pname -P"$pdir"
32         dpkg --build "$pdir" ..
33 }
34
35 set_debarch() {
36         # Attempt to find the correct Debian architecture
37         case "$UTS_MACHINE" in
38         i386|ia64|alpha)
39                 debarch="$UTS_MACHINE" ;;
40         x86_64)
41                 debarch=amd64 ;;
42         sparc*)
43                 debarch=sparc ;;
44         s390*)
45                 debarch=s390$(grep -q CONFIG_64BIT=y $KCONFIG_CONFIG && echo x || true) ;;
46         ppc*)
47                 debarch=$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo ppc64el || echo powerpc) ;;
48         parisc*)
49                 debarch=hppa ;;
50         mips*)
51                 debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;;
52         arm64)
53                 debarch=arm64 ;;
54         arm*)
55                 debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_CONFIG && echo el || true) ;;
56         *)
57                 debarch=$(dpkg --print-architecture)
58                 echo "" >&2
59                 echo "** ** **  WARNING  ** ** **" >&2
60                 echo "" >&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
65                 echo "" >&2
66         esac
67         if [ -n "$KBUILD_DEBARCH" ] ; then
68                 debarch="$KBUILD_DEBARCH"
69         fi
70         forcearch="-DArchitecture=$debarch"
71
72 }
73
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
79 else
80         packageversion=$version-$revision
81 fi
82 sourcename=$KDEB_SOURCENAME
83 tmpdir="$objtree/debian/tmp"
84 fwdir="$objtree/debian/fwtmp"
85 kernel_headers_dir="$objtree/debian/hdrtmp"
86 libc_headers_dir="$objtree/debian/headertmp"
87 dbg_dir="$objtree/debian/dbgtmp"
88 packagename=linux-image-$version
89 fwpackagename=linux-firmware-image-$version
90 kernel_headers_packagename=linux-headers-$version
91 libc_headers_packagename=linux-libc-dev
92 dbg_packagename=$packagename-dbg
93 debarch=
94 forcearch=
95 set_debarch
96
97 if [ "$ARCH" = "um" ] ; then
98         packagename=user-mode-linux-$version
99 fi
100
101 # Not all arches have the same installed path in debian
102 # XXX: have each arch Makefile export a variable of the canonical image install
103 # path instead
104 case $ARCH in
105 um)
106         installed_image_path="usr/bin/linux-$version"
107         ;;
108 parisc|mips|powerpc)
109         installed_image_path="boot/vmlinux-$version"
110         ;;
111 *)
112         installed_image_path="boot/vmlinuz-$version"
113 esac
114
115 BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)"
116
117 # Setup the directory structure
118 rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" $objtree/debian/files
119 mkdir -m 755 -p "$tmpdir/DEBIAN"
120 mkdir -p "$tmpdir/lib" "$tmpdir/boot"
121 mkdir -p "$fwdir/lib/firmware/$version/"
122 mkdir -p "$kernel_headers_dir/lib/modules/$version/"
123
124 # Build and install the kernel
125 if [ "$ARCH" = "um" ] ; then
126         mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename"
127         $MAKE linux
128         cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
129         cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config"
130         gzip "$tmpdir/usr/share/doc/$packagename/config"
131 else
132         cp System.map "$tmpdir/boot/System.map-$version"
133         cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version"
134 fi
135 # Not all arches include the boot path in KBUILD_IMAGE
136 if [ -e $KBUILD_IMAGE ]; then
137         cp $KBUILD_IMAGE "$tmpdir/$installed_image_path"
138 else
139         cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/$installed_image_path"
140 fi
141
142 if grep -q "^CONFIG_OF=y" $KCONFIG_CONFIG ; then
143         # Only some architectures with OF support have this target
144         if grep -q dtbs_install "${srctree}/arch/$SRCARCH/Makefile"; then
145                 $MAKE KBUILD_SRC= INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install
146         fi
147 fi
148
149 if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then
150         INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install
151         rm -f "$tmpdir/lib/modules/$version/build"
152         rm -f "$tmpdir/lib/modules/$version/source"
153         if [ "$ARCH" = "um" ] ; then
154                 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
155                 rmdir "$tmpdir/lib/modules/$version"
156         fi
157         if [ -n "$BUILD_DEBUG" ] ; then
158                 for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do
159                         module=lib/modules/$module
160                         mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module)
161                         # only keep debug symbols in the debug file
162                         $OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module
163                         # strip original module from debug symbols
164                         $OBJCOPY --strip-debug $tmpdir/$module
165                         # then add a link to those
166                         $OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module
167                 done
168
169                 # resign stripped modules
170                 MODULE_SIG_ALL="$(grep -s '^CONFIG_MODULE_SIG_ALL=y' $KCONFIG_CONFIG || true)"
171                 if [ -n "$MODULE_SIG_ALL" ]; then
172                         INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_sign
173                 fi
174         fi
175 fi
176
177 if [ "$ARCH" != "um" ]; then
178         $MAKE headers_check KBUILD_SRC=
179         $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
180 fi
181
182 # Install the maintainer scripts
183 # Note: hook scripts under /etc/kernel are also executed by official Debian
184 # kernel packages, as well as kernel packages built using make-kpkg.
185 # make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and
186 # so do we; recent versions of dracut and initramfs-tools will obey this.
187 debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
188 if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then
189         want_initrd=Yes
190 else
191         want_initrd=No
192 fi
193 for script in postinst postrm preinst prerm ; do
194         mkdir -p "$tmpdir$debhookdir/$script.d"
195         cat <<EOF > "$tmpdir/DEBIAN/$script"
196 #!/bin/sh
197
198 set -e
199
200 # Pass maintainer script parameters to hook scripts
201 export DEB_MAINT_PARAMS="\$*"
202
203 # Tell initramfs builder whether it's wanted
204 export INITRD=$want_initrd
205
206 test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d
207 exit 0
208 EOF
209         chmod 755 "$tmpdir/DEBIAN/$script"
210 done
211
212 # Try to determine maintainer and email values
213 if [ -n "$DEBEMAIL" ]; then
214        email=$DEBEMAIL
215 elif [ -n "$EMAIL" ]; then
216        email=$EMAIL
217 else
218        email=$(id -nu)@$(hostname -f 2>/dev/null || hostname)
219 fi
220 if [ -n "$DEBFULLNAME" ]; then
221        name=$DEBFULLNAME
222 elif [ -n "$NAME" ]; then
223        name=$NAME
224 else
225        name="Anonymous"
226 fi
227 maintainer="$name <$email>"
228
229 # Try to determine distribution
230 if [ -n "$KDEB_CHANGELOG_DIST" ]; then
231         distribution=$KDEB_CHANGELOG_DIST
232 elif distribution=$(lsb_release -cs 2>/dev/null) && [ -n "$distribution" ]; then
233         : # nothing to do in this case
234 else
235         distribution="unstable"
236         echo >&2 "Using default distribution of 'unstable' in the changelog"
237         echo >&2 "Install lsb-release or set \$KDEB_CHANGELOG_DIST explicitly"
238 fi
239
240 # Generate a simple changelog template
241 cat <<EOF > debian/changelog
242 $sourcename ($packageversion) $distribution; urgency=low
243
244   * Custom built Linux kernel.
245
246  -- $maintainer  $(date -R)
247 EOF
248
249 # Generate copyright file
250 cat <<EOF > debian/copyright
251 This is a packacked upstream version of the Linux kernel.
252
253 The sources may be found at most Linux ftp sites, including:
254 ftp://ftp.kernel.org/pub/linux/kernel
255
256 Copyright: 1991 - 2015 Linus Torvalds and others.
257
258 The git repository for mainline kernel development is at:
259 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
260
261     This program is free software; you can redistribute it and/or modify
262     it under the terms of the GNU General Public License as published by
263     the Free Software Foundation; version 2 dated June, 1991.
264
265 On Debian GNU/Linux systems, the complete text of the GNU General Public
266 License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
267 EOF
268
269
270 build_depends="bc, kmod, cpio "
271
272 # Generate a control file
273 cat <<EOF > debian/control
274 Source: $sourcename
275 Section: kernel
276 Priority: optional
277 Maintainer: $maintainer
278 Build-Depends: $build_depends
279 Standards-Version: 3.8.4
280 Homepage: http://www.kernel.org/
281 EOF
282
283 if [ "$ARCH" = "um" ]; then
284         cat <<EOF >> debian/control
285
286 Package: $packagename
287 Provides: linux-image, linux-image-2.6, linux-modules-$version
288 Architecture: any
289 Description: User Mode Linux kernel, version $version
290  User-mode Linux is a port of the Linux kernel to its own system call
291  interface.  It provides a kind of virtual machine, which runs Linux
292  as a user process under another Linux kernel.  This is useful for
293  kernel development, sandboxes, jails, experimentation, and
294  many other things.
295  .
296  This package contains the Linux kernel, modules and corresponding other
297  files, version: $version.
298 EOF
299
300 else
301         cat <<EOF >> debian/control
302
303 Package: $packagename
304 Provides: linux-image, linux-image-2.6, linux-modules-$version
305 Suggests: $fwpackagename
306 Architecture: any
307 Description: Linux kernel, version $version
308  This package contains the Linux kernel, modules and corresponding other
309  files, version: $version.
310 EOF
311
312 fi
313
314 # Build kernel header package
315 (cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles"
316 (cd $srctree; find arch/$SRCARCH/include include scripts -type f) >> "$objtree/debian/hdrsrcfiles"
317 (cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles"
318 (cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles"
319 (cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles"
320 destdir=$kernel_headers_dir/usr/src/linux-headers-$version
321 mkdir -p "$destdir"
322 (cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -)
323 (cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -)
324 (cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be
325 ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
326 rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
327
328 cat <<EOF >> debian/control
329
330 Package: $kernel_headers_packagename
331 Provides: linux-headers, linux-headers-2.6
332 Architecture: any
333 Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch}
334  This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch}
335  .
336  This is useful for people who need to build external modules
337 EOF
338
339 # Do we have firmware? Move it out of the way and build it into a package.
340 if [ -e "$tmpdir/lib/firmware" ]; then
341         mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/"
342         rmdir "$tmpdir/lib/firmware"
343
344         cat <<EOF >> debian/control
345
346 Package: $fwpackagename
347 Architecture: all
348 Description: Linux kernel firmware, version $version
349  This package contains firmware from the Linux kernel, version $version.
350 EOF
351
352         create_package "$fwpackagename" "$fwdir"
353 fi
354
355 cat <<EOF >> debian/control
356
357 Package: $libc_headers_packagename
358 Section: devel
359 Provides: linux-kernel-headers
360 Architecture: any
361 Description: Linux support headers for userspace development
362  This package provides userspaces headers from the Linux kernel.  These headers
363  are used by the installed headers for GNU glibc and other system libraries.
364 EOF
365
366 if [ "$ARCH" != "um" ]; then
367         create_package "$kernel_headers_packagename" "$kernel_headers_dir"
368         create_package "$libc_headers_packagename" "$libc_headers_dir"
369 fi
370
371 create_package "$packagename" "$tmpdir"
372
373 if [ -n "$BUILD_DEBUG" ] ; then
374         # Build debug package
375         # Different tools want the image in different locations
376         # perf
377         mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/
378         cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/
379         # systemtap
380         mkdir -p $dbg_dir/usr/lib/debug/boot/
381         ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version
382         # kdump-tools
383         ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version
384
385         cat <<EOF >> debian/control
386
387 Package: $dbg_packagename
388 Section: debug
389 Provides: linux-debug, linux-debug-$version
390 Architecture: any
391 Description: Linux kernel debugging symbols for $version
392  This package will come in handy if you need to debug the kernel. It provides
393  all the necessary debug symbols for the kernel and its modules.
394 EOF
395
396         create_package "$dbg_packagename" "$dbg_dir"
397 fi
398
399 if [ "x$1" = "xdeb-pkg" ]
400 then
401     cat <<EOF > debian/rules
402 #!/usr/bin/make -f
403
404 build:
405         \$(MAKE)
406
407 binary-arch:
408         \$(MAKE) KDEB_SOURCENAME=${sourcename} KDEB_PKGVERSION=${packageversion} bindeb-pkg
409
410 clean:
411         rm -rf debian/*tmp debian/files
412         mv debian/ debian.backup # debian/ might be cleaned away
413         \$(MAKE) clean
414         mv debian.backup debian
415
416 binary: binary-arch
417 EOF
418         mv ${sourcename}.tar.gz ../${sourcename}_${version}.orig.tar.gz
419         tar caf ../${sourcename}_${packageversion}.debian.tar.gz debian/{copyright,rules,changelog,control}
420         dpkg-source -cdebian/control -ldebian/changelog --format="3.0 (custom)" --target-format="3.0 (quilt)" \
421                 -b / ../${sourcename}_${version}.orig.tar.gz  ../${sourcename}_${packageversion}.debian.tar.gz
422         mv ${sourcename}_${packageversion}*dsc ..
423         dpkg-genchanges > ../${sourcename}_${packageversion}_${debarch}.changes
424 else
425         dpkg-genchanges -b > ../${sourcename}_${packageversion}_${debarch}.changes
426 fi
427
428 exit 0