Move the number of cpus logic to somewhere more logical.
[oota-llvm.git] / utils / release / test-release.sh
1 #!/bin/bash
2 #===-- test-release.sh - Test the LLVM release candidates ------------------===#
3 #
4 #                     The LLVM Compiler Infrastructure
5 #
6 # This file is distributed under the University of Illinois Open Source
7 # License.
8 #
9 #===------------------------------------------------------------------------===#
10 #
11 # Download, build, and test the release candidate for an LLVM release.
12 #
13 #===------------------------------------------------------------------------===#
14
15 set -e
16
17 Release=""
18 Release_no_dot=""
19 RC=""
20 do_checkout="yes"
21 do_ada="no"
22 do_fortran="yes"
23 do_64bit="yes"
24 BuildDir="`pwd`"
25
26 function usage() {
27     echo "usage: `basename $0` -release X.Y -rc NUM [OPTIONS]"
28     echo ""
29     echo " -release X.Y      The release number to test."
30     echo " -rc NUM           The pre-release candidate number."
31     echo " -j NUM            Number of compile jobs to run. [default: 3]"
32     echo " -build-dir DIR    Directory to perform testing in. [default: pwd]"
33     echo " -no-checkout      Don't checkout the sources from SVN."
34     echo " -no-64bit         Don't test the 64-bit version. [default: yes]"
35     echo " -ada              Build Ada. [default: no]"
36     echo " -disable-fortran  Disable Fortran build. [default: build]"
37 }
38
39 while [ $# -gt 0 ]; do
40     case $1 in
41         -release | --release )
42             shift
43             Release="$1"
44             Release_no_dot="`echo $1 | sed -e 's,\.,,'`"
45             ;;
46         -rc | --rc | -RC | --RC )
47             shift
48             RC=$1
49             ;;
50         -j* )
51             NumJobs="`echo $1 | sed -e 's,-j\([0-9]*\),\1,g'`"
52             if [ -z "$NumJobs" ]; then
53                 shift
54                 NumJobs="$1"
55             fi
56             ;;
57         -build-dir | --build-dir | -builddir | --builddir )
58             shift
59             BuildDir="$1"
60             ;;
61         -no-checkout | --no-checkout )
62             do_checkout="no"
63             ;;
64         -no-64bit | --no-64bit )
65             do_64bit="no"
66             ;;
67         -ada | --ada )
68             do_ada="yes"
69             ;;
70         -disable-fortran | --disable-fortran )
71             echo "WARNING: Do you *really* need to disable Fortran?"
72             sleep 5
73             do_fortran="no"
74             ;;
75         -help | --help | -h | --h | -\? )
76             usage
77             exit 0
78             ;;
79         * )
80             echo "unknown option: $1"
81             usage
82             exit 1
83             ;;
84     esac
85     shift
86 done
87
88 # Check required arguments.
89 if [ -z "$Release" ]; then
90     echo "No release number specified!"
91     exit 1
92 fi
93 if [ -z "$RC" ]; then
94     echo "No release candidate number specified!"
95     exit 1
96 fi
97
98 # Figure out how many make processes to run.
99 if [ -z "$NumJobs" ]; then
100     NumJobs=`sysctl -n hw.activecpu 2> /dev/null || true`
101 fi
102 if [ -z "$NumJobs" ]; then
103     NumJobs=`sysctl -n hw.ncpu 2> /dev/null || true`
104 fi
105 if [ -z "$NumJobs" ]; then
106     NumJobs=`grep -c processor /proc/cpuinfo 2> /dev/null || true`
107 fi
108 if [ -z "$NumJobs" ]; then
109     NumJobs=3
110 fi
111
112 # Location of sources.
113 llvmCore_srcdir=$BuildDir/llvmCore-$Release-rc$RC.src
114 llvmgcc42_srcdir=$BuildDir/llvmgcc42-$Release-rc$RC.src
115
116 # Location of log files.
117 LogDirName="$Release-rc$RC.logs"
118 LogDir=$BuildDir/$LogDirName
119 mkdir -p $LogDir
120
121 # SVN URLs for the sources.
122 Base_url="http://llvm.org/svn/llvm-project"
123 llvmCore_RC_url="$Base_url/llvm/tags/RELEASE_$Release_no_dot/rc$RC"
124 llvmgcc42_RC_url="$Base_url/llvm-gcc-4.2/tags/RELEASE_$Release_no_dot/rc$RC"
125 clang_RC_url="$Base_url/cfe/tags/RELEASE_$Release_no_dot/rc$RC"
126 test_suite_RC_url="$Base_url/test-suite/tags/RELEASE_$Release_no_dot/rc$RC"
127
128 # Make sure that the URLs are valid.
129 function check_valid_urls() {
130     echo "# Validating SVN URLs"
131     if ! svn ls $llvmCore_RC_url > /dev/null 2>&1 ; then
132         echo "llvm $Release release candidate $RC doesn't exist!"
133         exit 1
134     fi
135     if ! svn ls $llvmgcc42_RC_url > /dev/null 2>&1 ; then
136         echo "llvm-gcc-4.2 $Release release candidate $RC doesn't exist!"
137         exit 1
138     fi
139     if ! svn ls $clang_RC_url > /dev/null 2>&1 ; then
140         echo "clang $Release release candidate $RC doesn't exist!"
141         exit 1
142     fi
143     if ! svn ls $test_suite_RC_url > /dev/null 2>&1 ; then
144         echo "test-suite $Release release candidate $RC doesn't exist!"
145         exit 1
146     fi
147 }
148
149 # Export sources to the the build directory.
150 function export_sources() {
151     check_valid_urls
152
153     echo "# Exporting llvm $Release-RC$RC sources"
154     svn export -q $llvmCore_RC_url $llvmCore_srcdir
155     echo "# Exporting llvm-gcc-4.2 $Release-rc$RC  sources"
156     svn export -q $llvmgcc42_RC_url $llvmgcc42_srcdir
157     echo "# Exporting clang $Release-rc$RC sources"
158     svn export -q $clang_RC_url $llvmCore_srcdir/tools/clang
159     echo "# Exporting llvm test suite $Release-rc$RC sources"
160     svn export -q $test_suite_RC_url $llvmCore_srcdir/projects/llvm-test
161 }
162
163 function configure_llvmCore() {
164     Phase="$1"
165     Flavor="$2"
166     ObjDir="$3"
167     InstallDir="$4"
168     llvmgccDir="$5"
169
170     case $Flavor in
171         Release | Release-64 )
172             Optimized="yes"
173             Assertions="yes"
174             ;;
175         Release-Asserts )
176             Optimized="yes"
177             Assertions="no"
178             ;;
179         Debug )
180             Optimized="no"
181             Assertions="yes"
182             ;;
183         * )
184             echo "# Invalid flavor $Flavor!"
185             echo ""
186             return
187             ;;
188     esac
189
190     cd $ObjDir
191     echo "# Configuring llvm $Release-rc$RC $Flavor"
192     echo "# $llvmCore_srcdir/configure --prefix=$llvmCore_installdir \
193         --enable-optimized=$Optimized \
194         --enable-assertions=$Assertions \
195         --with-llvmgccdir=$llvmgccDir"
196     $llvmCore_srcdir/configure --prefix=$InstallDir \
197         --enable-optimized=$Optimized \
198         --enable-assertions=$Assertions \
199         --with-llvmgccdir=$llvmgccDir \
200         > $LogDir/llvm.configure.$Release-rc$RC-Phase$Phase-$Flavor.log 2>&1
201     cd -
202 }
203
204 function build_llvmCore() {
205     Phase="$1"
206     Flavor="$2"
207     ObjDir="$3"
208     ExtraOpts=""
209
210     CompilerFlags=""
211     if [ "$Phase" = "2" ]; then
212         CompilerFlags="CC=$llvmgccDir/bin/llvm-gcc CXX=$llvmgccDir/bin/llvm-g++"
213     fi
214     if [ "$Flavor" = "Release-64" ]; then
215         ExtraOpts="EXTRA_OPTIONS=-m64"
216     fi
217
218     cd $ObjDir
219     echo "# Compiling llvm $Release-rc$RC $Flavor"
220     echo "# make -j $NumJobs VERBOSE=1 $ExtraOpts"
221     make -j $NumJobs VERBOSE=1 $ExtraOpts $CompilerFlags \
222         > $LogDir/llvm.make.$Release-rc$RC-Phase$Phase-$Flavor.log 2>&1
223
224     echo "# Installing llvm $Release-rc$RC $Flavor"
225     echo "# make install"
226     make install \
227         > $LogDir/llvm.install.$Release-rc$RC-Phase$Phase-$Flavor.log 2>&1
228     cd -
229 }
230
231 function test_llvmCore() {
232     Phase="$1"
233     Flavor="$2"
234     ObjDir="$3"
235
236     cd $ObjDir
237     make check \
238         > $LogDir/llvm.check.$Release-rc$RC-Phase$Phase-$Flavor.log 2>&1
239     make -C tools/clang test \
240         > $LogDir/clang.check.$Release-rc$RC-Phase$Phase-$Flavor.log 2>&1
241     make unittests \
242         > $LogDir/llvm.unittests.$Release-rc$RC-Phase$Phase-$Flavor.log 2>&1
243     cd -
244 }
245
246 function configure_llvm_gcc() {
247     Phase="$1"
248     Flavor="$2"
249     ObjDir="$3"
250     InstallDir="$4"
251     llvmObjDir="$5"
252
253     languages="c,c++,objc,obj-c++"
254     if [ "$do_fortran" = "yes" ]; then
255         languages="$languages,fortran"
256     fi
257     if [ "$do_ada" = "yes" ]; then
258         languages="$languages,ada"
259     fi
260
261     cd $ObjDir
262     echo "# Configuring llvm-gcc $Release-rc$RC $Flavor"
263     echo "# $llvmgcc42_srcdir/configure --prefix=$InstallDir \
264         --program-prefix=llvm- --enable-llvm=$llvmObjDir \
265         --enable-languages=$languages \
266         --with-gxx-include-dir=/usr/include/c++/4.2.1"
267     $llvmgcc42_srcdir/configure --prefix=$InstallDir \
268         --program-prefix=llvm- --enable-llvm=$llvmObjDir \
269         --enable-languages=$languages \
270         --with-gxx-include-dir=/usr/include/c++/4.2.1 \
271         > $LogDir/llvm-gcc.configure.$Release-rc$RC-Phase$Phase-$Flavor.log 2>&1
272     cd -
273 }
274
275 function build_llvm_gcc() {
276     Phase="$1"
277     Flavor="$2"
278     ObjDir="$3"
279     llvmgccDir="$4"
280
281     CompilerFlags=""
282     if [ "$Phase" = "2" ]; then
283         CompilerFlags="CC=$llvmgccDir/bin/llvm-gcc CXX=$llvmgccDir/bin/llvm-g++"
284     fi
285
286     cd $ObjDir
287     echo "# Compiling llvm-gcc $Release-rc$RC $Flavor"
288     echo "# make -j $NumJobs bootstrap LLVM_VERSION_INFO=$Release"
289     make -j $NumJobs bootstrap LLVM_VERSION_INFO=$Release $CompilerFlags \
290         > $LogDir/llvm-gcc.make.$Release-rc$RC-Phase$Phase-$Flavor.log 2>&1
291
292     echo "# Installing llvm-gcc $Release-rc$RC $Flavor"
293     echo "# make install"
294     make install \
295         > $LogDir/llvm-gcc.install.$Release-rc$RC-Phase$Phase-$Flavor.log 2>&1
296     cd -
297 }
298
299 if [ "$do_checkout" = "yes" ]; then
300     export_sources
301 fi
302
303 (
304 Flavors="Debug Release Release-Asserts"
305 if [ "$do_64bit" = "yes" ]; then
306     Flavors="$Flavors Release-64"
307 fi
308
309 for Flavor in $Flavors ; do
310     echo ""
311     echo ""
312     echo "********************************************************************************"
313     echo "  Release:     $Release-rc$RC"
314     echo "  Build:       $Flavor"
315     echo "  System Info: "
316     echo "    `uname -a`"
317     echo "********************************************************************************"
318     echo ""
319
320     llvmCore_phase1_objdir=$BuildDir/Phase1/$Flavor/llvmCore-$Release-rc$RC.obj
321     llvmCore_phase1_installdir=$BuildDir/Phase1/$Flavor/llvmCore-$Release-rc$RC.install
322
323     llvmCore_phase2_objdir=$BuildDir/Phase2/$Flavor/llvmCore-$Release-rc$RC.obj
324     llvmCore_phase2_installdir=$BuildDir/Phase2/$Flavor/llvmCore-$Release-rc$RC.install
325
326     rm -rf $llvmCore_phase1_objdir
327     rm -rf $llvmCore_phase1_installdir
328     rm -rf $llvmCore_phase2_objdir
329     rm -rf $llvmCore_phase2_installdir
330
331     mkdir -p $llvmCore_phase1_objdir
332     mkdir -p $llvmCore_phase1_installdir
333     mkdir -p $llvmCore_phase2_objdir
334     mkdir -p $llvmCore_phase2_installdir
335
336     llvmgcc42_phase1_objdir=$BuildDir/Phase1/$Flavor/llvmgcc42-$Release-rc$RC.obj
337     llvmgcc42_phase1_installdir=$BuildDir/Phase1/$Flavor/llvmgcc42-$Release-rc$RC.install
338
339     llvmgcc42_phase2_objdir=$BuildDir/Phase2/$Flavor/llvmgcc42-$Release-rc$RC.obj
340     llvmgcc42_phase2_installdir=$BuildDir/Phase2/$Flavor/llvmgcc42-$Release-rc$RC.install
341
342     rm -rf $llvmgcc42_phase1_objdir
343     rm -rf $llvmgcc42_phase1_installdir
344     rm -rf $llvmgcc42_phase2_objdir
345     rm -rf $llvmgcc42_phase2_installdir
346
347     mkdir -p $llvmgcc42_phase1_objdir
348     mkdir -p $llvmgcc42_phase1_installdir
349     mkdir -p $llvmgcc42_phase2_objdir
350     mkdir -p $llvmgcc42_phase2_installdir
351
352     ############################################################################
353     # Phase 1: Build llvmCore and llvmgcc42
354     echo "# Phase 1: Building llvmCore"
355     configure_llvmCore 1 $Flavor \
356         $llvmCore_phase1_objdir $llvmCore_phase1_installdir \
357         $llvmgcc42_phase1_installdir
358     build_llvmCore 1 $Flavor \
359         $llvmCore_phase1_objdir
360
361     echo "# Phase 1: Building llvmgcc42"
362     configure_llvm_gcc 1 $Flavor \
363         $llvmgcc42_phase1_objdir $llvmgcc42_phase1_installdir \
364         $llvmCore_phase1_objdir
365     build_llvm_gcc 1 $Flavor \
366         $llvmgcc42_phase1_objdir $llvmgcc42_phase1_installdir
367
368     ############################################################################
369     # Phase 2: Build llvmCore with newly built llvmgcc42 from phase 1.
370     echo "# Phase 2: Building llvmCore"
371     configure_llvmCore 2 $Flavor \
372         $llvmCore_phase2_objdir $llvmCore_phase2_installdir \
373         $llvmgcc42_phase1_installdir
374     build_llvmCore 2 $Flavor \
375         $llvmCore_phase2_objdir
376
377     echo "# Phase 2: Building llvmgcc42"
378     configure_llvm_gcc 2 $Flavor \
379         $llvmgcc42_phase2_objdir $llvmgcc42_phase2_installdir \
380         $llvmCore_phase2_objdir
381     build_llvm_gcc 2 $Flavor \
382         $llvmgcc42_phase2_objdir $llvmgcc42_phase1_installdir
383
384     echo "# Testing - built with llvmgcc42"
385     test_llvmCore 2 $Flavor $llvmCore_phase2_objdir
386 done
387 ) 2>&1 | tee $LogDir/testing.$Release-rc$RC.log
388
389 # Woo hoo!
390 echo "### Testing Finished ###"
391 echo "### Logs: $LogDir"
392 exit 0