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
+ *