xref: /OK3568_Linux_fs/kernel/scripts/package/builddeb (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/sh
2*4882a593Smuzhiyun#
3*4882a593Smuzhiyun# builddeb 1.3
4*4882a593Smuzhiyun# Copyright 2003 Wichert Akkerman <wichert@wiggy.net>
5*4882a593Smuzhiyun#
6*4882a593Smuzhiyun# Simple script to generate a deb package for a Linux kernel. All the
7*4882a593Smuzhiyun# complexity of what to do with a kernel after it is installed or removed
8*4882a593Smuzhiyun# is left to other scripts and packages: they can install scripts in the
9*4882a593Smuzhiyun# /etc/kernel/{pre,post}{inst,rm}.d/ directories (or an alternative location
10*4882a593Smuzhiyun# specified in KDEB_HOOKDIR) that will be called on package install and
11*4882a593Smuzhiyun# removal.
12*4882a593Smuzhiyun
13*4882a593Smuzhiyunset -e
14*4882a593Smuzhiyun
15*4882a593Smuzhiyunis_enabled() {
16*4882a593Smuzhiyun	grep -q "^$1=y" include/config/auto.conf
17*4882a593Smuzhiyun}
18*4882a593Smuzhiyun
19*4882a593Smuzhiyunif_enabled_echo() {
20*4882a593Smuzhiyun	if is_enabled "$1"; then
21*4882a593Smuzhiyun		echo -n "$2"
22*4882a593Smuzhiyun	elif [ $# -ge 3 ]; then
23*4882a593Smuzhiyun		echo -n "$3"
24*4882a593Smuzhiyun	fi
25*4882a593Smuzhiyun}
26*4882a593Smuzhiyun
27*4882a593Smuzhiyuncreate_package() {
28*4882a593Smuzhiyun	local pname="$1" pdir="$2"
29*4882a593Smuzhiyun	local dpkg_deb_opts
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun	mkdir -m 755 -p "$pdir/DEBIAN"
32*4882a593Smuzhiyun	mkdir -p "$pdir/usr/share/doc/$pname"
33*4882a593Smuzhiyun	cp debian/copyright "$pdir/usr/share/doc/$pname/"
34*4882a593Smuzhiyun	cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian"
35*4882a593Smuzhiyun	gzip -n -9 "$pdir/usr/share/doc/$pname/changelog.Debian"
36*4882a593Smuzhiyun	sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \
37*4882a593Smuzhiyun		| xargs -r0 md5sum > DEBIAN/md5sums"
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun	# Fix ownership and permissions
40*4882a593Smuzhiyun	if [ "$DEB_RULES_REQUIRES_ROOT" = "no" ]; then
41*4882a593Smuzhiyun		dpkg_deb_opts="--root-owner-group"
42*4882a593Smuzhiyun	else
43*4882a593Smuzhiyun		chown -R root:root "$pdir"
44*4882a593Smuzhiyun	fi
45*4882a593Smuzhiyun	chmod -R go-w "$pdir"
46*4882a593Smuzhiyun	# in case we are in a restrictive umask environment like 0077
47*4882a593Smuzhiyun	chmod -R a+rX "$pdir"
48*4882a593Smuzhiyun	# in case we build in a setuid/setgid directory
49*4882a593Smuzhiyun	chmod -R ug-s "$pdir"
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun	# Create the package
52*4882a593Smuzhiyun	dpkg-gencontrol -p$pname -P"$pdir"
53*4882a593Smuzhiyun	dpkg-deb $dpkg_deb_opts ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" ..
54*4882a593Smuzhiyun}
55*4882a593Smuzhiyun
56*4882a593Smuzhiyundeploy_kernel_headers () {
57*4882a593Smuzhiyun	pdir=$1
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun	rm -rf $pdir
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun	(
62*4882a593Smuzhiyun		cd $srctree
63*4882a593Smuzhiyun		find . arch/$SRCARCH -maxdepth 1 -name Makefile\*
64*4882a593Smuzhiyun		find include scripts -type f -o -type l
65*4882a593Smuzhiyun		find arch/$SRCARCH -name Kbuild.platforms -o -name Platform
66*4882a593Smuzhiyun		find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f
67*4882a593Smuzhiyun	) > debian/hdrsrcfiles
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun	{
70*4882a593Smuzhiyun		if is_enabled CONFIG_STACK_VALIDATION; then
71*4882a593Smuzhiyun			echo tools/objtool/objtool
72*4882a593Smuzhiyun		fi
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun		find arch/$SRCARCH/include Module.symvers include scripts -type f
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun		if is_enabled CONFIG_GCC_PLUGINS; then
77*4882a593Smuzhiyun			find scripts/gcc-plugins -name \*.so
78*4882a593Smuzhiyun		fi
79*4882a593Smuzhiyun	} > debian/hdrobjfiles
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun	destdir=$pdir/usr/src/linux-headers-$version
82*4882a593Smuzhiyun	mkdir -p $destdir
83*4882a593Smuzhiyun	tar -c -f - -C $srctree -T debian/hdrsrcfiles | tar -xf - -C $destdir
84*4882a593Smuzhiyun	tar -c -f - -T debian/hdrobjfiles | tar -xf - -C $destdir
85*4882a593Smuzhiyun	rm -f debian/hdrsrcfiles debian/hdrobjfiles
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun	# copy .config manually to be where it's expected to be
88*4882a593Smuzhiyun	cp $KCONFIG_CONFIG $destdir/.config
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun	mkdir -p $pdir/lib/modules/$version/
91*4882a593Smuzhiyun	ln -s /usr/src/linux-headers-$version $pdir/lib/modules/$version/build
92*4882a593Smuzhiyun}
93*4882a593Smuzhiyun
94*4882a593Smuzhiyundeploy_libc_headers () {
95*4882a593Smuzhiyun	pdir=$1
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun	rm -rf $pdir
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun	$MAKE -f $srctree/Makefile headers
100*4882a593Smuzhiyun	$MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH=$pdir/usr
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun	# move asm headers to /usr/include/<libc-machine>/asm to match the structure
103*4882a593Smuzhiyun	# used by Debian-based distros (to support multi-arch)
104*4882a593Smuzhiyun	host_arch=$(dpkg-architecture -a$(cat debian/arch) -qDEB_HOST_MULTIARCH)
105*4882a593Smuzhiyun	mkdir $pdir/usr/include/$host_arch
106*4882a593Smuzhiyun	mv $pdir/usr/include/asm $pdir/usr/include/$host_arch/
107*4882a593Smuzhiyun}
108*4882a593Smuzhiyun
109*4882a593Smuzhiyunversion=$KERNELRELEASE
110*4882a593Smuzhiyuntmpdir=debian/linux-image
111*4882a593Smuzhiyundbg_dir=debian/linux-image-dbg
112*4882a593Smuzhiyunpackagename=linux-image-$version
113*4882a593Smuzhiyundbg_packagename=$packagename-dbg
114*4882a593Smuzhiyun
115*4882a593Smuzhiyunif [ "$ARCH" = "um" ] ; then
116*4882a593Smuzhiyun	packagename=user-mode-linux-$version
117*4882a593Smuzhiyunfi
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun# Not all arches have the same installed path in debian
120*4882a593Smuzhiyun# XXX: have each arch Makefile export a variable of the canonical image install
121*4882a593Smuzhiyun# path instead
122*4882a593Smuzhiyuncase $ARCH in
123*4882a593Smuzhiyunum)
124*4882a593Smuzhiyun	installed_image_path="usr/bin/linux-$version"
125*4882a593Smuzhiyun	;;
126*4882a593Smuzhiyunparisc|mips|powerpc)
127*4882a593Smuzhiyun	installed_image_path="boot/vmlinux-$version"
128*4882a593Smuzhiyun	;;
129*4882a593Smuzhiyun*)
130*4882a593Smuzhiyun	installed_image_path="boot/vmlinuz-$version"
131*4882a593Smuzhiyunesac
132*4882a593Smuzhiyun
133*4882a593SmuzhiyunBUILD_DEBUG=$(if_enabled_echo CONFIG_DEBUG_INFO Yes)
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun# Setup the directory structure
136*4882a593Smuzhiyunrm -rf "$tmpdir" "$dbg_dir" debian/files
137*4882a593Smuzhiyunmkdir -m 755 -p "$tmpdir/DEBIAN"
138*4882a593Smuzhiyunmkdir -p "$tmpdir/lib" "$tmpdir/boot"
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun# Install the kernel
141*4882a593Smuzhiyunif [ "$ARCH" = "um" ] ; then
142*4882a593Smuzhiyun	mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin" "$tmpdir/usr/share/doc/$packagename"
143*4882a593Smuzhiyun	cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
144*4882a593Smuzhiyun	cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config"
145*4882a593Smuzhiyun	gzip "$tmpdir/usr/share/doc/$packagename/config"
146*4882a593Smuzhiyunelse
147*4882a593Smuzhiyun	cp System.map "$tmpdir/boot/System.map-$version"
148*4882a593Smuzhiyun	cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version"
149*4882a593Smuzhiyunfi
150*4882a593Smuzhiyuncp "$($MAKE -s -f $srctree/Makefile image_name)" "$tmpdir/$installed_image_path"
151*4882a593Smuzhiyun
152*4882a593Smuzhiyunif is_enabled CONFIG_OF_EARLY_FLATTREE; then
153*4882a593Smuzhiyun	# Only some architectures with OF support have this target
154*4882a593Smuzhiyun	if [ -d "${srctree}/arch/$SRCARCH/boot/dts" ]; then
155*4882a593Smuzhiyun		$MAKE -f $srctree/Makefile INSTALL_DTBS_PATH="$tmpdir/usr/lib/$packagename" dtbs_install
156*4882a593Smuzhiyun	fi
157*4882a593Smuzhiyunfi
158*4882a593Smuzhiyun
159*4882a593Smuzhiyunif is_enabled CONFIG_MODULES; then
160*4882a593Smuzhiyun	INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_install
161*4882a593Smuzhiyun	rm -f "$tmpdir/lib/modules/$version/build"
162*4882a593Smuzhiyun	rm -f "$tmpdir/lib/modules/$version/source"
163*4882a593Smuzhiyun	if [ "$ARCH" = "um" ] ; then
164*4882a593Smuzhiyun		mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
165*4882a593Smuzhiyun		rmdir "$tmpdir/lib/modules/$version"
166*4882a593Smuzhiyun	fi
167*4882a593Smuzhiyun	if [ -n "$BUILD_DEBUG" ] ; then
168*4882a593Smuzhiyun		for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do
169*4882a593Smuzhiyun			module=lib/modules/$module
170*4882a593Smuzhiyun			mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module)
171*4882a593Smuzhiyun			# only keep debug symbols in the debug file
172*4882a593Smuzhiyun			$OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module
173*4882a593Smuzhiyun			# strip original module from debug symbols
174*4882a593Smuzhiyun			$OBJCOPY --strip-debug $tmpdir/$module
175*4882a593Smuzhiyun			# then add a link to those
176*4882a593Smuzhiyun			$OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module
177*4882a593Smuzhiyun		done
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun		# resign stripped modules
180*4882a593Smuzhiyun		if is_enabled CONFIG_MODULE_SIG_ALL; then
181*4882a593Smuzhiyun			INSTALL_MOD_PATH="$tmpdir" $MAKE -f $srctree/Makefile modules_sign
182*4882a593Smuzhiyun		fi
183*4882a593Smuzhiyun	fi
184*4882a593Smuzhiyunfi
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun# Install the maintainer scripts
187*4882a593Smuzhiyun# Note: hook scripts under /etc/kernel are also executed by official Debian
188*4882a593Smuzhiyun# kernel packages, as well as kernel packages built using make-kpkg.
189*4882a593Smuzhiyun# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and
190*4882a593Smuzhiyun# so do we; recent versions of dracut and initramfs-tools will obey this.
191*4882a593Smuzhiyundebhookdir=${KDEB_HOOKDIR:-/etc/kernel}
192*4882a593Smuzhiyunfor script in postinst postrm preinst prerm ; do
193*4882a593Smuzhiyun	mkdir -p "$tmpdir$debhookdir/$script.d"
194*4882a593Smuzhiyun	cat <<EOF > "$tmpdir/DEBIAN/$script"
195*4882a593Smuzhiyun#!/bin/sh
196*4882a593Smuzhiyun
197*4882a593Smuzhiyunset -e
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun# Pass maintainer script parameters to hook scripts
200*4882a593Smuzhiyunexport DEB_MAINT_PARAMS="\$*"
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun# Tell initramfs builder whether it's wanted
203*4882a593Smuzhiyunexport INITRD=$(if_enabled_echo CONFIG_BLK_DEV_INITRD Yes No)
204*4882a593Smuzhiyun
205*4882a593Smuzhiyuntest -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d
206*4882a593Smuzhiyunexit 0
207*4882a593SmuzhiyunEOF
208*4882a593Smuzhiyun	chmod 755 "$tmpdir/DEBIAN/$script"
209*4882a593Smuzhiyundone
210*4882a593Smuzhiyun
211*4882a593Smuzhiyunif [ "$ARCH" != "um" ]; then
212*4882a593Smuzhiyun	if is_enabled CONFIG_MODULES; then
213*4882a593Smuzhiyun		deploy_kernel_headers debian/linux-headers
214*4882a593Smuzhiyun		create_package linux-headers-$version debian/linux-headers
215*4882a593Smuzhiyun	fi
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun	deploy_libc_headers debian/linux-libc-dev
218*4882a593Smuzhiyun	create_package linux-libc-dev debian/linux-libc-dev
219*4882a593Smuzhiyunfi
220*4882a593Smuzhiyun
221*4882a593Smuzhiyuncreate_package "$packagename" "$tmpdir"
222*4882a593Smuzhiyun
223*4882a593Smuzhiyunif [ -n "$BUILD_DEBUG" ] ; then
224*4882a593Smuzhiyun	# Build debug package
225*4882a593Smuzhiyun	# Different tools want the image in different locations
226*4882a593Smuzhiyun	# perf
227*4882a593Smuzhiyun	mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/
228*4882a593Smuzhiyun	cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/
229*4882a593Smuzhiyun	# systemtap
230*4882a593Smuzhiyun	mkdir -p $dbg_dir/usr/lib/debug/boot/
231*4882a593Smuzhiyun	ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version
232*4882a593Smuzhiyun	# kdump-tools
233*4882a593Smuzhiyun	ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version
234*4882a593Smuzhiyun	create_package "$dbg_packagename" "$dbg_dir"
235*4882a593Smuzhiyunfi
236*4882a593Smuzhiyun
237*4882a593Smuzhiyunexit 0
238