791 lines · bash
1#!/usr/bin/env bash2#===-- test-release.sh - Test the LLVM release candidates ------------------===#3#4# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5# See https://llvm.org/LICENSE.txt for license information.6# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7#8#===------------------------------------------------------------------------===#9#10# Download, build, and test the release candidate for an LLVM release.11#12#===------------------------------------------------------------------------===#13 14System=`uname -s`15Machine=`uname -m`16if [ "$System" = "FreeBSD" ]; then17 MAKE=gmake18else19 MAKE=make20fi21generator="Unix Makefiles"22 23Release=""24Release_no_dot=""25RC=""26Triple=""27use_gzip="no"28do_checkout="yes"29do_debug="no"30do_asserts="no"31do_compare="yes"32do_rt="yes"33do_clang_tools="yes"34do_libs="yes"35do_libcxxabi="yes"36do_libunwind="yes"37do_test_suite="yes"38do_openmp="yes"39do_lld="yes"40do_lldb="yes"41do_polly="yes"42do_mlir="yes"43do_flang="yes"44do_silent_log="no"45BuildDir="`pwd`"46ExtraConfigureFlags=""47ExportBranch=""48git_ref=""49do_cmake_cache="no"50do_bolt="no"51if [ "$System" = "Linux" ]; then52 case $Machine in53 x86_64 | arm64 | aarch64 )54 do_bolt="yes"55 ;;56 esac57fi58 59function usage() {60 echo "usage: `basename $0` -release X.Y.Z -rc NUM [OPTIONS]"61 echo ""62 echo " -release X.Y.Z The release version to test."63 echo " -rc NUM The pre-release candidate number."64 echo " -final The final release candidate."65 echo " -triple TRIPLE The target triple for this machine."66 echo " -j NUM Number of compile jobs to run. [default: 3]"67 echo " -build-dir DIR Directory to perform testing in. [default: pwd]"68 echo " -no-checkout Don't checkout the sources from SVN."69 echo " -test-debug Test the debug build. [default: no]"70 echo " -test-asserts Test with asserts on. [default: no]"71 echo " -no-compare-files Don't test that phase 2 and 3 files are identical."72 echo " -use-gzip Use gzip instead of xz."73 echo " -use-ninja Use ninja instead of make/gmake."74 echo " -configure-flags FLAGS Extra flags to pass to the configure step."75 echo " -git-ref sha Use the specified git ref for testing instead of a release."76 echo " -no-rt Disable check-out & build Compiler-RT"77 echo " -no-clang-tools Disable check-out & build clang-tools-extra"78 echo " -no-libs Disable check-out & build libcxx/libcxxabi/libunwind"79 echo " -no-libcxxabi Disable check-out & build libcxxabi"80 echo " -no-libunwind Disable check-out & build libunwind"81 echo " -no-test-suite Disable check-out & build test-suite"82 echo " -no-openmp Disable check-out & build libomp"83 echo " -no-lld Disable check-out & build lld"84 echo " -lldb Enable check-out & build lldb"85 echo " -no-lldb Disable check-out & build lldb (default)"86 echo " -no-polly Disable check-out & build Polly"87 echo " -no-mlir Disable check-out & build MLIR"88 echo " -no-flang Disable check-out & build Flang"89 echo " -silent-log Don't output build logs to stdout"90 echo " -use-cmake-cache Build using a CMake cache file"91}92 93while [ $# -gt 0 ]; do94 case $1 in95 -release | --release )96 shift97 Release="$1"98 Release_no_dot="`echo $1 | sed -e 's,\.,,g'`"99 ;;100 -rc | --rc | -RC | --RC )101 shift102 RC="rc$1"103 ;;104 -final | --final )105 RC=final106 ;;107 -git-ref | --git-ref )108 shift109 Release="test"110 Release_no_dot="test"111 ExportBranch="$1"112 RC="`echo $ExportBranch | sed -e 's,/,_,g'`"113 git_ref="$1"114 echo "WARNING: Using the ref $git_ref instead of a release tag"115 echo " This is intended to aid new packagers in trialing "116 echo " builds without requiring a tag to be created first"117 ;;118 -triple | --triple )119 shift120 Triple="$1"121 ;;122 -configure-flags | --configure-flags )123 shift124 ExtraConfigureFlags="$1"125 ;;126 -j* )127 NumJobs="`echo $1 | sed -e 's,-j\([0-9]*\),\1,g'`"128 if [ -z "$NumJobs" ]; then129 shift130 NumJobs="$1"131 fi132 ;;133 -use-ninja )134 MAKE=ninja135 generator=Ninja136 ;;137 -build-dir | --build-dir | -builddir | --builddir )138 shift139 BuildDir="$1"140 ;;141 -no-checkout | --no-checkout )142 do_checkout="no"143 ;;144 -test-debug | --test-debug )145 do_debug="yes"146 ;;147 -test-asserts | --test-asserts )148 do_asserts="yes"149 ;;150 -no-compare-files | --no-compare-files )151 do_compare="no"152 ;;153 -use-gzip | --use-gzip )154 use_gzip="yes"155 ;;156 -no-rt )157 do_rt="no"158 ;;159 -no-libs )160 do_libs="no"161 ;;162 -no-clang-tools )163 do_clang_tools="no"164 ;;165 -no-libcxxabi )166 do_libcxxabi="no"167 ;;168 -no-libunwind )169 do_libunwind="no"170 ;;171 -no-test-suite )172 do_test_suite="no"173 ;;174 -no-openmp )175 do_openmp="no"176 ;;177 -bolt )178 do_bolt="yes"179 ;;180 -no-bolt )181 do_bolt="no"182 ;;183 -no-lld )184 do_lld="no"185 ;;186 -lldb )187 do_lldb="yes"188 ;;189 -no-lldb )190 do_lldb="no"191 ;;192 -no-polly )193 do_polly="no"194 ;;195 -no-mlir )196 do_mlir="no"197 ;;198 -no-flang )199 do_flang="no"200 ;;201 -silent-log )202 do_silent_log="yes"203 ;;204 -use-cmake-cache | --use-cmake-cache )205 do_cmake_cache="yes"206 ;;207 -help | --help | -h | --h | -\? )208 usage209 exit 0210 ;;211 * )212 echo "unknown option: $1"213 usage214 exit 1215 ;;216 esac217 shift218done219 220if [ $do_mlir = "no" ] && [ $do_flang = "yes" ]; then221 echo "error: cannot build Flang without MLIR"222 exit 1223fi224 225# Check required arguments.226if [ -z "$Release" ]; then227 echo "error: no release number specified"228 exit 1229fi230if [ -z "$RC" ]; then231 echo "error: no release candidate number specified"232 exit 1233fi234if [ -z "$ExportBranch" ]; then235 ExportBranch="tags/RELEASE_$Release_no_dot/$RC"236fi237if [ -z "$Triple" ]; then238 echo "error: no target triple specified"239 exit 1240fi241 242if [ "$Release" != "test" ]; then243 if [ -n "$git_ref" ]; then244 echo "error: can't specify both -release and -git-ref"245 exit 1246 fi247 git_ref=llvmorg-$Release248 if [ "$RC" != "final" ]; then249 git_ref="$git_ref-$RC"250 fi251fi252 253UserNumJobs="$NumJobs"254 255# Figure out how many make processes to run.256if [ -z "$NumJobs" ]; then257 NumJobs=`sysctl -n hw.activecpu 2> /dev/null || true`258fi259if [ -z "$NumJobs" ]; then260 NumJobs=`sysctl -n hw.ncpu 2> /dev/null || true`261fi262if [ -z "$NumJobs" ]; then263 NumJobs=`grep -c processor /proc/cpuinfo 2> /dev/null || true`264fi265if [ -z "$NumJobs" ]; then266 NumJobs=3267fi268 269if [ "$MAKE" = "ninja" ] && [ -z "$UserNumJobs" ]; then270 # Rely on default ninja job numbers271 J_ARG=""272else273 J_ARG="-j $NumJobs"274fi275 276# Projects list277projects="llvm;clang"278if [ $do_clang_tools = "yes" ]; then279 projects="${projects:+$projects;}clang-tools-extra"280fi281runtimes=""282if [ $do_rt = "yes" ]; then283 runtimes="${runtimes:+$runtimes;}compiler-rt"284fi285if [ $do_libs = "yes" ]; then286 runtimes="${runtimes:+$runtimes;}libcxx"287 if [ $do_libcxxabi = "yes" ]; then288 runtimes="${runtimes:+$runtimes;}libcxxabi"289 fi290 if [ $do_libunwind = "yes" ]; then291 runtimes="${runtimes:+$runtimes;}libunwind"292 fi293fi294if [ $do_openmp = "yes" ]; then295 projects="${projects:+$projects;}openmp"296fi297if [ $do_bolt = "yes" ]; then298 projects="${projects:+$projects;}bolt"299fi300if [ $do_lld = "yes" ]; then301 projects="${projects:+$projects;}lld"302fi303if [ $do_lldb = "yes" ]; then304 projects="${projects:+$projects;}lldb"305fi306if [ $do_polly = "yes" ]; then307 projects="${projects:+$projects;}polly"308fi309if [ $do_mlir = "yes" ]; then310 projects="${projects:+$projects;}mlir"311fi312if [ $do_flang = "yes" ]; then313 projects="${projects:+$projects;}flang"314fi315 316# Go to the build directory (may be different from CWD)317BuildDir=$BuildDir/$RC318mkdir -p $BuildDir319cd $BuildDir320 321# Location of log files.322LogDir=$BuildDir/logs323mkdir -p $LogDir324 325# Final package name.326Package=clang+llvm-$Release327if [ $RC != "final" ]; then328 Package=$Package-$RC329fi330Package=$Package-$Triple331 332# Errors to be highlighted at the end are written to this file.333echo -n > $LogDir/deferred_errors.log334 335redir="/dev/stdout"336if [ $do_silent_log == "yes" ]; then337 echo "# Silencing build logs because of -silent-log flag..."338 redir="/dev/null"339fi340 341 342function build_with_cmake_cache() {343(344 CMakeBuildDir=$BuildDir/build345 SrcDir=$BuildDir/llvm-project/346 InstallDir=$BuildDir/install347 348 rm -rf $CMakeBuildDir349 350 # FIXME: Would be nice if the commands were echoed to the log file too.351 set -x352 353 env CC="$c_compiler" CXX="$cxx_compiler" \354 cmake -G "$generator" -B $CMakeBuildDir -S $SrcDir/llvm \355 -C $SrcDir/clang/cmake/caches/Release.cmake \356 -DCLANG_BOOTSTRAP_PASSTHROUGH="LLVM_LIT_ARGS" \357 -DLLVM_LIT_ARGS="-j $NumJobs $LitVerbose" \358 $ExtraConfigureFlags359 2>&1 | tee $LogDir/llvm.configure-$Flavor.log360 361 ${MAKE} $J_ARG $Verbose -C $CMakeBuildDir stage2-check-all \362 2>&1 | tee $LogDir/llvm.make-$Flavor.log > $redir363 364 DESTDIR="${InstallDir}" \365 ${MAKE} -C $CMakeBuildDir stage2-install \366 2>&1 | tee $LogDir/llvm.install-$Flavor.log > $redir367 368 mkdir -p $BuildDir/Release369 pushd $BuildDir/Release370 mv $InstallDir/usr/local $Package371 if [ "$use_gzip" = "yes" ]; then372 tar cf - $Package | gzip -9c > $BuildDir/$Package.tar.gz373 else374 tar cf - $Package | xz -9ce -T $NumJobs > $BuildDir/$Package.tar.xz375 fi376 mv $Package $InstallDir/usr/local377 popd378) 2>&1 | tee $LogDir/testing.$Release-$RC.log379 380 exit 0381}382 383function deferred_error() {384 Phase="$1"385 Flavor="$2"386 Msg="$3"387 echo "[${Flavor} Phase${Phase}] ${Msg}" | tee -a $LogDir/deferred_errors.log388}389 390# Make sure that a required program is available391function check_program_exists() {392 local program="$1"393 if ! type -P $program > /dev/null 2>&1 ; then394 echo "program '$1' not found !"395 exit 1396 fi397}398 399if [ "$System" != "Darwin" ] && [ "$System" != "SunOS" ] && [ "$System" != "AIX" ]; then400 check_program_exists 'chrpath'401fi402 403if [ "$System" != "Darwin" ]; then404 check_program_exists 'file'405 check_program_exists 'objdump'406fi407 408check_program_exists ${MAKE}409 410# Export sources to the build directory.411function export_sources() {412 SrcDir=$BuildDir/llvm-project413 mkdir -p $SrcDir414 echo "# Using git ref: $git_ref"415 416 # GitHub allows you to download a tarball of any commit using the URL:417 # https://github.com/$organization/$repo/archive/$ref.tar.gz418 curl -L https://github.com/llvm/llvm-project/archive/$git_ref.tar.gz | \419 tar -C $SrcDir --strip-components=1 -xzf -420 421 if [ "$do_test_suite" = "yes" ]; then422 TestSuiteSrcDir=$BuildDir/llvm-test-suite423 mkdir -p $TestSuiteSrcDir424 425 # We can only use named refs, like branches and tags, that exist in426 # both the llvm-project and test-suite repos if we want to run the427 # test suite.428 # If the test-suite fails to download assume we are using a ref that429 # doesn't exist in the test suite and disable it.430 set +e431 curl -L https://github.com/llvm/test-suite/archive/$git_ref.tar.gz | \432 tar -C $TestSuiteSrcDir --strip-components=1 -xzf -433 if [ $? -ne -0 ]; then434 echo "$git_ref not found in test-suite repo, test-suite disabled."435 do_test_suite="no"436 fi437 set -e438 fi439 440 cd $BuildDir441}442 443function configure_llvmCore() {444 Phase="$1"445 Flavor="$2"446 ObjDir="$3"447 448 case $Flavor in449 Release )450 BuildType="Release"451 Assertions="OFF"452 ;;453 Release+Asserts )454 BuildType="Release"455 Assertions="ON"456 ;;457 Debug )458 BuildType="Debug"459 Assertions="ON"460 ;;461 * )462 echo "# Invalid flavor '$Flavor'"463 echo ""464 return465 ;;466 esac467 468 # During the first two phases, there is no need to build any of the projects469 # except clang, since these phases are only meant to produce a bootstrapped470 # clang compiler, capable of building the third phase.471 if [ "$Phase" -lt "3" ]; then472 project_list="clang"473 else474 project_list="$projects"475 fi476 # During the first phase, there is no need to build any of the runtimes,477 # since this phase is only meant to get a clang compiler, capable of478 # building itself and any selected runtimes in the second phase.479 if [ "$Phase" -lt "2" ]; then480 runtime_list=""481 # compiler-rt builtins is needed on AIX to have a functional Phase 1 clang.482 if [ "$System" = "AIX" ]; then483 runtime_list="compiler-rt"484 fi 485 else486 runtime_list="$runtimes"487 fi488 489 echo "# Using C compiler: $c_compiler"490 echo "# Using C++ compiler: $cxx_compiler"491 492 cd $ObjDir493 echo "# Configuring llvm $Release-$RC $Flavor"494 495 echo "#" env CC="$c_compiler" CXX="$cxx_compiler" \496 cmake -G "$generator" \497 -DCMAKE_BUILD_TYPE=$BuildType -DLLVM_ENABLE_ASSERTIONS=$Assertions \498 -DCMAKE_POSITION_INDEPENDENT_CODE=ON \499 -DLLVM_ENABLE_PROJECTS="$project_list" \500 -DLLVM_LIT_ARGS="-j $NumJobs $LitVerbose" \501 -DLLVM_ENABLE_RUNTIMES="$runtime_list" \502 $ExtraConfigureFlags $BuildDir/llvm-project/llvm \503 2>&1 | tee $LogDir/llvm.configure-Phase$Phase-$Flavor.log504 env CC="$c_compiler" CXX="$cxx_compiler" \505 cmake -G "$generator" \506 -DCMAKE_BUILD_TYPE=$BuildType -DLLVM_ENABLE_ASSERTIONS=$Assertions \507 -DCMAKE_POSITION_INDEPENDENT_CODE=ON \508 -DLLVM_ENABLE_PROJECTS="$project_list" \509 -DLLVM_LIT_ARGS="-j $NumJobs $LitVerbose" \510 -DLLVM_ENABLE_RUNTIMES="$runtime_list" \511 $ExtraConfigureFlags $BuildDir/llvm-project/llvm \512 2>&1 | tee $LogDir/llvm.configure-Phase$Phase-$Flavor.log513 514 cd $BuildDir515}516 517function build_llvmCore() {518 Phase="$1"519 Flavor="$2"520 ObjDir="$3"521 DestDir="$4"522 523 Verbose="VERBOSE=1"524 if [ ${MAKE} = 'ninja' ]; then525 Verbose="-v"526 fi527 LitVerbose="-v"528 529 InstallTarget="install"530 if [ "$Phase" -lt "3" ]; then531 BuildTarget="clang"532 InstallTarget="install-clang install-clang-resource-headers"533 # compiler-rt builtins is needed on AIX to have a functional Phase 1 clang.534 if [ "$System" = "AIX" ]; then535 BuildTarget="$BuildTarget runtimes"536 InstallTarget="$InstallTarget install-builtins"537 fi538 fi539 if [ "$Phase" -eq "3" ]; then540 # Build everything at once, with the proper parallelism and verbosity,541 # in Phase 3.542 BuildTarget=543 fi544 545 cd $ObjDir546 echo "# Compiling llvm $Release-$RC $Flavor"547 echo "# ${MAKE} $J_ARG $Verbose"548 ${MAKE} $J_ARG $Verbose $BuildTarget \549 2>&1 | tee $LogDir/llvm.make-Phase$Phase-$Flavor.log > $redir550 551 echo "# Installing llvm $Release-$RC $Flavor"552 echo "# ${MAKE} install"553 DESTDIR="${DestDir}" ${MAKE} $InstallTarget \554 2>&1 | tee $LogDir/llvm.install-Phase$Phase-$Flavor.log > $redir555 cd $BuildDir556}557 558function test_llvmCore() {559 Phase="$1"560 Flavor="$2"561 ObjDir="$3"562 563 KeepGoing="-k"564 if [ ${MAKE} = 'ninja' ]; then565 # Ninja doesn't have a documented "keep-going-forever" mode, we need to566 # set a limit on how many jobs can fail before we give up.567 KeepGoing="-k 100"568 fi569 570 cd $ObjDir571 if ! ( ${MAKE} $J_ARG $KeepGoing $Verbose check-all \572 2>&1 | tee $LogDir/llvm.check-Phase$Phase-$Flavor.log ) ; then573 deferred_error $Phase $Flavor "check-all failed"574 fi575 576 if [ $do_test_suite = 'yes' ]; then577 cd $TestSuiteBuildDir578 env CC="$c_compiler" CXX="$cxx_compiler" \579 cmake $TestSuiteSrcDir -G "$generator" -DTEST_SUITE_LIT=$Lit \580 -DTEST_SUITE_HOST_CC=$build_compiler581 582 if ! ( ${MAKE} $J_ARG $KeepGoing $Verbose check \583 2>&1 | tee $LogDir/llvm.check-Phase$Phase-$Flavor.log ) ; then584 deferred_error $Phase $Flavor "test suite failed"585 fi586 fi587 cd $BuildDir588}589 590# Clean RPATH. Libtool adds the build directory to the search path, which is591# not necessary --- and even harmful --- for the binary packages we release.592function clean_RPATH() {593 if [ "$System" = "Darwin" ] || [ "$System" = "SunOS" ] || [ "$System" = "AIX" ]; then594 return595 fi596 local InstallPath="$1"597 for Candidate in `find $InstallPath/{bin,lib} -type f`; do598 if file $Candidate | grep ELF | egrep 'executable|shared object' > /dev/null 2>&1 ; then599 if rpath=`objdump -x $Candidate | grep 'RPATH'` ; then600 rpath=`echo $rpath | sed -e's/^ *RPATH *//'`601 if [ -n "$rpath" ]; then602 newrpath=`echo $rpath | sed -e's/.*\(\$ORIGIN[^:]*\).*/\1/'`603 chrpath -r $newrpath $Candidate 2>&1 > /dev/null 2>&1604 fi605 fi606 fi607 done608}609 610# Create a package of the release binaries.611function package_release() {612 cwd=`pwd`613 cd $BuildDir/Phase3/Release614 mv llvmCore-$Release-$RC.install/usr/local $Package615 if [ "$use_gzip" = "yes" ]; then616 tar cf - $Package | gzip -9c > $BuildDir/$Package.tar.gz617 else618 tar cf - $Package | xz -9ce -T $NumJobs > $BuildDir/$Package.tar.xz619 fi620 mv $Package llvmCore-$Release-$RC.install/usr/local621 cd $cwd622}623 624# Exit if any command fails625# Note: pipefail is necessary for running build commands through626# a pipe (i.e. it changes the output of ``false | tee /dev/null ; echo $?``)627set -e628set -o pipefail629 630# Turn off core dumps, as some test cases can easily fill up even the largest631# file systems.632ulimit -c 0633 634if [ "$do_checkout" = "yes" ]; then635 export_sources636fi637 638# Setup the test-suite. Do this early so we can catch failures before639# we do the full 3 stage build.640if [ $do_test_suite = "yes" ]; then641 check_program_exists 'python3'642 venv="python3 -m venv"643 644 SandboxDir="$BuildDir/sandbox"645 Lit=$SandboxDir/bin/lit646 TestSuiteBuildDir="$BuildDir/test-suite-build"647 TestSuiteSrcDir="$BuildDir/llvm-test-suite"648 649 ${venv} $SandboxDir650 $SandboxDir/bin/python -m pip install $BuildDir/llvm-project/llvm/utils/lit651 mkdir -p $TestSuiteBuildDir652fi653 654if [ "$do_cmake_cache" = "yes" ]; then655 build_with_cmake_cache656 exit 0657fi658 659(660 661Flavors="Release"662if [ "$do_debug" = "yes" ]; then663 Flavors="Debug $Flavors"664fi665if [ "$do_asserts" = "yes" ]; then666 Flavors="$Flavors Release+Asserts"667fi668 669for Flavor in $Flavors ; do670 echo ""671 echo ""672 echo "********************************************************************************"673 echo " Release: $Release-$RC"674 echo " Build: $Flavor"675 echo " System Info: "676 echo " `uname -a`"677 echo "********************************************************************************"678 echo ""679 680 c_compiler="$CC"681 cxx_compiler="$CXX"682 build_compiler="$CC"683 [[ -z "$build_compiler" ]] && build_compiler="cc"684 llvmCore_phase1_objdir=$BuildDir/Phase1/$Flavor/llvmCore-$Release-$RC.obj685 llvmCore_phase1_destdir=$BuildDir/Phase1/$Flavor/llvmCore-$Release-$RC.install686 687 llvmCore_phase2_objdir=$BuildDir/Phase2/$Flavor/llvmCore-$Release-$RC.obj688 llvmCore_phase2_destdir=$BuildDir/Phase2/$Flavor/llvmCore-$Release-$RC.install689 690 llvmCore_phase3_objdir=$BuildDir/Phase3/$Flavor/llvmCore-$Release-$RC.obj691 llvmCore_phase3_destdir=$BuildDir/Phase3/$Flavor/llvmCore-$Release-$RC.install692 693 rm -rf $llvmCore_phase1_objdir694 rm -rf $llvmCore_phase1_destdir695 696 rm -rf $llvmCore_phase2_objdir697 rm -rf $llvmCore_phase2_destdir698 699 rm -rf $llvmCore_phase3_objdir700 rm -rf $llvmCore_phase3_destdir701 702 mkdir -p $llvmCore_phase1_objdir703 mkdir -p $llvmCore_phase1_destdir704 705 mkdir -p $llvmCore_phase2_objdir706 mkdir -p $llvmCore_phase2_destdir707 708 mkdir -p $llvmCore_phase3_objdir709 mkdir -p $llvmCore_phase3_destdir710 711 ############################################################################712 # Phase 1: Build llvmCore and clang713 echo "# Phase 1: Building llvmCore"714 configure_llvmCore 1 $Flavor $llvmCore_phase1_objdir715 build_llvmCore 1 $Flavor \716 $llvmCore_phase1_objdir $llvmCore_phase1_destdir717 clean_RPATH $llvmCore_phase1_destdir/usr/local718 719 ########################################################################720 # Phase 2: Build llvmCore with newly built clang from phase 1.721 c_compiler=$llvmCore_phase1_destdir/usr/local/bin/clang722 cxx_compiler=$llvmCore_phase1_destdir/usr/local/bin/clang++723 echo "# Phase 2: Building llvmCore"724 configure_llvmCore 2 $Flavor $llvmCore_phase2_objdir725 build_llvmCore 2 $Flavor \726 $llvmCore_phase2_objdir $llvmCore_phase2_destdir727 clean_RPATH $llvmCore_phase2_destdir/usr/local728 729 ########################################################################730 # Phase 3: Build llvmCore with newly built clang from phase 2.731 c_compiler=$llvmCore_phase2_destdir/usr/local/bin/clang732 cxx_compiler=$llvmCore_phase2_destdir/usr/local/bin/clang++733 echo "# Phase 3: Building llvmCore"734 configure_llvmCore 3 $Flavor $llvmCore_phase3_objdir735 build_llvmCore 3 $Flavor \736 $llvmCore_phase3_objdir $llvmCore_phase3_destdir737 clean_RPATH $llvmCore_phase3_destdir/usr/local738 739 ########################################################################740 # Testing: Test phase 3741 c_compiler=$llvmCore_phase3_destdir/usr/local/bin/clang742 cxx_compiler=$llvmCore_phase3_destdir/usr/local/bin/clang++743 echo "# Testing - built with clang"744 test_llvmCore 3 $Flavor $llvmCore_phase3_objdir745 746 ########################################################################747 # Compare .o files between Phase2 and Phase3 and report which ones748 # differ.749 if [ "$do_compare" = "yes" ]; then750 echo751 echo "# Comparing Phase 2 and Phase 3 files"752 for p2 in `find $llvmCore_phase2_objdir -name '*.o'` ; do753 p3=`echo $p2 | sed -e 's,Phase2,Phase3,'`754 # Substitute 'Phase2' for 'Phase3' in the Phase 2 object file in755 # case there are build paths in the debug info. Do the same sub-756 # stitution on both files in case the string occurrs naturally.757 if ! cmp -s \758 <(env LC_ALL=C sed -e 's,Phase1,Phase2,g' -e 's,Phase2,Phase3,g' $p2) \759 <(env LC_ALL=C sed -e 's,Phase1,Phase2,g' -e 's,Phase2,Phase3,g' $p3) \760 16 16; then761 echo "file `basename $p2` differs between phase 2 and phase 3"762 fi763 done764 fi765done766 767) 2>&1 | tee $LogDir/testing.$Release-$RC.log768 769if [ "$use_gzip" = "yes" ]; then770 echo "# Packaging the release as $Package.tar.gz"771else772 echo "# Packaging the release as $Package.tar.xz"773fi774package_release775 776set +e777 778# Woo hoo!779echo "### Testing Finished ###"780echo "### Logs: $LogDir"781 782echo "### Errors:"783if [ -s "$LogDir/deferred_errors.log" ]; then784 cat "$LogDir/deferred_errors.log"785 exit 1786else787 echo "None."788fi789 790exit 0791