r2846 - trunk/scripts

Simon Horman horms@costa.debian.org
Tue, 29 Mar 2005 03:36:25 +0000


Author: horms
Date: 2005-03-29 03:36:24 +0000 (Tue, 29 Mar 2005)
New Revision: 2846

Added:
   trunk/scripts/test_kernel_build
Log:
This is the script that I use to build kernels, mangle/ignore/delete at will

Added: trunk/scripts/test_kernel_build
===================================================================
--- trunk/scripts/test_kernel_build	2005-03-29 03:35:26 UTC (rev 2845)
+++ trunk/scripts/test_kernel_build	2005-03-29 03:36:24 UTC (rev 2846)
@@ -0,0 +1,443 @@
+#!/bin/bash
+######################################################################
+# Horms                                                   October 2004
+######################################################################
+
+START=$(date --rfc)
+
+set -e
+
+usage () 
+{
+	echo "Usage: $0 VERSION [START_STAGE] [END_STAGE]" 1>&2
+	exit 1
+}
+
+export LC_ALL=C
+unset LANG
+unset LANGUAGE
+
+#TO="horms+keitai@verge.net.au"
+TO="simon@valinux.co.jp"
+SUBJECT="Kernel Build"
+
+if ! which fakeroot >& /dev/null; then
+	echo "Error: fakeroot is not installed" 1>&2
+	exit 1
+fi
+
+umask 022
+
+unset MAKE
+export CONCURRENCY_LEVEL=2
+
+#export DISTCC_HOSTS='harry.lab.ultramonkey.org charles.lab.ultramonkey.org citadel.lab.ultramonkey.org tabatha.lab.ultramonkey.org'
+#export MAKE="make CC=\"ccache distcc gcc-3.2\""
+#export CONCURRENCY_LEVEL=16
+
+#export MAKE="make CC=\"ccache gcc-3.2\""
+#export CONCURRENCY_LEVEL=8
+#export MAKE="make CC=\"gcc-3.2\""
+
+export CCACHE_HARDLINK
+
+if [ $# -lt 1 -o $# -gt 3 ]; then
+	usage
+fi
+VERSION="$1"
+if [ $# -gt 1 ]; then
+	START_STAGE=$2
+else
+	START_STAGE=0
+fi
+if [ $# -gt 2 ]; then
+	END_STAGE=$3
+else
+	END_STAGE=1000
+fi
+STAGE=0
+
+shopt -s extglob
+case $VERSION in
+	2.6.+([0-9]))
+		MAJOR_MINOR="2.6"
+		SVN_SUBDIR="kernel"
+	;;
+	2.4.+([0-9]))
+		MAJOR_MINOR="2.4"
+		SVN_SUBDIR="kernel-2.4"
+	;;
+	*)
+		echo "Unknown Version" 1>&2
+		usage
+	;;
+esac
+shopt -u extglob
+
+LOG=""
+#STAMP="${VERSION}_$(date +%Y-%m-%d_%H:%M:%S).$$"
+STAMP="${VERSION}"
+STAGE_STATUS="failed"
+KERNEL_ARCH="i386"
+SVN_BASE="$HOME/work/debian-kernel/svn/kernel/trunk"
+S_SRC_BASE="$SVN_BASE/$SVN_SUBDIR/source"
+B_SRC_BASE="$SVN_BASE/$SVN_SUBDIR/$KERNEL_ARCH"
+S_DST_BASE="/tmp/debian-kernel-test"
+B_DST_BASE="$S_DST_BASE"
+
+S_SRC_DIR="$S_SRC_BASE/kernel-source-$VERSION-$VERSION"
+S_DST_DIR="$S_DST_BASE/kernel-source-$VERSION-$VERSION"
+S_PKG_DIR="$S_DST_DIR/kernel-source-$VERSION-$VERSION"
+S_LOG="$S_DST_DIR/kernel-source-$STAMP.log"
+B_SRC_DIR="$B_SRC_BASE/kernel-image-$VERSION-$KERNEL_ARCH-$VERSION"
+B_DST_DIR="$B_DST_BASE/kernel-image-$VERSION-$KERNEL_ARCH-$VERSION"
+B_PKG_DIR="$B_DST_DIR//kernel-image-$VERSION-$KERNEL_ARCH-$VERSION"
+B_LOG="$B_DST_DIR/kernel-image-$STAMP.log"
+
+trap pm_quit EXIT
+trap pm_quit SIGHUP
+trap pm_quit SIGTERM
+trap pm_quit SIGQUIT
+
+set -e
+
+kernel_symbol_check_clean ()
+{
+	rm -rf "$TMP";
+}
+
+kernel_symbol_check ()
+{
+	TMP="$(mktemp -d)"
+	trap kernel_symbol_check_clean EXIT
+
+
+	PKG1="$1"
+	PKG2="$2"
+
+	echo "Checking $PKG1 vs $PKG2"
+
+	PKG1_FILE="${PKG1##*/}"
+	PKG1_BASE="${PKG1_FILE%%_*}"
+
+	PKG2_FILE="${PKG2##*/}"
+	PKG2_BASE="${PKG2_FILE%%_*}"
+
+	rm -rf "$TMP/1/" "$TMP/2/"
+	mkdir "$TMP/1/" "$TMP/2/"
+	dpkg -x "$PKG1" "$TMP/1/"
+	dpkg -x "$PKG2" "$TMP/2/"
+
+	find "$TMP/1/usr/src/$PKG1_BASE/include" -name "*.ver" -type f | \
+		xargs cat | sort > "$TMP/1.sym"
+	find "$TMP/2/usr/src/$PKG2_BASE/include" -name "*.ver" -type f | \
+		xargs cat | sort > "$TMP/2.sym"
+
+	diff -u "$TMP/1.sym" "$TMP/2.sym" > "$TMP/sym.udiff" || true
+	diff "$TMP/1.sym" "$TMP/2.sym" > "$TMP/sym.diff" || true
+	cat "$TMP/sym.udiff"
+	if grep "^<" "$TMP/sym.diff" > /dev/null; then
+		echo 'Error: Symbol Changes, as above. Incompatible ABI!!!'
+		STATUS=1
+	elif [ -s "$TMP/sym.udiff" ]; then
+		echo "Warning: Additions made to ABI"
+		STATUS=2
+	else
+		echo "No Changes"
+		STATUS=0
+	fi
+
+	kernel_symbol_check_clean
+	trap EXIT
+	return $STATUS
+}
+
+LOG_BUF=""
+log ()
+{
+	echo $@
+	if [ -f "$LOG" ]; then
+		echo "$LOG_BUF"$@ >> "$LOG"
+		LOG_BUF=""
+	else
+		LOG_BUF="${LOG_BUF}$(echo $@)"
+	fi
+}
+
+openlog ()
+{
+	echo "$LOG_BUF" > "$LOG"
+	LOG_BUF=""
+}
+
+purgelog ()
+{
+	rm -f "$LOG"
+}
+
+pm_quit ()
+{
+	log ""
+	
+	echo "Status: $STAGE_STATUS"
+	echo "Version: $VERSION"
+	echo -n "Host: "
+	hostname -s
+	echo "Start: $START"
+	echo -n "Finish: "
+	date --rfc
+	times
+
+	if [ "$STAGE_STATUS" = failed ]; then
+		echo "Stage: $STAGE: $STAGE_NAME..."
+		[ -f "$LOG.$STAGE" ] && tail -100 "$LOG.$STAGE"
+	fi
+	
+	{
+	echo "Status: $STAGE_STATUS"
+	echo "Version: $VERSION"
+	echo -n "Host: "
+	hostname -s
+	echo "Start: $START"
+	echo -n "Finish: "
+	date --rfc
+	times
+
+	if [ "$STAGE_STATUS" = failed ]; then
+		echo "Stage: $STAGE: $STAGE_NAME..."
+		[ -f "$LOG.$STAGE" ] && tail -100 "$LOG.$STAGE" | tac
+	else
+		[ -f "$B_LOG" ] && tac "$B_LOG"
+		[ -f "$S_LOG" ] && tac "$S_LOG"
+	fi
+	} | mail -s "Build: ($STAGE_STATUS: $VERSION: $(hostname -s))" $TO
+
+}
+
+stage_begin ()
+{
+	if [ $END_STAGE -eq $STAGE ]; then
+		log "exiting on request"
+		STAGE_STATUS="ok"
+		exit 0
+	fi
+
+	STAGE=$(( $STAGE + 1 ))
+	log -n "Stage $STAGE: $@... "
+
+	if [ $STAGE -lt $START_STAGE -a -f "$DST_DIR/$STAGE.marker" ]; then
+		log skipped
+		return 0
+	fi
+	return 1
+}
+
+stage_end ()
+{
+	STATUS="$1"
+	if [ $STATUS -ne 0 ]; then
+		log "failed"
+		cat "$LOG.$STAGE"
+		exit 1
+	fi
+	touch "$DST_DIR/$STAGE.marker"
+	log "ok!"
+}
+
+log "Building as $(whoami)@$(hostname) (this will be included in dmsg)";
+if [ -n "$RELEASE" ]; then
+	log "Building for release, kernel-tree will need to be installed"
+else
+	log "Building for testing, dependancies will be mangled"
+	log "Define RELEASE=yes in the environment to build for a release"
+fi
+
+LOG="$S_LOG"
+purgelog
+DST_DIR="$S_DST_DIR"
+STAGE_NAME="Creating kernel-source directory"
+stage_begin "$STAGE_NAME" || {
+	{
+		rm -rf "$S_DST_DIR" "$S_PKG_DIR" "$S_DST_DIR/tmp"
+		mkdir -p "$S_DST_DIR" "$S_DST_DIR/tmp"
+	}
+	stage_end $?
+}
+openlog
+log "Logs in $LOG.blah"
+
+STAGE_NAME="Fetching kernel-source tarball from debian archive"
+stage_begin "$STAGE_NAME" || {
+	(
+		cd "$S_DST_DIR" && \
+		apt-get source -d -q=1 "kernel-source-$VERSION" && \
+		tar -zxf "kernel-source-${VERSION}_$VERSION.orig.tar.gz" && \
+		test ! -d "kernel-source-${VERSION}-$VERSION.orig" || \
+		mv "kernel-source-${VERSION}-$VERSION.orig" \
+			"kernel-source-${VERSION}-$VERSION"
+	) >& "$LOG.$STAGE"
+	stage_end $?
+}
+
+STAGE_NAME="Copying kernel-source debian directory"
+stage_begin "$STAGE_NAME" || {
+	{
+		( cd "$S_SRC_DIR/" && svn status; ) > "$LOG.$STAGE.svn" && \
+		rsync -av --exclude .svn --exclude ".*.sw[a-z]" \
+			"$S_SRC_DIR/" "$S_PKG_DIR/"  && \
+		chmod u+x "$S_PKG_DIR/debian/rules" && \
+		echo "Do not remove this line. " > "$S_PKG_DIR/debian/official"
+	} >& "$LOG.$STAGE"
+	stage_end $?
+	if [ -s "$LOG.$STAGE.svn" ]; then
+		echo "=== SVN file stauts ==="
+		cat "$LOG.$STAGE.svn"
+	fi | tee -a "$LOG.$STAGE"
+}
+
+STAGE_NAME="Patching kernel-source tree"
+stage_begin "$STAGE_NAME" || {
+	(
+		cd "$S_PKG_DIR" && \
+		./debian/rules patch
+	) >& "$LOG.$STAGE"
+	stage_end $?
+}
+
+STAGE_NAME="Build kernel-source package"
+stage_begin "$STAGE_NAME" || {
+	(
+		cd "$S_PKG_DIR" && \
+		dpkg-buildpackage -us -uc -rfakeroot
+	) >& "$LOG.$STAGE"
+	stage_end $?
+}
+
+STAGE_NAME="Extracting kernel-source package"
+stage_begin "$STAGE_NAME" || {
+	{
+	if [ -n "$RELEASE" ]; then
+		echo skip
+	else
+		DEB_VERSION=$(( cd "$S_PKG_DIR" && dpkg-parsechangelog; ) | \
+			awk '/^Version: / { print $$2 }') && \
+		dpkg-deb -x "$S_DST_DIR/kernel-source-${VERSION}_${DEB_VERSION}_all.deb" "$S_DST_DIR/tmp" && \
+		mv "$S_DST_DIR/tmp/usr/src/kernel-source-$VERSION.tar.bz2" \
+			"$S_DST_DIR"
+	fi
+	} >& "$LOG.$STAGE"
+	stage_end $?
+}
+
+LOG="$B_LOG"
+purgelog
+DST_DIR="$B_DST_DIR"
+STAGE_NAME="Creating kernel-image directory"
+stage_begin "$STAGE_NAME" || {
+	{
+		rm -rf "$B_DST_DIR" "$B_PKG_DIR"
+		mkdir -p "$B_DST_DIR"
+	}
+	stage_end $?
+}
+openlog
+log "Logs in $LOG.blah"
+
+STAGE_NAME="Copying kernel-image debian directory"
+stage_begin "$STAGE_NAME" || {
+	{
+		( cd "$B_SRC_DIR/" && svn status; ) > "$LOG.$STAGE.svn" && \
+		rsync -av --exclude .svn "$B_SRC_DIR/" "$B_PKG_DIR/"  && \
+		chmod u+x "$B_PKG_DIR/debian/rules"
+	} >& "$LOG.$STAGE"
+	stage_end $?
+	if [ -s "$LOG.$STAGE.svn" ]; then
+		echo "=== SVN file stauts ==="
+		cat "$LOG.$STAGE.svn"
+	fi | tee -a "$LOG.$STAGE"
+}
+
+STAGE_NAME="Mangling kernel-image debian/{rules,control}"
+stage_begin "$STAGE_NAME" || {
+	{
+	if [ -n "$RELEASE" ]; then
+		echo skip
+	else
+		DEB_VERSION=$(( cd "$S_PKG_DIR" && dpkg-parsechangelog; ) | \
+			awk '/^Version: / { print $$2 }') && \
+		TMP_DIR="$(echo $S_DST_DIR | sed -e 's/\//\\\//g')" && \
+		TMP_CMD="override_version=$DEB_VERSION home=$S_PKG_DIR/debian/patches sh $S_PKG_DIR/debian/apply" && \
+		TMP_CMD="$(echo $TMP_CMD | sed -e 's/\//\\\//g')" && \
+		sed -e "s/\/usr\/src\(\/kernel-source\)/$TMP_DIR\1/" \
+			-e "s/\/usr\/src\/.*\/apply\/debian/$TMP_CMD/" \
+			< "$B_PKG_DIR/debian/rules" \
+			> "$B_PKG_DIR/debian/rules.2" && \
+		mv "$B_PKG_DIR/debian/rules.2" "$B_PKG_DIR/debian/rules" && \
+		chmod u+x "$B_PKG_DIR/debian/rules" && \
+		sed -re "/^Build-Depends: / s/kernel-tree-$VERSION-[0-9]+(, )?//" \
+			< "$B_PKG_DIR/debian/control" \
+			> "$B_PKG_DIR/debian/control.2" && \
+		mv "$B_PKG_DIR/debian/control.2" \
+			"$B_PKG_DIR/debian/control" && \
+		chmod u+x "$B_PKG_DIR/debian/control"
+	fi
+	} >& "$LOG.$STAGE"
+	stage_end $?
+}
+
+STAGE_NAME="Building kernel-image packages"
+stage_begin "$STAGE_NAME" || {
+	(
+		cd $B_PKG_DIR && \
+		time dpkg-buildpackage -rfakeroot -us -uc
+	) >& "$LOG.$STAGE"
+	stage_end $?
+}
+BUILD_STAGE=$STAGE
+
+STAGE_NAME="Examining kernel-image symbols"
+stage_begin "$STAGE_NAME" || {
+	(
+		LOOP_STATUS=0
+		echo "=== Modprobe Symbol Report ==="
+		fgrep "needs unknown symbol" $LOG.$BUILD_STAGE && \
+			LOOP_STATUS=1
+		echo "=== System.map Symbol Report ==="
+		OLD="$B_DST_DIR/old"
+		rm -rf "$OLD"
+		mkdir -p "$OLD"
+		cd "$OLD"
+		apt-get -q source "kernel-image-$VERSION-$KERNEL_ARCH"
+		# Using apt-get here does not work because it only
+		# prints out URLs of files that need to be downloaded,
+		# so if they are in the apt cache somewhere they
+		# won't show up
+		#awk '/^Package: kernel-headers/ {print $2}' < \
+		#	kernel-image-2.4.27-i386-2.4.27/debian/control | \
+		#	xargs apt-get --reinstall -qq --print-uris install | \
+		#	awk -F\' '{print $2}' | \
+		#	xargs wget -nv
+		export URL="http://debian.local.valinux.co.jp/debian/"
+		awk '/^Package: kernel-headers/ {print $2}' < \
+			kernel-image-$VERSION-$KERNEL_ARCH-$VERSION/debian/control | \
+			xargs apt-cache show |\
+			awk '/^Filename: / {print ENVIRON["URL"]$2}' | \
+			xargs wget -nv
+		cd $B_PKG_DIR
+		DEB_VERSION=$(( cd "$B_PKG_DIR" && dpkg-parsechangelog; ) | \
+			awk '/^Version: / { print $$2 }') && \
+		SONAME=$(sed -ne "s/Package: kernel-headers-$VERSION-\([0-9]\) *$/\1/ p" debian/control)
+		for f in $(find config -maxdepth 1 -type f ! -name default -printf '%f\n'); do
+			echo "\"$f\""
+			kernel_symbol_check \
+				"$OLD/kernel-headers-$VERSION-"[0-9]"-${f}_$VERSION-"*"_$KERNEL_ARCH.deb" \
+				"$B_DST_DIR/kernel-headers-$VERSION-$SONAME-${f}_${DEB_VERSION}_$KERNEL_ARCH.deb" \
+				|| LOOP_STATUS=1
+		done
+		[ "$LOOP_STATUS" = "0" ]
+	) >& "$LOG.$STAGE"
+	stage_end $?
+}
+
+STAGE_STATUS="ok"
+exit


Property changes on: trunk/scripts/test_kernel_build
___________________________________________________________________
Name: svn:executable
   + *