-#!/bin/bash
+#!/usr/bin/env bash
#===-- test-release.sh - Test the LLVM release candidates ------------------===#
#
# The LLVM Compiler Infrastructure
#
#===------------------------------------------------------------------------===#
-set -e # Exit if any command fails
+if [ `uname -s` = "FreeBSD" ]; then
+ MAKE=gmake
+else
+ MAKE=make
+fi
projects="llvm cfe dragonegg test-suite"
RC=""
do_checkout="yes"
do_ada="no"
-do_objc="yes"
+do_clang="yes"
+do_dragonegg="no"
do_fortran="no"
+do_objc="yes"
do_64bit="yes"
do_debug="no"
do_asserts="no"
echo " -no-checkout Don't checkout the sources from SVN."
echo " -no-64bit Don't test the 64-bit version. [default: yes]"
echo " -enable-ada Build Ada. [default: disable]"
+ echo " -disable-clang Do not test clang. [default: enable]"
+ echo " -enable-dragonegg Test dragonegg. [default: disable]"
echo " -enable-fortran Enable Fortran build. [default: disable]"
echo " -disable-objc Disable ObjC build. [default: enable]"
echo " -test-debug Test the debug build. [default: no]"
-enable-ada | --enable-ada )
do_ada="yes"
;;
+ -disable-clang | --disable-clang )
+ do_clang="no"
+ ;;
+ -enable-dragonegg | --enable-dragonegg )
+ do_dragonegg="yes"
+ ;;
-enable-fortran | --enable-fortran )
do_fortran="yes"
;;
LogDir=$BuildDir/logs
mkdir -p $LogDir
-# Find a compilers.
-c_compiler="`which clang`"
-if [ -z "$c_compiler" ]; then
- c_compiler="`which gcc`"
- if [ -z "$c_compiler" ]; then
- c_compiler="`which cc`"
- if [ -z "$c_compiler" ]; then
- echo "error: cannot find a working C compiler"
+# Find compilers.
+if [ "$do_dragonegg" = "yes" ]; then
+ gcc_compiler="$GCC"
+ if [ -z "$gcc_compiler" ]; then
+ gcc_compiler="`which gcc`"
+ if [ -z "$gcc_compiler" ]; then
+ echo "error: cannot find gcc to use with dragonegg"
+ exit 1
fi
fi
-fi
-cxx_compiler="`which clang++`"
-if [ -z "$cxx_compiler" ]; then
- cxx_compiler="`which g++`"
- if [ -z "$cxx_compiler" ]; then
- cxx_compiler="`which c++`"
- if [ -z "$cxx_compiler" ]; then
- echo "error: cannot find a working C++ compiler"
+
+ gxx_compiler="$GXX"
+ if [ -z "$gxx_compiler" ]; then
+ gxx_compiler="`which g++`"
+ if [ -z "$gxx_compiler" ]; then
+ echo "error: cannot find g++ to use with dragonegg"
+ exit 1
fi
fi
fi
+
# Make sure that the URLs are valid.
function check_valid_urls() {
for proj in $projects ; do
echo "# $BuildDir/llvm.src/configure --prefix=$InstallDir \
--enable-optimized=$Optimized \
--enable-assertions=$Assertions"
- env CC=$c_compiler CXX=$cxx_compiler \
+ env CC="$c_compiler" CXX="$cxx_compiler" \
$BuildDir/llvm.src/configure --prefix=$InstallDir \
--enable-optimized=$Optimized \
--enable-assertions=$Assertions \
cd $ObjDir
echo "# Compiling llvm $Release-rc$RC $Flavor"
- echo "# make -j $NumJobs VERBOSE=1 $ExtraOpts"
- make -j $NumJobs VERBOSE=1 $ExtraOpts \
+ echo "# ${MAKE} -j $NumJobs VERBOSE=1 $ExtraOpts"
+ ${MAKE} -j $NumJobs VERBOSE=1 $ExtraOpts \
2>&1 | tee $LogDir/llvm.make-Phase$Phase-$Flavor.log
echo "# Installing llvm $Release-rc$RC $Flavor"
- echo "# make install"
- make install \
+ echo "# ${MAKE} install"
+ ${MAKE} install \
2>&1 | tee $LogDir/llvm.install-Phase$Phase-$Flavor.log
cd $BuildDir
}
+function build_dragonegg() {
+ Phase="$1"
+ Flavor="$2"
+ LLVMInstallDir="$3"
+ DragonEggObjDir="$4"
+ LLVM_CONFIG=$LLVMInstallDir/bin/llvm-config
+ TOP_DIR=$BuildDir/dragonegg.src
+
+ echo "# Targeted compiler: $gcc_compiler"
+
+ cd $DragonEggObjDir
+ echo "# Compiling phase $Phase dragonegg $Release-rc$RC $Flavor"
+ echo -n "# CXX=$cxx_compiler TOP_DIR=$TOP_DIR GCC=$gcc_compiler "
+ echo -n "LLVM_CONFIG=$LLVM_CONFIG ${MAKE} -f $TOP_DIR/Makefile "
+ echo "-j $NumJobs VERBOSE=1"
+ CXX="$cxx_compiler" TOP_DIR="$TOP_DIR" GCC="$gcc_compiler" \
+ LLVM_CONFIG="$LLVM_CONFIG" ${MAKE} -f $TOP_DIR/Makefile \
+ -j $NumJobs VERBOSE=1 \
+ 2>&1 | tee $LogDir/dragonegg-Phase$Phase-$Flavor.log
+ cd $BuildDir
+}
+
function test_llvmCore() {
Phase="$1"
Flavor="$2"
ObjDir="$3"
cd $ObjDir
- make check-all \
+ ${MAKE} -k check-all \
2>&1 | tee $LogDir/llvm.check-Phase$Phase-$Flavor.log
- make unittests \
+ ${MAKE} -k unittests \
2>&1 | tee $LogDir/llvm.unittests-Phase$Phase-$Flavor.log
cd $BuildDir
}
+set -e # Exit if any command fails
+
if [ "$do_checkout" = "yes" ]; then
export_sources
fi
echo "********************************************************************************"
echo ""
+ c_compiler="$CC"
+ cxx_compiler="$CXX"
+
llvmCore_phase1_objdir=$BuildDir/Phase1/$Flavor/llvmCore-$Release-rc$RC.obj
llvmCore_phase1_installdir=$BuildDir/Phase1/$Flavor/llvmCore-$Release-rc$RC.install
+ dragonegg_phase1_objdir=$BuildDir/Phase1/$Flavor/DragonEgg-$Release-rc$RC.obj
llvmCore_phase2_objdir=$BuildDir/Phase2/$Flavor/llvmCore-$Release-rc$RC.obj
llvmCore_phase2_installdir=$BuildDir/Phase2/$Flavor/llvmCore-$Release-rc$RC.install
+ llvmCore_de_phase2_objdir=$BuildDir/Phase2/$Flavor/llvmCore-DragonEgg-$Release-rc$RC.obj
+ llvmCore_de_phase2_installdir=$BuildDir/Phase2/$Flavor/llvmCore-DragonEgg-$Release-rc$RC.install
+ dragonegg_phase2_objdir=$BuildDir/Phase2/$Flavor/DragonEgg-$Release-rc$RC.obj
llvmCore_phase3_objdir=$BuildDir/Phase3/$Flavor/llvmCore-$Release-rc$RC.obj
llvmCore_phase3_installdir=$BuildDir/Phase3/$Flavor/llvmCore-$Release-rc$RC.install
+ llvmCore_de_phase3_objdir=$BuildDir/Phase3/$Flavor/llvmCore-DragonEgg-$Release-rc$RC.obj
+ llvmCore_de_phase3_installdir=$BuildDir/Phase3/$Flavor/llvmCore-DragonEgg-$Release-rc$RC.install
+ dragonegg_phase3_objdir=$BuildDir/Phase3/$Flavor/DragonEgg-$Release-rc$RC.obj
rm -rf $llvmCore_phase1_objdir
rm -rf $llvmCore_phase1_installdir
+ rm -rf $dragonegg_phase1_objdir
+
rm -rf $llvmCore_phase2_objdir
rm -rf $llvmCore_phase2_installdir
+ rm -rf $llvmCore_de_phase2_objdir
+ rm -rf $llvmCore_de_phase2_installdir
+ rm -rf $dragonegg_phase2_objdir
+
rm -rf $llvmCore_phase3_objdir
rm -rf $llvmCore_phase3_installdir
+ rm -rf $llvmCore_de_phase3_objdir
+ rm -rf $llvmCore_de_phase3_installdir
+ rm -rf $dragonegg_phase3_objdir
mkdir -p $llvmCore_phase1_objdir
mkdir -p $llvmCore_phase1_installdir
+ mkdir -p $dragonegg_phase1_objdir
+
mkdir -p $llvmCore_phase2_objdir
mkdir -p $llvmCore_phase2_installdir
+ mkdir -p $llvmCore_de_phase2_objdir
+ mkdir -p $llvmCore_de_phase2_installdir
+ mkdir -p $dragonegg_phase2_objdir
+
mkdir -p $llvmCore_phase3_objdir
mkdir -p $llvmCore_phase3_installdir
+ mkdir -p $llvmCore_de_phase3_objdir
+ mkdir -p $llvmCore_de_phase3_installdir
+ mkdir -p $dragonegg_phase3_objdir
############################################################################
- # Phase 1: Build llvmCore and llvmgcc42
+ # Phase 1: Build llvmCore and clang
echo "# Phase 1: Building llvmCore"
configure_llvmCore 1 $Flavor \
$llvmCore_phase1_objdir $llvmCore_phase1_installdir
build_llvmCore 1 $Flavor \
$llvmCore_phase1_objdir
- ############################################################################
- # Phase 2: Build llvmCore with newly built clang from phase 1.
- c_compiler=$llvmCore_phase1_installdir/bin/clang
- cxx_compiler=$llvmCore_phase1_installdir/bin/clang++
- echo "# Phase 2: Building llvmCore"
- configure_llvmCore 2 $Flavor \
- $llvmCore_phase2_objdir $llvmCore_phase2_installdir
- build_llvmCore 2 $Flavor \
- $llvmCore_phase2_objdir
-
- ############################################################################
- # Phase 3: Build llvmCore with newly built clang from phase 2.
- c_compiler=$llvmCore_phase2_installdir/bin/clang
- cxx_compiler=$llvmCore_phase2_installdir/bin/clang++
- echo "# Phase 3: Building llvmCore"
- configure_llvmCore 3 $Flavor \
- $llvmCore_phase3_objdir $llvmCore_phase3_installdir
- build_llvmCore 3 $Flavor \
- $llvmCore_phase3_objdir
+ # Test clang
+ if [ "$do_clang" = "yes" ]; then
+ ############################################################################
+ # Phase 2: Build llvmCore with newly built clang from phase 1.
+ c_compiler=$llvmCore_phase1_installdir/bin/clang
+ cxx_compiler=$llvmCore_phase1_installdir/bin/clang++
+ echo "# Phase 2: Building llvmCore"
+ configure_llvmCore 2 $Flavor \
+ $llvmCore_phase2_objdir $llvmCore_phase2_installdir
+ build_llvmCore 2 $Flavor \
+ $llvmCore_phase2_objdir
+
+ ############################################################################
+ # Phase 3: Build llvmCore with newly built clang from phase 2.
+ c_compiler=$llvmCore_phase2_installdir/bin/clang
+ cxx_compiler=$llvmCore_phase2_installdir/bin/clang++
+ echo "# Phase 3: Building llvmCore"
+ configure_llvmCore 3 $Flavor \
+ $llvmCore_phase3_objdir $llvmCore_phase3_installdir
+ build_llvmCore 3 $Flavor \
+ $llvmCore_phase3_objdir
+
+ ############################################################################
+ # Testing: Test phase 3
+ echo "# Testing - built with clang"
+ test_llvmCore 3 $Flavor $llvmCore_phase3_objdir
+
+ ############################################################################
+ # Compare .o files between Phase2 and Phase3 and report which ones differ.
+ echo
+ echo "# Comparing Phase 2 and Phase 3 files"
+ for o in `find $llvmCore_phase2_objdir -name '*.o'` ; do
+ p3=`echo $o | sed -e 's,Phase2,Phase3,'`
+ if ! cmp --ignore-initial=16 $o $p3 > /dev/null 2>&1 ; then
+ echo "file `basename $o` differs between phase 2 and phase 3"
+ fi
+ done
+ fi
- ############################################################################
- # Testing: Test phase 3
- echo "# Testing - built with clang"
- test_llvmCore 3 $Flavor $llvmCore_phase3_objdir
+ # Test dragonegg
+ if [ "$do_dragonegg" = "yes" ]; then
+ # Build dragonegg using the targeted gcc. This isn't necessary, but
+ # helps avoid using broken versions of gcc (which are legion), tests
+ # that the targeted gcc is basically sane and is consistent with the
+ # later phases in which the targeted gcc + dragonegg are used.
+ c_compiler="$gcc_compiler"
+ cxx_compiler="$gxx_compiler"
+ build_dragonegg 1 $Flavor $llvmCore_phase1_installdir $dragonegg_phase1_objdir
+
+ ############################################################################
+ # Phase 2: Build llvmCore with newly built dragonegg from phase 1.
+ c_compiler="$gcc_compiler -fplugin=$dragonegg_phase1_objdir/dragonegg.so"
+ cxx_compiler="$gxx_compiler -fplugin=$dragonegg_phase1_objdir/dragonegg.so"
+ echo "# Phase 2: Building llvmCore with dragonegg"
+ configure_llvmCore 2 $Flavor \
+ $llvmCore_de_phase2_objdir $llvmCore_de_phase2_installdir
+ build_llvmCore 2 $Flavor \
+ $llvmCore_de_phase2_objdir
+ build_dragonegg 2 $Flavor $llvmCore_de_phase2_installdir $dragonegg_phase2_objdir
+
+ ############################################################################
+ # Phase 3: Build llvmCore with newly built clang from phase 2.
+ c_compiler="$gcc_compiler -fplugin=$dragonegg_phase2_objdir/dragonegg.so"
+ cxx_compiler="$gxx_compiler -fplugin=$dragonegg_phase2_objdir/dragonegg.so"
+ echo "# Phase 3: Building llvmCore with dragonegg"
+ configure_llvmCore 3 $Flavor \
+ $llvmCore_de_phase3_objdir $llvmCore_de_phase3_installdir
+ build_llvmCore 3 $Flavor \
+ $llvmCore_de_phase3_objdir
+ build_dragonegg 3 $Flavor $llvmCore_de_phase3_installdir $dragonegg_phase3_objdir
+
+ ############################################################################
+ # Testing: Test phase 3
+ c_compiler="$gcc_compiler -fplugin=$dragonegg_phase3_objdir/dragonegg.so"
+ cxx_compiler="$gxx_compiler -fplugin=$dragonegg_phase3_objdir/dragonegg.so"
+ echo "# Testing - built with dragonegg"
+ test_llvmCore 3 $Flavor $llvmCore_de_phase3_objdir
+
+ ############################################################################
+ # Compare .o files between Phase2 and Phase3 and report which ones differ.
+ echo
+ echo "# Comparing Phase 2 and Phase 3 files"
+ for o in `find $llvmCore_de_phase2_objdir -name '*.o'` ; do
+ p3=`echo $o | sed -e 's,Phase2,Phase3,'`
+ if ! cmp --ignore-initial=16 $o $p3 > /dev/null 2>&1 ; then
+ echo "file `basename $o` differs between dragonegg phase 2 and phase 3"
+ fi
+ done
+ fi
- ############################################################################
- # Compare .o files between Phase2 and Phase3 and report which ones differ.
- echo
- echo "# Comparing Phase 2 and Phase 3 files"
- for o in `find $llvmCore_phase2_objdir -name '*.o'` ; do
- p3=`echo $o | sed -e 's,Phase2,Phase3,'`
- if ! cmp --ignore-initial=16 $o $p3 > /dev/null 2>&1 ; then
- echo "file `basename $o` differs between phase 2 and phase 3"
- fi
- done
+ # Otherwise just test the core.
+ if [ "$do_clang" != "yes" -a "$do_dragonegg" != "yes" ]; then
+ echo "# Testing - built with system compiler"
+ test_llvmCore 1 $Flavor $llvmCore_phase1_objdir
+ fi
done
) 2>&1 | tee $LogDir/testing.$Release-rc$RC.log
+set +e
+
# Woo hoo!
echo "### Testing Finished ###"
echo "### Logs: $LogDir"