builddeb 9.2 KB

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