Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[deliverable/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
This page took 0.198463 seconds and 5 git commands to generate.