- define PLDISTRO on the command line
[build.git] / build.sh
1 #!/bin/bash
2 #
3 # PlanetLab release build script. Intended to be used by scripts and
4 # crontabs to build nightly releases (default). Can also be invoked
5 # manually to build a tagged release (-r) in the current directory.
6 #
7 # Mark Huang <mlhuang@cs.princeton.edu>
8 # Copyright (C) 2003-2005 The Trustees of Princeton University
9 #
10 # $Id: build.sh,v 1.31 2005/05/04 21:47:29 mlhuang Exp $
11 #
12
13 # Set defaults
14 CVSROOT=:pserver:anon@cvs.planet-lab.org:/cvs
15 CVS_RSH=ssh
16 MODULE=build
17 TAG=HEAD
18 BASE=$PWD
19 PLDISTRO=planetlab
20
21 # cron does not set USER?
22 [ -z "$USER" ] && export USER=$LOGNAME
23
24 # Export certain variables
25 export CVS_RSH
26
27 # Get options
28 while getopts "d:r:m:f:b:x:h" opt ; do
29     case $opt in
30         d)
31             CVSROOT=$OPTARG
32             ;;
33         r)
34             TAG=$OPTARG
35             ;;
36         m)
37             MAILTO=$OPTARG
38             ;;
39         f)
40             PLDISTRO="$OPTARG"
41             ;;
42         b)
43             BASE=$OPTARG
44             ;;
45         x)
46             BUILDS=$OPTARG
47             ;;
48         h|*)
49             echo "usage: `basename $0` [OPTION]..."
50             echo "      -d directory    CVS repository root (default $CVSROOT)"
51             echo "      -r revision     CVS revision to checkout (default $TAG)"
52             echo "      -m address      Notify recipient of failures (default: none)"
53             echo "      -f distro       Distribution to build (default: $PLDISTRO)"
54             echo "      -b base         Run operations in specified base directory (default $BASE)"
55             echo "      -x N            Remove all but the last N runs from the base directory (default: none)"
56             exit 1
57             ;;
58     esac
59 done
60 shift $(($OPTIND - 1))
61
62 # Base operations in specified directory
63 mkdir -p $BASE
64 cd $BASE || exit $?
65
66 # Remove old runs
67 if [ -n "$BUILDS" ] ; then
68     ls -t | sed -n ${BUILDS}~1p | xargs rm -rf
69 fi
70
71 # Create a unique build base
72 BASE=${TAG/HEAD/`date +%Y.%m.%d`}
73 i=
74 while ! mkdir ${BASE}${i} 2>/dev/null ; do
75     [ -z ${i} ] && BASE=${BASE}.
76     i=$((${i}+1))
77     if [ $i -gt 100 ] ; then
78         echo "$0: Failed to create release directory `pwd`/${BASE}${i}"
79         exit 1
80     fi
81 done
82 BASE=${BASE}${i}
83
84 # Redirect output from here
85 exec 2>&1
86 exec &>${BASE}/log
87
88 # Build
89 cvs -d ${CVSROOT} export -r ${TAG} -d ${BASE} ${MODULE}
90 make PLDISTRO=${PLDISTRO} -C ${BASE} && \
91 make PLDISTRO=${PLDISTRO} -C ${BASE} install BASE=$BASE BUILDS=$BUILDS
92 rc=$?
93
94 if [ $rc -ne 0 ] ; then
95     # Notify recipient of failure
96     if [ -n "$MAILTO" ] ; then
97         tail -100 ${BASE}/log | mail -s "Failures for ${BASE}" $MAILTO
98     fi
99     exit $rc
100 fi
101
102 exit 0