Fix relocation selection for foo-. on mips.
[oota-llvm.git] / utils / release / test-release.sh
1 #!/usr/bin/env 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 if [ `uname -s` = "FreeBSD" ]; then
16     MAKE=gmake
17 else
18     MAKE=make
19 fi
20
21 projects="llvm cfe compiler-rt libcxx libcxxabi test-suite clang-tools-extra"
22
23 # Base SVN URL for the sources.
24 Base_url="http://llvm.org/svn/llvm-project"
25
26 Release=""
27 Release_no_dot=""
28 RC=""
29 Triple=""
30 use_gzip="no"
31 do_checkout="yes"
32 do_clang="yes"
33 do_64bit="yes"
34 do_debug="no"
35 do_asserts="no"
36 do_compare="yes"
37 BuildDir="`pwd`"
38 BuildTriple=""
39
40 function usage() {
41     echo "usage: `basename $0` -release X.Y -rc NUM [OPTIONS]"
42     echo ""
43     echo " -release X.Y         The release number to test."
44     echo " -rc NUM              The pre-release candidate number."
45     echo " -final               The final release candidate."
46     echo " -triple TRIPLE       The target triple for this machine."
47     echo " -j NUM               Number of compile jobs to run. [default: 3]"
48     echo " -build-dir DIR       Directory to perform testing in. [default: pwd]"
49     echo " -no-checkout         Don't checkout the sources from SVN."
50     echo " -no-64bit            Don't test the 64-bit version. [default: yes]"
51     echo " -enable-ada          Build Ada. [default: disable]"
52     echo " -disable-clang       Do not test clang. [default: enable]"
53     echo " -enable-fortran      Enable Fortran build. [default: disable]"
54     echo " -disable-objc        Disable ObjC build. [default: enable]"
55     echo " -test-debug          Test the debug build. [default: no]"
56     echo " -test-asserts        Test with asserts on. [default: no]"
57     echo " -no-compare-files    Don't test that phase 2 and 3 files are identical."
58     echo " -use-gzip            Use gzip instead of xz."
59     echo " -build-triple TRIPLE The build triple for this machine"
60     echo "                      [default: use config.guess]"
61 }
62
63 while [ $# -gt 0 ]; do
64     case $1 in
65         -release | --release )
66             shift
67             Release="$1"
68             Release_no_dot="`echo $1 | sed -e 's,\.,,g'`"
69             ;;
70         -rc | --rc | -RC | --RC )
71             shift
72             RC="rc$1"
73             ;;
74         -final | --final )
75             RC=final
76             ;;
77         -triple | --triple )
78             shift
79             Triple="$1"
80             ;;
81         -build-triple | --build-triple )
82             shift
83             BuildTriple="$1"
84             ;;
85         -j* )
86             NumJobs="`echo $1 | sed -e 's,-j\([0-9]*\),\1,g'`"
87             if [ -z "$NumJobs" ]; then
88                 shift
89                 NumJobs="$1"
90             fi
91             ;;
92         -build-dir | --build-dir | -builddir | --builddir )
93             shift
94             BuildDir="$1"
95             ;;
96         -no-checkout | --no-checkout )
97             do_checkout="no"
98             ;;
99         -no-64bit | --no-64bit )
100             do_64bit="no"
101             ;;
102         -disable-clang | --disable-clang )
103             do_clang="no"
104             ;;
105         -test-debug | --test-debug )
106             do_debug="yes"
107             ;;
108         -test-asserts | --test-asserts )
109             do_asserts="yes"
110             ;;
111         -no-compare-files | --no-compare-files )
112             do_compare="no"
113             ;;
114         -use-gzip | --use-gzip )
115             use_gzip="yes"
116             ;;
117         -help | --help | -h | --h | -\? )
118             usage
119             exit 0
120             ;;
121         * )
122             echo "unknown option: $1"
123             usage
124             exit 1
125             ;;
126     esac
127     shift
128 done
129
130 # Check required arguments.
131 if [ -z "$Release" ]; then
132     echo "error: no release number specified"
133     exit 1
134 fi
135 if [ -z "$RC" ]; then
136     echo "error: no release candidate number specified"
137     exit 1
138 fi
139 if [ -z "$Triple" ]; then
140     echo "error: no target triple specified"
141     exit 1
142 fi
143
144 # Figure out how many make processes to run.
145 if [ -z "$NumJobs" ]; then
146     NumJobs=`sysctl -n hw.activecpu 2> /dev/null || true`
147 fi
148 if [ -z "$NumJobs" ]; then
149     NumJobs=`sysctl -n hw.ncpu 2> /dev/null || true`
150 fi
151 if [ -z "$NumJobs" ]; then
152     NumJobs=`grep -c processor /proc/cpuinfo 2> /dev/null || true`
153 fi
154 if [ -z "$NumJobs" ]; then
155     NumJobs=3
156 fi
157
158 # Go to the build directory (may be different from CWD)
159 BuildDir=$BuildDir/$RC
160 mkdir -p $BuildDir
161 cd $BuildDir
162
163 # Location of log files.
164 LogDir=$BuildDir/logs
165 mkdir -p $LogDir
166
167 # Final package name.
168 Package=clang+llvm-$Release
169 if [ $RC != "final" ]; then
170   Package=$Package-$RC
171 fi
172 Package=$Package-$Triple
173
174 # Make sure that a required program is available
175 function check_program_exists() {
176   local program="$1"
177   if ! type -P $program > /dev/null 2>&1 ; then
178     echo "program '$1' not found !"
179     exit 1
180   fi
181 }
182
183 if [ `uname -s` != "Darwin" ]; then
184   check_program_exists 'chrpath'
185   check_program_exists 'file'
186   check_program_exists 'objdump'
187 fi
188
189 # Make sure that the URLs are valid.
190 function check_valid_urls() {
191     for proj in $projects ; do
192         echo "# Validating $proj SVN URL"
193
194         if ! svn ls $Base_url/$proj/tags/RELEASE_$Release_no_dot/$RC > /dev/null 2>&1 ; then
195             echo "$proj $Release release candidate $RC doesn't exist!"
196             exit 1
197         fi
198     done
199 }
200
201 # Export sources to the build directory.
202 function export_sources() {
203     check_valid_urls
204
205     for proj in $projects ; do
206         echo "# Exporting $proj $Release-$RC sources"
207         if ! svn export -q $Base_url/$proj/tags/RELEASE_$Release_no_dot/$RC $proj.src ; then
208             echo "error: failed to export $proj project"
209             exit 1
210         fi
211     done
212
213     echo "# Creating symlinks"
214     cd $BuildDir/llvm.src/tools
215     if [ ! -h clang ]; then
216         ln -s ../../cfe.src clang
217     fi
218     cd $BuildDir/llvm.src/tools/clang/tools
219     if [ ! -h clang-tools-extra ]; then
220         ln -s ../../../../clang-tools-extra.src extra
221     fi
222     cd $BuildDir/llvm.src/projects
223     if [ ! -h test-suite ]; then
224         ln -s ../../test-suite.src test-suite
225     fi
226     if [ ! -h compiler-rt ]; then
227         ln -s ../../compiler-rt.src compiler-rt
228     fi
229     if [ ! -h libcxx ]; then
230         ln -s ../../libcxx.src libcxx
231     fi
232     if [ ! -h libcxxabi ]; then
233         ln -s ../../libcxxabi.src libcxxabi
234     fi
235     cd $BuildDir
236 }
237
238 function configure_llvmCore() {
239     Phase="$1"
240     Flavor="$2"
241     ObjDir="$3"
242     InstallDir="$4"
243
244     case $Flavor in
245         Release | Release-64 )
246             Optimized="yes"
247             Assertions="no"
248             ;;
249         Release+Asserts )
250             Optimized="yes"
251             Assertions="yes"
252             ;;
253         Debug )
254             Optimized="no"
255             Assertions="yes"
256             ;;
257         * )
258             echo "# Invalid flavor '$Flavor'"
259             echo ""
260             return
261             ;;
262     esac
263
264     echo "# Using C compiler: $c_compiler"
265     echo "# Using C++ compiler: $cxx_compiler"
266
267     build_triple_option="${BuildTriple:+--build=$BuildTriple}"
268
269     cd $ObjDir
270     echo "# Configuring llvm $Release-$RC $Flavor"
271     echo "# $BuildDir/llvm.src/configure --prefix=$InstallDir \
272         --enable-optimized=$Optimized \
273         --enable-assertions=$Assertions \
274         --disable-timestamps \
275         $build_triple_option"
276     env CC="$c_compiler" CXX="$cxx_compiler" \
277     $BuildDir/llvm.src/configure --prefix=$InstallDir \
278         --enable-optimized=$Optimized \
279         --enable-assertions=$Assertions \
280         --disable-timestamps \
281         $build_triple_option \
282         2>&1 | tee $LogDir/llvm.configure-Phase$Phase-$Flavor.log
283     cd $BuildDir
284 }
285
286 function build_llvmCore() {
287     Phase="$1"
288     Flavor="$2"
289     ObjDir="$3"
290     ExtraOpts=""
291
292     if [ "$Flavor" = "Release-64" ]; then
293         ExtraOpts="EXTRA_OPTIONS=-m64"
294     fi
295
296     cd $ObjDir
297     echo "# Compiling llvm $Release-$RC $Flavor"
298     echo "# ${MAKE} -j $NumJobs VERBOSE=1 $ExtraOpts"
299     ${MAKE} -j $NumJobs VERBOSE=1 $ExtraOpts \
300         2>&1 | tee $LogDir/llvm.make-Phase$Phase-$Flavor.log
301
302     echo "# Installing llvm $Release-$RC $Flavor"
303     echo "# ${MAKE} install"
304     ${MAKE} install \
305         2>&1 | tee $LogDir/llvm.install-Phase$Phase-$Flavor.log
306     cd $BuildDir
307 }
308
309 function test_llvmCore() {
310     Phase="$1"
311     Flavor="$2"
312     ObjDir="$3"
313
314     cd $ObjDir
315     ${MAKE} -k check-all \
316         2>&1 | tee $LogDir/llvm.check-Phase$Phase-$Flavor.log
317     ${MAKE} -k unittests \
318         2>&1 | tee $LogDir/llvm.unittests-Phase$Phase-$Flavor.log
319     cd $BuildDir
320 }
321
322 # Clean RPATH. Libtool adds the build directory to the search path, which is
323 # not necessary --- and even harmful --- for the binary packages we release.
324 function clean_RPATH() {
325   if [ `uname -s` = "Darwin" ]; then
326     return
327   fi
328   local InstallPath="$1"
329   for Candidate in `find $InstallPath/{bin,lib} -type f`; do
330     if file $Candidate | grep ELF | egrep 'executable|shared object' > /dev/null 2>&1 ; then
331       rpath=`objdump -x $Candidate | grep 'RPATH' | sed -e's/^ *RPATH *//'`
332       if [ -n "$rpath" ]; then
333         newrpath=`echo $rpath | sed -e's/.*\(\$ORIGIN[^:]*\).*/\1/'`
334         chrpath -r $newrpath $Candidate 2>&1 > /dev/null 2>&1
335       fi
336     fi
337   done
338 }
339
340 # Create a package of the release binaries.
341 function package_release() {
342     cwd=`pwd`
343     cd $BuildDir/Phase3/Release
344     mv llvmCore-$Release-$RC.install $Package
345     if [ "$use_gzip" = "yes" ]; then
346       tar cfz $BuildDir/$Package.tar.gz $Package
347     else
348       tar cfJ $BuildDir/$Package.tar.xz $Package
349     fi
350     mv $Package llvmCore-$Release-$RC.install
351     cd $cwd
352 }
353
354 set -e                          # Exit if any command fails
355
356 if [ "$do_checkout" = "yes" ]; then
357     export_sources
358 fi
359
360 (
361 Flavors="Release"
362 if [ "$do_debug" = "yes" ]; then
363     Flavors="Debug $Flavors"
364 fi
365 if [ "$do_asserts" = "yes" ]; then
366     Flavors="$Flavors Release+Asserts"
367 fi
368 if [ "$do_64bit" = "yes" ]; then
369     Flavors="$Flavors Release-64"
370 fi
371
372 for Flavor in $Flavors ; do
373     echo ""
374     echo ""
375     echo "********************************************************************************"
376     echo "  Release:     $Release-$RC"
377     echo "  Build:       $Flavor"
378     echo "  System Info: "
379     echo "    `uname -a`"
380     echo "********************************************************************************"
381     echo ""
382
383     c_compiler="$CC"
384     cxx_compiler="$CXX"
385
386     llvmCore_phase1_objdir=$BuildDir/Phase1/$Flavor/llvmCore-$Release-$RC.obj
387     llvmCore_phase1_installdir=$BuildDir/Phase1/$Flavor/llvmCore-$Release-$RC.install
388
389     llvmCore_phase2_objdir=$BuildDir/Phase2/$Flavor/llvmCore-$Release-$RC.obj
390     llvmCore_phase2_installdir=$BuildDir/Phase2/$Flavor/llvmCore-$Release-$RC.install
391     llvmCore_de_phase2_objdir=$BuildDir/Phase2/$Flavor/llvmCore-DragonEgg-$Release-$RC.obj
392     llvmCore_de_phase2_installdir=$BuildDir/Phase2/$Flavor/llvmCore-DragonEgg-$Release-$RC.install
393
394     llvmCore_phase3_objdir=$BuildDir/Phase3/$Flavor/llvmCore-$Release-$RC.obj
395     llvmCore_phase3_installdir=$BuildDir/Phase3/$Flavor/llvmCore-$Release-$RC.install
396     llvmCore_de_phase3_objdir=$BuildDir/Phase3/$Flavor/llvmCore-DragonEgg-$Release-$RC.obj
397     llvmCore_de_phase3_installdir=$BuildDir/Phase3/$Flavor/llvmCore-DragonEgg-$Release-$RC.install
398
399     rm -rf $llvmCore_phase1_objdir
400     rm -rf $llvmCore_phase1_installdir
401
402     rm -rf $llvmCore_phase2_objdir
403     rm -rf $llvmCore_phase2_installdir
404     rm -rf $llvmCore_de_phase2_objdir
405     rm -rf $llvmCore_de_phase2_installdir
406
407     rm -rf $llvmCore_phase3_objdir
408     rm -rf $llvmCore_phase3_installdir
409     rm -rf $llvmCore_de_phase3_objdir
410     rm -rf $llvmCore_de_phase3_installdir
411
412     mkdir -p $llvmCore_phase1_objdir
413     mkdir -p $llvmCore_phase1_installdir
414
415     mkdir -p $llvmCore_phase2_objdir
416     mkdir -p $llvmCore_phase2_installdir
417     mkdir -p $llvmCore_de_phase2_objdir
418     mkdir -p $llvmCore_de_phase2_installdir
419
420     mkdir -p $llvmCore_phase3_objdir
421     mkdir -p $llvmCore_phase3_installdir
422     mkdir -p $llvmCore_de_phase3_objdir
423     mkdir -p $llvmCore_de_phase3_installdir
424
425     ############################################################################
426     # Phase 1: Build llvmCore and clang
427     echo "# Phase 1: Building llvmCore"
428     configure_llvmCore 1 $Flavor \
429         $llvmCore_phase1_objdir $llvmCore_phase1_installdir
430     build_llvmCore 1 $Flavor \
431         $llvmCore_phase1_objdir
432     clean_RPATH $llvmCore_phase1_installdir
433
434     # Test clang
435     if [ "$do_clang" = "yes" ]; then
436         ########################################################################
437         # Phase 2: Build llvmCore with newly built clang from phase 1.
438         c_compiler=$llvmCore_phase1_installdir/bin/clang
439         cxx_compiler=$llvmCore_phase1_installdir/bin/clang++
440         echo "# Phase 2: Building llvmCore"
441         configure_llvmCore 2 $Flavor \
442             $llvmCore_phase2_objdir $llvmCore_phase2_installdir
443         build_llvmCore 2 $Flavor \
444             $llvmCore_phase2_objdir
445         clean_RPATH $llvmCore_phase2_installdir
446
447         ########################################################################
448         # Phase 3: Build llvmCore with newly built clang from phase 2.
449         c_compiler=$llvmCore_phase2_installdir/bin/clang
450         cxx_compiler=$llvmCore_phase2_installdir/bin/clang++
451         echo "# Phase 3: Building llvmCore"
452         configure_llvmCore 3 $Flavor \
453             $llvmCore_phase3_objdir $llvmCore_phase3_installdir
454         build_llvmCore 3 $Flavor \
455             $llvmCore_phase3_objdir
456         clean_RPATH $llvmCore_phase3_installdir
457
458         ########################################################################
459         # Testing: Test phase 3
460         echo "# Testing - built with clang"
461         test_llvmCore 3 $Flavor $llvmCore_phase3_objdir
462
463         ########################################################################
464         # Compare .o files between Phase2 and Phase3 and report which ones
465         # differ.
466         if [ "$do_compare" = "yes" ]; then
467             echo
468             echo "# Comparing Phase 2 and Phase 3 files"
469             for o in `find $llvmCore_phase2_objdir -name '*.o'` ; do
470                 p3=`echo $o | sed -e 's,Phase2,Phase3,'`
471                 if ! cmp --ignore-initial=16 $o $p3 > /dev/null 2>&1 ; then
472                     echo "file `basename $o` differs between phase 2 and phase 3"
473                 fi
474             done
475         fi
476     fi
477
478     # Otherwise just test the core.
479     if [ "$do_clang" != "yes" ]; then
480         echo "# Testing - built with system compiler"
481         test_llvmCore 1 $Flavor $llvmCore_phase1_objdir
482     fi
483 done
484 ) 2>&1 | tee $LogDir/testing.$Release-$RC.log
485
486 package_release
487
488 set +e
489
490 # Woo hoo!
491 echo "### Testing Finished ###"
492 if [ "$use_gzip" = "yes" ]; then
493   echo "### Package: $Package.tar.gz"
494 else
495   echo "### Package: $Package.tar.xz"
496 fi
497 echo "### Logs: $LogDir"
498 exit 0