deb-pkg: use KCONFIG_CONFIG instead of .config file directly
[linux-drm-fsl-dcu.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         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"
23
24         # Fix ownership and permissions
25         chown -R root:root "$pdir"
26         chmod -R go-w "$pdir"
27
28         # Attempt to find the correct Debian architecture
29         local forcearch="" debarch=""
30         case "$UTS_MACHINE" in
31         i386|ia64|alpha)
32                 debarch="$UTS_MACHINE" ;;
33         x86_64)
34                 debarch=amd64 ;;
35         sparc*)
36                 debarch=sparc ;;
37         s390*)
38                 debarch=s390 ;;
39         ppc*)
40                 debarch=powerpc ;;
41         parisc*)
42                 debarch=hppa ;;
43         mips*)
44                 debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el) ;;
45         arm*)
46                 debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_CONFIG && echo el) ;;
47         *)
48                 echo "" >&2
49                 echo "** ** **  WARNING  ** ** **" >&2
50                 echo "" >&2
51                 echo "Your architecture doesn't have it's equivalent" >&2
52                 echo "Debian userspace architecture defined!" >&2
53                 echo "Falling back to using your current userspace instead!" >&2
54                 echo "Please add support for $UTS_MACHINE to ${0} ..." >&2
55                 echo "" >&2
56         esac
57         if [ -n "$KBUILD_DEBARCH" ] ; then
58                 debarch="$KBUILD_DEBARCH"
59         fi
60         if [ -n "$debarch" ] ; then
61                 forcearch="-DArchitecture=$debarch"
62         fi
63
64         # Create the package
65         dpkg-gencontrol -isp $forcearch -p$pname -P"$pdir"
66         dpkg --build "$pdir" ..
67 }
68
69 # Some variables and settings used throughout the script
70 version=$KERNELRELEASE
71 revision=$(cat .version)
72 if [ -n "$KDEB_PKGVERSION" ]; then
73         packageversion=$KDEB_PKGVERSION
74 else
75         packageversion=$version-$revision
76 fi
77 tmpdir="$objtree/debian/tmp"
78 fwdir="$objtree/debian/fwtmp"
79 kernel_headers_dir="$objtree/debian/hdrtmp"
80 libc_headers_dir="$objtree/debian/headertmp"
81 packagename=linux-image-$version
82 fwpackagename=linux-firmware-image
83 kernel_headers_packagename=linux-headers-$version
84 libc_headers_packagename=linux-libc-dev
85
86 if [ "$ARCH" = "um" ] ; then
87         packagename=user-mode-linux-$version
88 fi
89
90 # Setup the directory structure
91 rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir"
92 mkdir -m 755 -p "$tmpdir/DEBIAN"
93 mkdir -p  "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename"
94 mkdir -m 755 -p "$fwdir/DEBIAN"
95 mkdir -p "$fwdir/lib/firmware/$version/" "$fwdir/usr/share/doc/$fwpackagename"
96 mkdir -m 755 -p "$libc_headers_dir/DEBIAN"
97 mkdir -p "$libc_headers_dir/usr/share/doc/$libc_headers_packagename"
98 mkdir -m 755 -p "$kernel_headers_dir/DEBIAN"
99 mkdir -p "$kernel_headers_dir/usr/share/doc/$kernel_headers_packagename"
100 mkdir -p "$kernel_headers_dir/lib/modules/$version/"
101 if [ "$ARCH" = "um" ] ; then
102         mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin"
103 fi
104
105 # Build and install the kernel
106 if [ "$ARCH" = "um" ] ; then
107         $MAKE linux
108         cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map"
109         cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config"
110         gzip "$tmpdir/usr/share/doc/$packagename/config"
111         cp $KBUILD_IMAGE "$tmpdir/usr/bin/linux-$version"
112 else 
113         cp System.map "$tmpdir/boot/System.map-$version"
114         cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version"
115         # Not all arches include the boot path in KBUILD_IMAGE
116         if [ -e $KBUILD_IMAGE ]; then
117                 cp $KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
118         else
119                 cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version"
120         fi
121 fi
122
123 if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then
124         INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install
125         rm -f "$tmpdir/lib/modules/$version/build"
126         rm -f "$tmpdir/lib/modules/$version/source"
127         if [ "$ARCH" = "um" ] ; then
128                 mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"
129                 rmdir "$tmpdir/lib/modules/$version"
130         fi
131 fi
132
133 if [ "$ARCH" != "um" ]; then
134         $MAKE headers_check KBUILD_SRC=
135         $MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
136 fi
137
138 # Install the maintainer scripts
139 # Note: hook scripts under /etc/kernel are also executed by official Debian
140 # kernel packages, as well as kernel packages built using make-kpkg
141 debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
142 for script in postinst postrm preinst prerm ; do
143         mkdir -p "$tmpdir$debhookdir/$script.d"
144         cat <<EOF > "$tmpdir/DEBIAN/$script"
145 #!/bin/sh
146
147 set -e
148
149 # Pass maintainer script parameters to hook scripts
150 export DEB_MAINT_PARAMS="\$*"
151
152 test -d $debhookdir/$script.d && run-parts --arg="$version" $debhookdir/$script.d
153 exit 0
154 EOF
155         chmod 755 "$tmpdir/DEBIAN/$script"
156 done
157
158 # Try to determine maintainer and email values
159 if [ -n "$DEBEMAIL" ]; then
160        email=$DEBEMAIL
161 elif [ -n "$EMAIL" ]; then
162        email=$EMAIL
163 else
164        email=$(id -nu)@$(hostname -f)
165 fi
166 if [ -n "$DEBFULLNAME" ]; then
167        name=$DEBFULLNAME
168 elif [ -n "$NAME" ]; then
169        name=$NAME
170 else
171        name="Anonymous"
172 fi
173 maintainer="$name <$email>"
174
175 # Generate a simple changelog template
176 cat <<EOF > debian/changelog
177 linux-upstream ($packageversion) unstable; urgency=low
178
179   * Custom built Linux kernel.
180
181  -- $maintainer  $(date -R)
182 EOF
183
184 # Generate copyright file
185 cat <<EOF > debian/copyright
186 This is a packacked upstream version of the Linux kernel.
187
188 The sources may be found at most Linux ftp sites, including:
189 ftp://ftp.kernel.org/pub/linux/kernel
190
191 Copyright: 1991 - 2009 Linus Torvalds and others.
192
193 The git repository for mainline kernel development is at:
194 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
195
196     This program is free software; you can redistribute it and/or modify
197     it under the terms of the GNU General Public License as published by
198     the Free Software Foundation; version 2 dated June, 1991.
199
200 On Debian GNU/Linux systems, the complete text of the GNU General Public
201 License version 2 can be found in \`/usr/share/common-licenses/GPL-2'.
202 EOF
203
204 # Generate a control file
205 cat <<EOF > debian/control
206 Source: linux-upstream
207 Section: kernel
208 Priority: optional
209 Maintainer: $maintainer
210 Standards-Version: 3.8.4
211 Homepage: http://www.kernel.org/
212 EOF
213
214 if [ "$ARCH" = "um" ]; then
215         cat <<EOF >> debian/control
216
217 Package: $packagename
218 Provides: linux-image, linux-image-2.6, linux-modules-$version
219 Architecture: any
220 Description: User Mode Linux kernel, version $version
221  User-mode Linux is a port of the Linux kernel to its own system call
222  interface.  It provides a kind of virtual machine, which runs Linux
223  as a user process under another Linux kernel.  This is useful for
224  kernel development, sandboxes, jails, experimentation, and
225  many other things.
226  .
227  This package contains the Linux kernel, modules and corresponding other
228  files, version: $version.
229 EOF
230
231 else
232         cat <<EOF >> debian/control
233
234 Package: $packagename
235 Provides: linux-image, linux-image-2.6, linux-modules-$version
236 Suggests: $fwpackagename
237 Architecture: any
238 Description: Linux kernel, version $version
239  This package contains the Linux kernel, modules and corresponding other
240  files, version: $version.
241 EOF
242
243 fi
244
245 # Build header package
246 (cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl > "$objtree/debian/hdrsrcfiles")
247 (cd $srctree; find arch/$SRCARCH/include include scripts -type f >> "$objtree/debian/hdrsrcfiles")
248 (cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f >> "$objtree/debian/hdrobjfiles")
249 destdir=$kernel_headers_dir/usr/src/linux-headers-$version
250 mkdir -p "$destdir"
251 (cd $srctree; tar -c -f - -T "$objtree/debian/hdrsrcfiles") | (cd $destdir; tar -xf -)
252 (cd $objtree; tar -c -f - -T "$objtree/debian/hdrobjfiles") | (cd $destdir; tar -xf -)
253 (cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be
254 ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
255 rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
256 arch=$(dpkg --print-architecture)
257
258 cat <<EOF >> debian/control
259
260 Package: $kernel_headers_packagename
261 Provides: linux-headers, linux-headers-2.6
262 Architecture: $arch
263 Description: Linux kernel headers for $KERNELRELEASE on $arch
264  This package provides kernel header files for $KERNELRELEASE on $arch
265  .
266  This is useful for people who need to build external modules
267 EOF
268
269 # Do we have firmware? Move it out of the way and build it into a package.
270 if [ -e "$tmpdir/lib/firmware" ]; then
271         mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/"
272         rmdir "$tmpdir/lib/firmware"
273
274         cat <<EOF >> debian/control
275
276 Package: $fwpackagename
277 Architecture: all
278 Description: Linux kernel firmware, version $version
279  This package contains firmware from the Linux kernel, version $version.
280 EOF
281
282         create_package "$fwpackagename" "$fwdir"
283 fi
284
285 cat <<EOF >> debian/control
286
287 Package: $libc_headers_packagename
288 Section: devel
289 Provides: linux-kernel-headers
290 Architecture: any
291 Description: Linux support headers for userspace development
292  This package provides userspaces headers from the Linux kernel.  These headers
293  are used by the installed headers for GNU glibc and other system libraries.
294 EOF
295
296 if [ "$ARCH" != "um" ]; then
297         create_package "$kernel_headers_packagename" "$kernel_headers_dir"
298         create_package "$libc_headers_packagename" "$libc_headers_dir"
299 fi
300
301 create_package "$packagename" "$tmpdir"
302
303 exit 0