blk: rq_data_dir() should not return a boolean
[cris-mirror.git] / scripts / package / builddeb
blob0cd46e129920e8ad114eb335ae92ce85230d068d
1 #!/bin/sh
3 # builddeb 1.3
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
11 # removal.
13 set -e
15 create_package() {
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"
28 chmod -R go-w "$pdir"
30 # Create the package
31 dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch}" -p$pname -P"$pdir"
32 dpkg --build "$pdir" ..
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) ;;
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"
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
79 else
80 packageversion=$version-$revision
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
97 if [ "$ARCH" = "um" ] ; then
98 packagename=user-mode-linux-$version
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
106 installed_image_path="usr/bin/linux-$version"
108 parisc|mips|powerpc)
109 installed_image_path="boot/vmlinux-$version"
112 installed_image_path="boot/vmlinuz-$version"
113 esac
115 BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)"
117 # Setup the directory structure
118 rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir"
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/"
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"
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"
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
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"
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
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
177 if [ "$ARCH" != "um" ]; then
178 $MAKE headers_check KBUILD_SRC=
179 $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
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
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
198 set -e
200 # Pass maintainer script parameters to hook scripts
201 export DEB_MAINT_PARAMS="\$*"
203 # Tell initramfs builder whether it's wanted
204 export INITRD=$want_initrd
206 test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d
207 exit 0
209 chmod 755 "$tmpdir/DEBIAN/$script"
210 done
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)
220 if [ -n "$DEBFULLNAME" ]; then
221 name=$DEBFULLNAME
222 elif [ -n "$NAME" ]; then
223 name=$NAME
224 else
225 name="Anonymous"
227 maintainer="$name <$email>"
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"
240 # Generate a simple changelog template
241 cat <<EOF > debian/changelog
242 $sourcename ($packageversion) $distribution; urgency=low
244 * Custom built Linux kernel.
246 -- $maintainer $(date -R)
249 # Generate copyright file
250 cat <<EOF > debian/copyright
251 This is a packacked upstream version of the Linux kernel.
253 The sources may be found at most Linux ftp sites, including:
254 ftp://ftp.kernel.org/pub/linux/kernel
256 Copyright: 1991 - 2015 Linus Torvalds and others.
258 The git repository for mainline kernel development is at:
259 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
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.
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'.
270 build_depends="bc, kmod, cpio "
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/
283 if [ "$ARCH" = "um" ]; then
284 cat <<EOF >> debian/control
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.
296 This package contains the Linux kernel, modules and corresponding other
297 files, version: $version.
300 else
301 cat <<EOF >> debian/control
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.
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"
328 cat <<EOF >> debian/control
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}
336 This is useful for people who need to build external modules
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"
344 cat <<EOF >> debian/control
346 Package: $fwpackagename
347 Architecture: all
348 Description: Linux kernel firmware, version $version
349 This package contains firmware from the Linux kernel, version $version.
352 create_package "$fwpackagename" "$fwdir"
355 cat <<EOF >> debian/control
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.
366 if [ "$ARCH" != "um" ]; then
367 create_package "$kernel_headers_packagename" "$kernel_headers_dir"
368 create_package "$libc_headers_packagename" "$libc_headers_dir"
371 create_package "$packagename" "$tmpdir"
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
385 cat <<EOF >> debian/control
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.
396 create_package "$dbg_packagename" "$dbg_dir"
399 if [ "x$1" = "xdeb-pkg" ]
400 then
401 cat <<EOF > debian/rules
402 #!/usr/bin/make -f
404 build:
405 \$(MAKE)
407 binary-arch:
408 \$(MAKE) KDEB_SOURCENAME=${sourcename} KDEB_PKGVERSION=${packageversion} bindeb-pkg
410 clean:
411 rm -rf debian/*tmp
412 mv debian/ debian.backup # debian/ might be cleaned away
413 \$(MAKE) clean
414 mv debian.backup debian
416 binary: binary-arch
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
428 exit 0