- script to install a build environment chroot from scratch, or to
[build.git] / mkbuild
1 #!/bin/bash
2 #
3 # Builds a Fedora Core 4 build environment suitable for rebuilding all
4 # PlanetLab software, including MyPLC. Requires access to Fedora Core
5 # 4 base, updates, and extras repositories.
6 #
7 # Mark Huang <mlhuang@cs.princeton.edu>
8 # Copyright (C) 2006 The Trustees of Princeton University
9 #
10 # $Id$
11 #
12
13 export PATH=/sbin:/bin:/usr/sbin:/usr/bin
14
15 # Verbosity
16 verbose=0
17
18 # Default yum repositories to try
19 mirror=
20
21 # Yum groups to install
22 grouplist=(
23 "Development Tools"
24 "Development Libraries"
25 # In particular, compat-gcc-32 for kernel-2.6.12 builds
26 "Legacy Software Development"
27 )
28
29 # Packages to install
30 packagelist=(
31 # kernel
32 gnupg
33 diffutils
34 # util-vserver
35 vconfig
36 iptables
37 wget
38 beecrypt-devel
39 tetex-latex
40 gcc-c++
41 # ulogd
42 libpcap
43 # iptables
44 linuxdoc-tools
45 # vserver-reference
46 sudo
47 yum
48 createrepo
49 # mysql
50 gperf
51 time
52 # bootmanager
53 sharutils
54 # bootcd
55 nasm
56 mkisofs
57 dosfstools
58 # myplc
59 rsync
60 )
61
62 # Tag to export
63 tag=HEAD
64
65 usage()
66 {
67     echo "Usage: mkbuild [OPTION]... [basedir]"
68     echo "      -l url          Fedora mirror location"
69     echo "      -r release      Fedora release number"
70     echo "      -a arch         Fedora architecture"
71     echo "      -g group1 -g group2 ..."
72     echo "                      Yumgroups to install. Defaults:"
73     for group in "${grouplist[@]}" ; do
74         echo "                  $group"
75     done
76     echo "      -p package1 -p package2 ..."
77     echo "                      Additional packages to install. Defaults:"
78     for package in "${packagelist[@]}" ; do
79         echo "                  $package"
80     done
81     echo "      -t tag          CVS tag of PlanetLab sources to export (default: $tag)"
82     echo "      -v              Be verbose"
83     echo "      -h              This message"
84     exit 1
85 }
86
87 # Get options
88 while getopts "kl:g:p:t:vh" opt ; do
89     case $opt in
90         l)
91             mirror=$OPTARG
92             ;;
93         g)
94             grouplist[${#grouplist[*]}]="$OPTARG"
95             ;;
96         p)
97             packagelist[${#packagelist[*]}]="$OPTARG"
98             ;;
99         t)
100             tag=$OPTARG
101             ;;
102         v)
103             verbose=1
104             set -x
105             ;;
106         h|*)
107             usage
108             ;;
109     esac
110 done
111
112 shift $(($OPTIND - 1))
113 if [ -n "$1" ] ; then
114     # Install in chroot
115     mkdir -p "$1"
116     vroot=$(cd "$1" && pwd -P)
117 else
118     # Install for real
119     vroot=
120 fi
121
122 if [ $UID -ne 0 ] ; then
123     echo "Error: You must run this script as root."
124     exit 1
125 fi
126
127 exec 3>&1
128 exec 4>&2
129 if [ -z "$verbose" ] ; then
130     exec 1>/dev/null
131     exec 2>/dev/null
132 fi
133
134 # Do not tolerate errors
135 set -e
136
137 if [ -n "$vroot" ] ; then
138     # Install in chroot
139     if [ $verbose -ne 0 ] ; then
140         options="$options -v"
141     fi
142     if [ -n "$mirror" ] ; then
143         options="$options -l \"$mirror\""
144     fi
145     for group in "${grouplist[@]}" ; do
146         options="$options -g \"$group\""
147     done
148     for package in "${packagelist[@]}" ; do
149         options="$options -p \"$package\""
150     done
151
152     eval ./mkfedora $options $vroot
153 else
154     # Install for real
155     echo "* Installing optional packages" >&3
156     yum -y install "${packagelist[@]}"
157
158     echo "* Installing optional groups" >&3
159     yum -y groupinstall "${grouplist[@]}"
160 fi
161
162 # If a preferred mirror was specified, configure mkfedora to use it
163 if [ -n "$mirror" ] ; then
164     mkdir -p $vroot/etc/planetlab
165     echo "mirrors=($mirror)" >$vroot/etc/planetlab/mkfedora.conf
166 fi
167
168 # Install local CVS repository.
169 echo "* Exporting source code to /cvs" >&3
170 mkdir -p $vroot/cvs
171 export CVSROOT=$vroot/cvs
172 cvs -d $CVSROOT init
173
174 tmp=$(mktemp -d /tmp/cvs.XXXXXX)
175 trap "rm -rf $tmp" ERR
176 pushd $tmp
177
178 # Export source code from cvs.planet-lab.org to /tmp
179 if [ "$tag" = "HEAD" ] ; then
180         date=$(date +%Y-%m-%d)
181         cvs_export="cvs -d :pserver:anon@cvs.planet-lab.org:/cvs export -D $date planetlab"
182         tag=planetlab-$date
183 else
184         cvs_export="cvs -d :pserver:anon@cvs.planet-lab.org:/cvs export -r $tag planetlab"
185 fi
186 $cvs_export
187
188 # Import into /cvs/tmp
189 for dir in * ; do
190     pushd $dir
191     cvs -d $CVSROOT import -m "$cvs_export" -ko -I ! $dir planetlab $tag
192     popd
193 done
194
195 popd
196 rm -rf $tmp
197
198 exit 0