diff options
Diffstat (limited to 'scripts/package/builddeb')
| -rw-r--r-- | scripts/package/builddeb | 209 | 
1 files changed, 189 insertions, 20 deletions
diff --git a/scripts/package/builddeb b/scripts/package/builddeb index 49b74e1ee12..35d5a5877d0 100644 --- a/scripts/package/builddeb +++ b/scripts/package/builddeb @@ -25,8 +25,46 @@ create_package() {  	chown -R root:root "$pdir"  	chmod -R go-w "$pdir" +	# Attempt to find the correct Debian architecture +	local forcearch="" debarch="" +	case "$UTS_MACHINE" in +	i386|ia64|alpha) +		debarch="$UTS_MACHINE" ;; +	x86_64) +		debarch=amd64 ;; +	sparc*) +		debarch=sparc ;; +	s390*) +		debarch=s390$(grep -q CONFIG_64BIT=y $KCONFIG_CONFIG && echo x || true) ;; +	ppc*) +		debarch=powerpc ;; +	parisc*) +		debarch=hppa ;; +	mips*) +		debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;; +	arm64) +		debarch=arm64 ;; +	arm*) +		debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_CONFIG && echo el || true) ;; +	*) +		echo "" >&2 +		echo "** ** **  WARNING  ** ** **" >&2 +		echo "" >&2 +		echo "Your architecture doesn't have it's equivalent" >&2 +		echo "Debian userspace architecture defined!" >&2 +		echo "Falling back to using your current userspace instead!" >&2 +		echo "Please add support for $UTS_MACHINE to ${0} ..." >&2 +		echo "" >&2 +	esac +	if [ -n "$KBUILD_DEBARCH" ] ; then +		debarch="$KBUILD_DEBARCH" +	fi +	if [ -n "$debarch" ] ; then +		forcearch="-DArchitecture=$debarch" +	fi +  	# Create the package -	dpkg-gencontrol -isp -p$pname -P"$pdir" +	dpkg-gencontrol -isp $forcearch -Vkernel:debarch="${debarch:-$(dpkg --print-architecture)}" -p$pname -P"$pdir"  	dpkg --build "$pdir" ..  } @@ -40,51 +78,111 @@ else  fi  tmpdir="$objtree/debian/tmp"  fwdir="$objtree/debian/fwtmp" +kernel_headers_dir="$objtree/debian/hdrtmp" +libc_headers_dir="$objtree/debian/headertmp" +dbg_dir="$objtree/debian/dbgtmp"  packagename=linux-image-$version -fwpackagename=linux-firmware-image +fwpackagename=linux-firmware-image-$version +kernel_headers_packagename=linux-headers-$version +libc_headers_packagename=linux-libc-dev +dbg_packagename=$packagename-dbg  if [ "$ARCH" = "um" ] ; then  	packagename=user-mode-linux-$version  fi +# Not all arches have the same installed path in debian +# XXX: have each arch Makefile export a variable of the canonical image install +# path instead +case $ARCH in +um) +	installed_image_path="usr/bin/linux-$version" +	;; +parisc|mips|powerpc) +	installed_image_path="boot/vmlinux-$version" +	;; +*) +	installed_image_path="boot/vmlinuz-$version" +esac + +BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)" +  # Setup the directory structure -rm -rf "$tmpdir" "$fwdir" -mkdir -p "$tmpdir/DEBIAN" "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename" -mkdir -p "$fwdir/DEBIAN" "$fwdir/lib" "$fwdir/usr/share/doc/$fwpackagename" +rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" +mkdir -m 755 -p "$tmpdir/DEBIAN" +mkdir -p  "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename" +mkdir -m 755 -p "$fwdir/DEBIAN" +mkdir -p "$fwdir/lib/firmware/$version/" "$fwdir/usr/share/doc/$fwpackagename" +mkdir -m 755 -p "$libc_headers_dir/DEBIAN" +mkdir -p "$libc_headers_dir/usr/share/doc/$libc_headers_packagename" +mkdir -m 755 -p "$kernel_headers_dir/DEBIAN" +mkdir -p "$kernel_headers_dir/usr/share/doc/$kernel_headers_packagename" +mkdir -p "$kernel_headers_dir/lib/modules/$version/"  if [ "$ARCH" = "um" ] ; then  	mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/bin"  fi +if [ -n "$BUILD_DEBUG" ] ; then +	mkdir -p "$dbg_dir/usr/share/doc/$dbg_packagename" +	mkdir -m 755 -p "$dbg_dir/DEBIAN" +fi  # Build and install the kernel  if [ "$ARCH" = "um" ] ; then  	$MAKE linux  	cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" -	cp .config "$tmpdir/usr/share/doc/$packagename/config" +	cp $KCONFIG_CONFIG "$tmpdir/usr/share/doc/$packagename/config"  	gzip "$tmpdir/usr/share/doc/$packagename/config" -	cp $KBUILD_IMAGE "$tmpdir/usr/bin/linux-$version" -else  +else  	cp System.map "$tmpdir/boot/System.map-$version" -	cp .config "$tmpdir/boot/config-$version" -	# Not all arches include the boot path in KBUILD_IMAGE -	if [ -e $KBUILD_IMAGE ]; then -		cp $KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version" -	else -		cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version" -	fi +	cp $KCONFIG_CONFIG "$tmpdir/boot/config-$version" +fi +# Not all arches include the boot path in KBUILD_IMAGE +if [ -e $KBUILD_IMAGE ]; then +	cp $KBUILD_IMAGE "$tmpdir/$installed_image_path" +else +	cp arch/$ARCH/boot/$KBUILD_IMAGE "$tmpdir/$installed_image_path"  fi -if grep -q '^CONFIG_MODULES=y' .config ; then -	INSTALL_MOD_PATH="$tmpdir" make KBUILD_SRC= modules_install +if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then +	INSTALL_MOD_PATH="$tmpdir" $MAKE KBUILD_SRC= modules_install +	rm -f "$tmpdir/lib/modules/$version/build" +	rm -f "$tmpdir/lib/modules/$version/source"  	if [ "$ARCH" = "um" ] ; then  		mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/"  		rmdir "$tmpdir/lib/modules/$version"  	fi +	if [ -n "$BUILD_DEBUG" ] ; then +		( +			cd $tmpdir +			for module in $(find lib/modules/ -name *.ko); do +				mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module) +				# only keep debug symbols in the debug file +				$OBJCOPY --only-keep-debug $module $dbg_dir/usr/lib/debug/$module +				# strip original module from debug symbols +				$OBJCOPY --strip-debug $module +				# then add a link to those +				$OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $module +			done +		) +	fi +fi + +if [ "$ARCH" != "um" ]; then +	$MAKE headers_check KBUILD_SRC= +	$MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"  fi  # Install the maintainer scripts  # Note: hook scripts under /etc/kernel are also executed by official Debian -# kernel packages, as well as kernel packages built using make-kpkg +# kernel packages, as well as kernel packages built using make-kpkg. +# make-kpkg sets $INITRD to indicate whether an initramfs is wanted, and +# so do we; recent versions of dracut and initramfs-tools will obey this.  debhookdir=${KDEB_HOOKDIR:-/etc/kernel} +if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then +	want_initrd=Yes +else +	want_initrd=No +fi  for script in postinst postrm preinst prerm ; do  	mkdir -p "$tmpdir$debhookdir/$script.d"  	cat <<EOF > "$tmpdir/DEBIAN/$script" @@ -95,7 +193,10 @@ set -e  # Pass maintainer script parameters to hook scripts  export DEB_MAINT_PARAMS="\$*" -test -d $debhookdir/$script.d && run-parts --arg="$version" $debhookdir/$script.d +# Tell initramfs builder whether it's wanted +export INITRD=$want_initrd + +test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d  exit 0  EOF  	chmod 755 "$tmpdir/DEBIAN/$script" @@ -188,9 +289,35 @@ EOF  fi +# Build kernel header package +(cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles" +(cd $srctree; find arch/$SRCARCH/include include scripts -type f) >> "$objtree/debian/hdrsrcfiles" +(cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles" +(cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles" +(cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles" +destdir=$kernel_headers_dir/usr/src/linux-headers-$version +mkdir -p "$destdir" +(cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) +(cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -) +(cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be +ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" +rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" + +cat <<EOF >> debian/control + +Package: $kernel_headers_packagename +Provides: linux-headers, linux-headers-2.6 +Architecture: any +Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} + This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch} + . + This is useful for people who need to build external modules +EOF +  # Do we have firmware? Move it out of the way and build it into a package.  if [ -e "$tmpdir/lib/firmware" ]; then -	mv "$tmpdir/lib/firmware" "$fwdir/lib/" +	mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/" +	rmdir "$tmpdir/lib/firmware"  	cat <<EOF >> debian/control @@ -203,6 +330,48 @@ EOF  	create_package "$fwpackagename" "$fwdir"  fi +cat <<EOF >> debian/control + +Package: $libc_headers_packagename +Section: devel +Provides: linux-kernel-headers +Architecture: any +Description: Linux support headers for userspace development + This package provides userspaces headers from the Linux kernel.  These headers + are used by the installed headers for GNU glibc and other system libraries. +EOF + +if [ "$ARCH" != "um" ]; then +	create_package "$kernel_headers_packagename" "$kernel_headers_dir" +	create_package "$libc_headers_packagename" "$libc_headers_dir" +fi +  create_package "$packagename" "$tmpdir" +if [ -n "$BUILD_DEBUG" ] ; then +	# Build debug package +	# Different tools want the image in different locations +	# perf +	mkdir -p $dbg_dir/usr/lib/debug/lib/modules/$version/ +	cp vmlinux $dbg_dir/usr/lib/debug/lib/modules/$version/ +	# systemtap +	mkdir -p $dbg_dir/usr/lib/debug/boot/ +	ln -s ../lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/boot/vmlinux-$version +	# kdump-tools +	ln -s lib/modules/$version/vmlinux $dbg_dir/usr/lib/debug/vmlinux-$version + +	cat <<EOF >> debian/control + +Package: $dbg_packagename +Section: debug +Provides: linux-debug, linux-debug-$version +Architecture: any +Description: Linux kernel debugging symbols for $version + This package will come in handy if you need to debug the kernel. It provides + all the necessary debug symbols for the kernel and its modules. +EOF + +	create_package "$dbg_packagename" "$dbg_dir" +fi +  exit 0  | 
