xref: /aosp_15_r20/external/llvm/utils/release/test-release.sh (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker#!/usr/bin/env bash
2*9880d681SAndroid Build Coastguard Worker#===-- test-release.sh - Test the LLVM release candidates ------------------===#
3*9880d681SAndroid Build Coastguard Worker#
4*9880d681SAndroid Build Coastguard Worker#                     The LLVM Compiler Infrastructure
5*9880d681SAndroid Build Coastguard Worker#
6*9880d681SAndroid Build Coastguard Worker# This file is distributed under the University of Illinois Open Source
7*9880d681SAndroid Build Coastguard Worker# License.
8*9880d681SAndroid Build Coastguard Worker#
9*9880d681SAndroid Build Coastguard Worker#===------------------------------------------------------------------------===#
10*9880d681SAndroid Build Coastguard Worker#
11*9880d681SAndroid Build Coastguard Worker# Download, build, and test the release candidate for an LLVM release.
12*9880d681SAndroid Build Coastguard Worker#
13*9880d681SAndroid Build Coastguard Worker#===------------------------------------------------------------------------===#
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard WorkerSystem=`uname -s`
16*9880d681SAndroid Build Coastguard Workerif [ "$System" = "FreeBSD" ]; then
17*9880d681SAndroid Build Coastguard Worker    MAKE=gmake
18*9880d681SAndroid Build Coastguard Workerelse
19*9880d681SAndroid Build Coastguard Worker    MAKE=make
20*9880d681SAndroid Build Coastguard Workerfi
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker# Base SVN URL for the sources.
23*9880d681SAndroid Build Coastguard WorkerBase_url="http://llvm.org/svn/llvm-project"
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard WorkerRelease=""
26*9880d681SAndroid Build Coastguard WorkerRelease_no_dot=""
27*9880d681SAndroid Build Coastguard WorkerRC=""
28*9880d681SAndroid Build Coastguard WorkerTriple=""
29*9880d681SAndroid Build Coastguard Workeruse_gzip="no"
30*9880d681SAndroid Build Coastguard Workerdo_checkout="yes"
31*9880d681SAndroid Build Coastguard Workerdo_debug="no"
32*9880d681SAndroid Build Coastguard Workerdo_asserts="no"
33*9880d681SAndroid Build Coastguard Workerdo_compare="yes"
34*9880d681SAndroid Build Coastguard Workerdo_rt="yes"
35*9880d681SAndroid Build Coastguard Workerdo_libs="yes"
36*9880d681SAndroid Build Coastguard Workerdo_libunwind="yes"
37*9880d681SAndroid Build Coastguard Workerdo_test_suite="yes"
38*9880d681SAndroid Build Coastguard Workerdo_openmp="yes"
39*9880d681SAndroid Build Coastguard Workerdo_lldb="no"
40*9880d681SAndroid Build Coastguard WorkerBuildDir="`pwd`"
41*9880d681SAndroid Build Coastguard Workeruse_autoconf="no"
42*9880d681SAndroid Build Coastguard WorkerExtraConfigureFlags=""
43*9880d681SAndroid Build Coastguard WorkerExportBranch=""
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerfunction usage() {
46*9880d681SAndroid Build Coastguard Worker    echo "usage: `basename $0` -release X.Y.Z -rc NUM [OPTIONS]"
47*9880d681SAndroid Build Coastguard Worker    echo ""
48*9880d681SAndroid Build Coastguard Worker    echo " -release X.Y.Z       The release version to test."
49*9880d681SAndroid Build Coastguard Worker    echo " -rc NUM              The pre-release candidate number."
50*9880d681SAndroid Build Coastguard Worker    echo " -final               The final release candidate."
51*9880d681SAndroid Build Coastguard Worker    echo " -triple TRIPLE       The target triple for this machine."
52*9880d681SAndroid Build Coastguard Worker    echo " -j NUM               Number of compile jobs to run. [default: 3]"
53*9880d681SAndroid Build Coastguard Worker    echo " -build-dir DIR       Directory to perform testing in. [default: pwd]"
54*9880d681SAndroid Build Coastguard Worker    echo " -no-checkout         Don't checkout the sources from SVN."
55*9880d681SAndroid Build Coastguard Worker    echo " -test-debug          Test the debug build. [default: no]"
56*9880d681SAndroid Build Coastguard Worker    echo " -test-asserts        Test with asserts on. [default: no]"
57*9880d681SAndroid Build Coastguard Worker    echo " -no-compare-files    Don't test that phase 2 and 3 files are identical."
58*9880d681SAndroid Build Coastguard Worker    echo " -use-gzip            Use gzip instead of xz."
59*9880d681SAndroid Build Coastguard Worker    echo " -configure-flags FLAGS  Extra flags to pass to the configure step."
60*9880d681SAndroid Build Coastguard Worker    echo " -use-autoconf        Use autoconf instead of cmake"
61*9880d681SAndroid Build Coastguard Worker    echo " -svn-path DIR        Use the specified DIR instead of a release."
62*9880d681SAndroid Build Coastguard Worker    echo "                      For example -svn-path trunk or -svn-path branches/release_37"
63*9880d681SAndroid Build Coastguard Worker    echo " -no-rt               Disable check-out & build Compiler-RT"
64*9880d681SAndroid Build Coastguard Worker    echo " -no-libs             Disable check-out & build libcxx/libcxxabi/libunwind"
65*9880d681SAndroid Build Coastguard Worker    echo " -no-libunwind        Disable check-out & build libunwind"
66*9880d681SAndroid Build Coastguard Worker    echo " -no-test-suite       Disable check-out & build test-suite"
67*9880d681SAndroid Build Coastguard Worker    echo " -no-openmp           Disable check-out & build libomp"
68*9880d681SAndroid Build Coastguard Worker    echo " -lldb                Enable check-out & build lldb"
69*9880d681SAndroid Build Coastguard Worker    echo " -no-lldb             Disable check-out & build lldb (default)"
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerwhile [ $# -gt 0 ]; do
73*9880d681SAndroid Build Coastguard Worker    case $1 in
74*9880d681SAndroid Build Coastguard Worker        -release | --release )
75*9880d681SAndroid Build Coastguard Worker            shift
76*9880d681SAndroid Build Coastguard Worker            Release="$1"
77*9880d681SAndroid Build Coastguard Worker            Release_no_dot="`echo $1 | sed -e 's,\.,,g'`"
78*9880d681SAndroid Build Coastguard Worker            ;;
79*9880d681SAndroid Build Coastguard Worker        -rc | --rc | -RC | --RC )
80*9880d681SAndroid Build Coastguard Worker            shift
81*9880d681SAndroid Build Coastguard Worker            RC="rc$1"
82*9880d681SAndroid Build Coastguard Worker            ;;
83*9880d681SAndroid Build Coastguard Worker        -final | --final )
84*9880d681SAndroid Build Coastguard Worker            RC=final
85*9880d681SAndroid Build Coastguard Worker            ;;
86*9880d681SAndroid Build Coastguard Worker        -svn-path | --svn-path )
87*9880d681SAndroid Build Coastguard Worker            shift
88*9880d681SAndroid Build Coastguard Worker            Release="test"
89*9880d681SAndroid Build Coastguard Worker            Release_no_dot="test"
90*9880d681SAndroid Build Coastguard Worker            ExportBranch="$1"
91*9880d681SAndroid Build Coastguard Worker            RC="`echo $ExportBranch | sed -e 's,/,_,g'`"
92*9880d681SAndroid Build Coastguard Worker            echo "WARNING: Using the branch $ExportBranch instead of a release tag"
93*9880d681SAndroid Build Coastguard Worker            echo "         This is intended to aid new packagers in trialing "
94*9880d681SAndroid Build Coastguard Worker            echo "         builds without requiring a tag to be created first"
95*9880d681SAndroid Build Coastguard Worker            ;;
96*9880d681SAndroid Build Coastguard Worker        -triple | --triple )
97*9880d681SAndroid Build Coastguard Worker            shift
98*9880d681SAndroid Build Coastguard Worker            Triple="$1"
99*9880d681SAndroid Build Coastguard Worker            ;;
100*9880d681SAndroid Build Coastguard Worker        -configure-flags | --configure-flags )
101*9880d681SAndroid Build Coastguard Worker            shift
102*9880d681SAndroid Build Coastguard Worker            ExtraConfigureFlags="$1"
103*9880d681SAndroid Build Coastguard Worker            ;;
104*9880d681SAndroid Build Coastguard Worker        -j* )
105*9880d681SAndroid Build Coastguard Worker            NumJobs="`echo $1 | sed -e 's,-j\([0-9]*\),\1,g'`"
106*9880d681SAndroid Build Coastguard Worker            if [ -z "$NumJobs" ]; then
107*9880d681SAndroid Build Coastguard Worker                shift
108*9880d681SAndroid Build Coastguard Worker                NumJobs="$1"
109*9880d681SAndroid Build Coastguard Worker            fi
110*9880d681SAndroid Build Coastguard Worker            ;;
111*9880d681SAndroid Build Coastguard Worker        -build-dir | --build-dir | -builddir | --builddir )
112*9880d681SAndroid Build Coastguard Worker            shift
113*9880d681SAndroid Build Coastguard Worker            BuildDir="$1"
114*9880d681SAndroid Build Coastguard Worker            ;;
115*9880d681SAndroid Build Coastguard Worker        -no-checkout | --no-checkout )
116*9880d681SAndroid Build Coastguard Worker            do_checkout="no"
117*9880d681SAndroid Build Coastguard Worker            ;;
118*9880d681SAndroid Build Coastguard Worker        -test-debug | --test-debug )
119*9880d681SAndroid Build Coastguard Worker            do_debug="yes"
120*9880d681SAndroid Build Coastguard Worker            ;;
121*9880d681SAndroid Build Coastguard Worker        -test-asserts | --test-asserts )
122*9880d681SAndroid Build Coastguard Worker            do_asserts="yes"
123*9880d681SAndroid Build Coastguard Worker            ;;
124*9880d681SAndroid Build Coastguard Worker        -no-compare-files | --no-compare-files )
125*9880d681SAndroid Build Coastguard Worker            do_compare="no"
126*9880d681SAndroid Build Coastguard Worker            ;;
127*9880d681SAndroid Build Coastguard Worker        -use-gzip | --use-gzip )
128*9880d681SAndroid Build Coastguard Worker            use_gzip="yes"
129*9880d681SAndroid Build Coastguard Worker            ;;
130*9880d681SAndroid Build Coastguard Worker        -use-autoconf | --use-autoconf )
131*9880d681SAndroid Build Coastguard Worker            use_autoconf="yes"
132*9880d681SAndroid Build Coastguard Worker            ;;
133*9880d681SAndroid Build Coastguard Worker        -no-rt )
134*9880d681SAndroid Build Coastguard Worker            do_rt="no"
135*9880d681SAndroid Build Coastguard Worker            ;;
136*9880d681SAndroid Build Coastguard Worker        -no-libs )
137*9880d681SAndroid Build Coastguard Worker            do_libs="no"
138*9880d681SAndroid Build Coastguard Worker            ;;
139*9880d681SAndroid Build Coastguard Worker        -no-libunwind )
140*9880d681SAndroid Build Coastguard Worker            do_libunwind="no"
141*9880d681SAndroid Build Coastguard Worker            ;;
142*9880d681SAndroid Build Coastguard Worker        -no-test-suite )
143*9880d681SAndroid Build Coastguard Worker            do_test_suite="no"
144*9880d681SAndroid Build Coastguard Worker            ;;
145*9880d681SAndroid Build Coastguard Worker        -no-openmp )
146*9880d681SAndroid Build Coastguard Worker            do_openmp="no"
147*9880d681SAndroid Build Coastguard Worker            ;;
148*9880d681SAndroid Build Coastguard Worker        -lldb )
149*9880d681SAndroid Build Coastguard Worker            do_lldb="yes"
150*9880d681SAndroid Build Coastguard Worker            ;;
151*9880d681SAndroid Build Coastguard Worker        -no-lldb )
152*9880d681SAndroid Build Coastguard Worker            do_lldb="no"
153*9880d681SAndroid Build Coastguard Worker            ;;
154*9880d681SAndroid Build Coastguard Worker        -help | --help | -h | --h | -\? )
155*9880d681SAndroid Build Coastguard Worker            usage
156*9880d681SAndroid Build Coastguard Worker            exit 0
157*9880d681SAndroid Build Coastguard Worker            ;;
158*9880d681SAndroid Build Coastguard Worker        * )
159*9880d681SAndroid Build Coastguard Worker            echo "unknown option: $1"
160*9880d681SAndroid Build Coastguard Worker            usage
161*9880d681SAndroid Build Coastguard Worker            exit 1
162*9880d681SAndroid Build Coastguard Worker            ;;
163*9880d681SAndroid Build Coastguard Worker    esac
164*9880d681SAndroid Build Coastguard Worker    shift
165*9880d681SAndroid Build Coastguard Workerdone
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Workerif [ "$use_autoconf" = "no" ]; then
168*9880d681SAndroid Build Coastguard Worker  if [ "$do_test_suite" = "yes" ]; then
169*9880d681SAndroid Build Coastguard Worker    # See llvm.org/PR26146.
170*9880d681SAndroid Build Coastguard Worker    echo Skipping test-suite build when using CMake.
171*9880d681SAndroid Build Coastguard Worker    echo It will still be exported.
172*9880d681SAndroid Build Coastguard Worker    do_test_suite="export-only"
173*9880d681SAndroid Build Coastguard Worker  fi
174*9880d681SAndroid Build Coastguard Workerfi
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Worker# Check required arguments.
177*9880d681SAndroid Build Coastguard Workerif [ -z "$Release" ]; then
178*9880d681SAndroid Build Coastguard Worker    echo "error: no release number specified"
179*9880d681SAndroid Build Coastguard Worker    exit 1
180*9880d681SAndroid Build Coastguard Workerfi
181*9880d681SAndroid Build Coastguard Workerif [ -z "$RC" ]; then
182*9880d681SAndroid Build Coastguard Worker    echo "error: no release candidate number specified"
183*9880d681SAndroid Build Coastguard Worker    exit 1
184*9880d681SAndroid Build Coastguard Workerfi
185*9880d681SAndroid Build Coastguard Workerif [ -z "$ExportBranch" ]; then
186*9880d681SAndroid Build Coastguard Worker    ExportBranch="tags/RELEASE_$Release_no_dot/$RC"
187*9880d681SAndroid Build Coastguard Workerfi
188*9880d681SAndroid Build Coastguard Workerif [ -z "$Triple" ]; then
189*9880d681SAndroid Build Coastguard Worker    echo "error: no target triple specified"
190*9880d681SAndroid Build Coastguard Worker    exit 1
191*9880d681SAndroid Build Coastguard Workerfi
192*9880d681SAndroid Build Coastguard Worker
193*9880d681SAndroid Build Coastguard Worker# Figure out how many make processes to run.
194*9880d681SAndroid Build Coastguard Workerif [ -z "$NumJobs" ]; then
195*9880d681SAndroid Build Coastguard Worker    NumJobs=`sysctl -n hw.activecpu 2> /dev/null || true`
196*9880d681SAndroid Build Coastguard Workerfi
197*9880d681SAndroid Build Coastguard Workerif [ -z "$NumJobs" ]; then
198*9880d681SAndroid Build Coastguard Worker    NumJobs=`sysctl -n hw.ncpu 2> /dev/null || true`
199*9880d681SAndroid Build Coastguard Workerfi
200*9880d681SAndroid Build Coastguard Workerif [ -z "$NumJobs" ]; then
201*9880d681SAndroid Build Coastguard Worker    NumJobs=`grep -c processor /proc/cpuinfo 2> /dev/null || true`
202*9880d681SAndroid Build Coastguard Workerfi
203*9880d681SAndroid Build Coastguard Workerif [ -z "$NumJobs" ]; then
204*9880d681SAndroid Build Coastguard Worker    NumJobs=3
205*9880d681SAndroid Build Coastguard Workerfi
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker# Projects list
208*9880d681SAndroid Build Coastguard Workerprojects="llvm cfe clang-tools-extra"
209*9880d681SAndroid Build Coastguard Workerif [ $do_rt = "yes" ]; then
210*9880d681SAndroid Build Coastguard Worker  projects="$projects compiler-rt"
211*9880d681SAndroid Build Coastguard Workerfi
212*9880d681SAndroid Build Coastguard Workerif [ $do_libs = "yes" ]; then
213*9880d681SAndroid Build Coastguard Worker  projects="$projects libcxx libcxxabi"
214*9880d681SAndroid Build Coastguard Worker  if [ $do_libunwind = "yes" ]; then
215*9880d681SAndroid Build Coastguard Worker    projects="$projects libunwind"
216*9880d681SAndroid Build Coastguard Worker  fi
217*9880d681SAndroid Build Coastguard Workerfi
218*9880d681SAndroid Build Coastguard Workercase $do_test_suite in
219*9880d681SAndroid Build Coastguard Worker  yes|export-only)
220*9880d681SAndroid Build Coastguard Worker    projects="$projects test-suite"
221*9880d681SAndroid Build Coastguard Worker    ;;
222*9880d681SAndroid Build Coastguard Workeresac
223*9880d681SAndroid Build Coastguard Workerif [ $do_openmp = "yes" ]; then
224*9880d681SAndroid Build Coastguard Worker  projects="$projects openmp"
225*9880d681SAndroid Build Coastguard Workerfi
226*9880d681SAndroid Build Coastguard Workerif [ $do_lldb = "yes" ]; then
227*9880d681SAndroid Build Coastguard Worker  projects="$projects lldb"
228*9880d681SAndroid Build Coastguard Workerfi
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Worker# Go to the build directory (may be different from CWD)
231*9880d681SAndroid Build Coastguard WorkerBuildDir=$BuildDir/$RC
232*9880d681SAndroid Build Coastguard Workermkdir -p $BuildDir
233*9880d681SAndroid Build Coastguard Workercd $BuildDir
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard Worker# Location of log files.
236*9880d681SAndroid Build Coastguard WorkerLogDir=$BuildDir/logs
237*9880d681SAndroid Build Coastguard Workermkdir -p $LogDir
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Worker# Final package name.
240*9880d681SAndroid Build Coastguard WorkerPackage=clang+llvm-$Release
241*9880d681SAndroid Build Coastguard Workerif [ $RC != "final" ]; then
242*9880d681SAndroid Build Coastguard Worker  Package=$Package-$RC
243*9880d681SAndroid Build Coastguard Workerfi
244*9880d681SAndroid Build Coastguard WorkerPackage=$Package-$Triple
245*9880d681SAndroid Build Coastguard Worker
246*9880d681SAndroid Build Coastguard Worker# Errors to be highlighted at the end are written to this file.
247*9880d681SAndroid Build Coastguard Workerecho -n > $LogDir/deferred_errors.log
248*9880d681SAndroid Build Coastguard Worker
249*9880d681SAndroid Build Coastguard Workerfunction deferred_error() {
250*9880d681SAndroid Build Coastguard Worker  Phase="$1"
251*9880d681SAndroid Build Coastguard Worker  Flavor="$2"
252*9880d681SAndroid Build Coastguard Worker  Msg="$3"
253*9880d681SAndroid Build Coastguard Worker  echo "[${Flavor} Phase${Phase}] ${Msg}" | tee -a $LogDir/deferred_errors.log
254*9880d681SAndroid Build Coastguard Worker}
255*9880d681SAndroid Build Coastguard Worker
256*9880d681SAndroid Build Coastguard Worker# Make sure that a required program is available
257*9880d681SAndroid Build Coastguard Workerfunction check_program_exists() {
258*9880d681SAndroid Build Coastguard Worker  local program="$1"
259*9880d681SAndroid Build Coastguard Worker  if ! type -P $program > /dev/null 2>&1 ; then
260*9880d681SAndroid Build Coastguard Worker    echo "program '$1' not found !"
261*9880d681SAndroid Build Coastguard Worker    exit 1
262*9880d681SAndroid Build Coastguard Worker  fi
263*9880d681SAndroid Build Coastguard Worker}
264*9880d681SAndroid Build Coastguard Worker
265*9880d681SAndroid Build Coastguard Workerif [ "$System" != "Darwin" ]; then
266*9880d681SAndroid Build Coastguard Worker  check_program_exists 'chrpath'
267*9880d681SAndroid Build Coastguard Worker  check_program_exists 'file'
268*9880d681SAndroid Build Coastguard Worker  check_program_exists 'objdump'
269*9880d681SAndroid Build Coastguard Workerfi
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Worker# Make sure that the URLs are valid.
272*9880d681SAndroid Build Coastguard Workerfunction check_valid_urls() {
273*9880d681SAndroid Build Coastguard Worker    for proj in $projects ; do
274*9880d681SAndroid Build Coastguard Worker        echo "# Validating $proj SVN URL"
275*9880d681SAndroid Build Coastguard Worker
276*9880d681SAndroid Build Coastguard Worker        if ! svn ls $Base_url/$proj/$ExportBranch > /dev/null 2>&1 ; then
277*9880d681SAndroid Build Coastguard Worker            echo "$proj does not have a $ExportBranch branch/tag!"
278*9880d681SAndroid Build Coastguard Worker            exit 1
279*9880d681SAndroid Build Coastguard Worker        fi
280*9880d681SAndroid Build Coastguard Worker    done
281*9880d681SAndroid Build Coastguard Worker}
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Worker# Export sources to the build directory.
284*9880d681SAndroid Build Coastguard Workerfunction export_sources() {
285*9880d681SAndroid Build Coastguard Worker    check_valid_urls
286*9880d681SAndroid Build Coastguard Worker
287*9880d681SAndroid Build Coastguard Worker    for proj in $projects ; do
288*9880d681SAndroid Build Coastguard Worker        case $proj in
289*9880d681SAndroid Build Coastguard Worker        llvm)
290*9880d681SAndroid Build Coastguard Worker            projsrc=$proj.src
291*9880d681SAndroid Build Coastguard Worker            ;;
292*9880d681SAndroid Build Coastguard Worker        cfe)
293*9880d681SAndroid Build Coastguard Worker            projsrc=llvm.src/tools/clang
294*9880d681SAndroid Build Coastguard Worker            ;;
295*9880d681SAndroid Build Coastguard Worker        lldb)
296*9880d681SAndroid Build Coastguard Worker            projsrc=llvm.src/tools/$proj
297*9880d681SAndroid Build Coastguard Worker            ;;
298*9880d681SAndroid Build Coastguard Worker        clang-tools-extra)
299*9880d681SAndroid Build Coastguard Worker            projsrc=llvm.src/tools/clang/tools/extra
300*9880d681SAndroid Build Coastguard Worker            ;;
301*9880d681SAndroid Build Coastguard Worker        compiler-rt|libcxx|libcxxabi|libunwind|openmp)
302*9880d681SAndroid Build Coastguard Worker            projsrc=llvm.src/projects/$proj
303*9880d681SAndroid Build Coastguard Worker            ;;
304*9880d681SAndroid Build Coastguard Worker        test-suite)
305*9880d681SAndroid Build Coastguard Worker            if [ $do_test_suite = 'yes' ]; then
306*9880d681SAndroid Build Coastguard Worker              projsrc=llvm.src/projects/$proj
307*9880d681SAndroid Build Coastguard Worker            else
308*9880d681SAndroid Build Coastguard Worker              projsrc=$proj.src
309*9880d681SAndroid Build Coastguard Worker            fi
310*9880d681SAndroid Build Coastguard Worker            ;;
311*9880d681SAndroid Build Coastguard Worker        *)
312*9880d681SAndroid Build Coastguard Worker            echo "error: unknown project $proj"
313*9880d681SAndroid Build Coastguard Worker            exit 1
314*9880d681SAndroid Build Coastguard Worker            ;;
315*9880d681SAndroid Build Coastguard Worker        esac
316*9880d681SAndroid Build Coastguard Worker
317*9880d681SAndroid Build Coastguard Worker        if [ -d $projsrc ]; then
318*9880d681SAndroid Build Coastguard Worker          echo "# Reusing $proj $Release-$RC sources in $projsrc"
319*9880d681SAndroid Build Coastguard Worker          continue
320*9880d681SAndroid Build Coastguard Worker        fi
321*9880d681SAndroid Build Coastguard Worker        echo "# Exporting $proj $Release-$RC sources to $projsrc"
322*9880d681SAndroid Build Coastguard Worker        if ! svn export -q $Base_url/$proj/$ExportBranch $projsrc ; then
323*9880d681SAndroid Build Coastguard Worker            echo "error: failed to export $proj project"
324*9880d681SAndroid Build Coastguard Worker            exit 1
325*9880d681SAndroid Build Coastguard Worker        fi
326*9880d681SAndroid Build Coastguard Worker    done
327*9880d681SAndroid Build Coastguard Worker
328*9880d681SAndroid Build Coastguard Worker    cd $BuildDir
329*9880d681SAndroid Build Coastguard Worker}
330*9880d681SAndroid Build Coastguard Worker
331*9880d681SAndroid Build Coastguard Workerfunction configure_llvmCore() {
332*9880d681SAndroid Build Coastguard Worker    Phase="$1"
333*9880d681SAndroid Build Coastguard Worker    Flavor="$2"
334*9880d681SAndroid Build Coastguard Worker    ObjDir="$3"
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Worker    case $Flavor in
337*9880d681SAndroid Build Coastguard Worker        Release )
338*9880d681SAndroid Build Coastguard Worker            BuildType="Release"
339*9880d681SAndroid Build Coastguard Worker            Assertions="OFF"
340*9880d681SAndroid Build Coastguard Worker            ConfigureFlags="--enable-optimized --disable-assertions"
341*9880d681SAndroid Build Coastguard Worker            ;;
342*9880d681SAndroid Build Coastguard Worker        Release+Asserts )
343*9880d681SAndroid Build Coastguard Worker            BuildType="Release"
344*9880d681SAndroid Build Coastguard Worker            Assertions="ON"
345*9880d681SAndroid Build Coastguard Worker            ConfigureFlags="--enable-optimized --enable-assertions"
346*9880d681SAndroid Build Coastguard Worker            ;;
347*9880d681SAndroid Build Coastguard Worker        Debug )
348*9880d681SAndroid Build Coastguard Worker            BuildType="Debug"
349*9880d681SAndroid Build Coastguard Worker            Assertions="ON"
350*9880d681SAndroid Build Coastguard Worker            ConfigureFlags="--disable-optimized --enable-assertions"
351*9880d681SAndroid Build Coastguard Worker            ;;
352*9880d681SAndroid Build Coastguard Worker        * )
353*9880d681SAndroid Build Coastguard Worker            echo "# Invalid flavor '$Flavor'"
354*9880d681SAndroid Build Coastguard Worker            echo ""
355*9880d681SAndroid Build Coastguard Worker            return
356*9880d681SAndroid Build Coastguard Worker            ;;
357*9880d681SAndroid Build Coastguard Worker    esac
358*9880d681SAndroid Build Coastguard Worker
359*9880d681SAndroid Build Coastguard Worker    echo "# Using C compiler: $c_compiler"
360*9880d681SAndroid Build Coastguard Worker    echo "# Using C++ compiler: $cxx_compiler"
361*9880d681SAndroid Build Coastguard Worker
362*9880d681SAndroid Build Coastguard Worker    cd $ObjDir
363*9880d681SAndroid Build Coastguard Worker    echo "# Configuring llvm $Release-$RC $Flavor"
364*9880d681SAndroid Build Coastguard Worker
365*9880d681SAndroid Build Coastguard Worker    if [ "$use_autoconf" = "yes" ]; then
366*9880d681SAndroid Build Coastguard Worker        echo "#" env CC="$c_compiler" CXX="$cxx_compiler" \
367*9880d681SAndroid Build Coastguard Worker            $BuildDir/llvm.src/configure \
368*9880d681SAndroid Build Coastguard Worker            $ConfigureFlags --disable-timestamps $ExtraConfigureFlags \
369*9880d681SAndroid Build Coastguard Worker            2>&1 | tee $LogDir/llvm.configure-Phase$Phase-$Flavor.log
370*9880d681SAndroid Build Coastguard Worker        env CC="$c_compiler" CXX="$cxx_compiler" \
371*9880d681SAndroid Build Coastguard Worker            $BuildDir/llvm.src/configure \
372*9880d681SAndroid Build Coastguard Worker            $ConfigureFlags --disable-timestamps $ExtraConfigureFlags \
373*9880d681SAndroid Build Coastguard Worker            2>&1 | tee $LogDir/llvm.configure-Phase$Phase-$Flavor.log
374*9880d681SAndroid Build Coastguard Worker    else
375*9880d681SAndroid Build Coastguard Worker        echo "#" env CC="$c_compiler" CXX="$cxx_compiler" \
376*9880d681SAndroid Build Coastguard Worker            cmake -G "Unix Makefiles" \
377*9880d681SAndroid Build Coastguard Worker            -DCMAKE_BUILD_TYPE=$BuildType -DLLVM_ENABLE_ASSERTIONS=$Assertions \
378*9880d681SAndroid Build Coastguard Worker            -DLLVM_CONFIGTIME="(timestamp not enabled)" \
379*9880d681SAndroid Build Coastguard Worker            $ExtraConfigureFlags $BuildDir/llvm.src \
380*9880d681SAndroid Build Coastguard Worker            2>&1 | tee $LogDir/llvm.configure-Phase$Phase-$Flavor.log
381*9880d681SAndroid Build Coastguard Worker        env CC="$c_compiler" CXX="$cxx_compiler" \
382*9880d681SAndroid Build Coastguard Worker            cmake -G "Unix Makefiles" \
383*9880d681SAndroid Build Coastguard Worker            -DCMAKE_BUILD_TYPE=$BuildType -DLLVM_ENABLE_ASSERTIONS=$Assertions \
384*9880d681SAndroid Build Coastguard Worker            -DLLVM_CONFIGTIME="(timestamp not enabled)" \
385*9880d681SAndroid Build Coastguard Worker            $ExtraConfigureFlags $BuildDir/llvm.src \
386*9880d681SAndroid Build Coastguard Worker            2>&1 | tee $LogDir/llvm.configure-Phase$Phase-$Flavor.log
387*9880d681SAndroid Build Coastguard Worker    fi
388*9880d681SAndroid Build Coastguard Worker
389*9880d681SAndroid Build Coastguard Worker    cd $BuildDir
390*9880d681SAndroid Build Coastguard Worker}
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Workerfunction build_llvmCore() {
393*9880d681SAndroid Build Coastguard Worker    Phase="$1"
394*9880d681SAndroid Build Coastguard Worker    Flavor="$2"
395*9880d681SAndroid Build Coastguard Worker    ObjDir="$3"
396*9880d681SAndroid Build Coastguard Worker    DestDir="$4"
397*9880d681SAndroid Build Coastguard Worker
398*9880d681SAndroid Build Coastguard Worker    cd $ObjDir
399*9880d681SAndroid Build Coastguard Worker    echo "# Compiling llvm $Release-$RC $Flavor"
400*9880d681SAndroid Build Coastguard Worker    echo "# ${MAKE} -j $NumJobs VERBOSE=1"
401*9880d681SAndroid Build Coastguard Worker    ${MAKE} -j $NumJobs VERBOSE=1 \
402*9880d681SAndroid Build Coastguard Worker        2>&1 | tee $LogDir/llvm.make-Phase$Phase-$Flavor.log
403*9880d681SAndroid Build Coastguard Worker
404*9880d681SAndroid Build Coastguard Worker    echo "# Installing llvm $Release-$RC $Flavor"
405*9880d681SAndroid Build Coastguard Worker    echo "# ${MAKE} install"
406*9880d681SAndroid Build Coastguard Worker    ${MAKE} install \
407*9880d681SAndroid Build Coastguard Worker        DESTDIR="${DestDir}" \
408*9880d681SAndroid Build Coastguard Worker        2>&1 | tee $LogDir/llvm.install-Phase$Phase-$Flavor.log
409*9880d681SAndroid Build Coastguard Worker    cd $BuildDir
410*9880d681SAndroid Build Coastguard Worker}
411*9880d681SAndroid Build Coastguard Worker
412*9880d681SAndroid Build Coastguard Workerfunction test_llvmCore() {
413*9880d681SAndroid Build Coastguard Worker    Phase="$1"
414*9880d681SAndroid Build Coastguard Worker    Flavor="$2"
415*9880d681SAndroid Build Coastguard Worker    ObjDir="$3"
416*9880d681SAndroid Build Coastguard Worker
417*9880d681SAndroid Build Coastguard Worker    cd $ObjDir
418*9880d681SAndroid Build Coastguard Worker    if ! ( ${MAKE} -j $NumJobs -k check-all \
419*9880d681SAndroid Build Coastguard Worker        2>&1 | tee $LogDir/llvm.check-Phase$Phase-$Flavor.log ) ; then
420*9880d681SAndroid Build Coastguard Worker      deferred_error $Phase $Flavor "check-all failed"
421*9880d681SAndroid Build Coastguard Worker    fi
422*9880d681SAndroid Build Coastguard Worker
423*9880d681SAndroid Build Coastguard Worker    if [ "$use_autoconf" = "yes" ]; then
424*9880d681SAndroid Build Coastguard Worker        # In the cmake build, unit tests are run as part of check-all.
425*9880d681SAndroid Build Coastguard Worker        if ! ( ${MAKE} -k unittests 2>&1 | \
426*9880d681SAndroid Build Coastguard Worker            tee $LogDir/llvm.unittests-Phase$Phase-$Flavor.log ) ; then
427*9880d681SAndroid Build Coastguard Worker          deferred_error $Phase $Flavor "unittests failed"
428*9880d681SAndroid Build Coastguard Worker        fi
429*9880d681SAndroid Build Coastguard Worker    fi
430*9880d681SAndroid Build Coastguard Worker
431*9880d681SAndroid Build Coastguard Worker    cd $BuildDir
432*9880d681SAndroid Build Coastguard Worker}
433*9880d681SAndroid Build Coastguard Worker
434*9880d681SAndroid Build Coastguard Worker# Clean RPATH. Libtool adds the build directory to the search path, which is
435*9880d681SAndroid Build Coastguard Worker# not necessary --- and even harmful --- for the binary packages we release.
436*9880d681SAndroid Build Coastguard Workerfunction clean_RPATH() {
437*9880d681SAndroid Build Coastguard Worker  if [ "$System" = "Darwin" ]; then
438*9880d681SAndroid Build Coastguard Worker    return
439*9880d681SAndroid Build Coastguard Worker  fi
440*9880d681SAndroid Build Coastguard Worker  local InstallPath="$1"
441*9880d681SAndroid Build Coastguard Worker  for Candidate in `find $InstallPath/{bin,lib} -type f`; do
442*9880d681SAndroid Build Coastguard Worker    if file $Candidate | grep ELF | egrep 'executable|shared object' > /dev/null 2>&1 ; then
443*9880d681SAndroid Build Coastguard Worker      if rpath=`objdump -x $Candidate | grep 'RPATH'` ; then
444*9880d681SAndroid Build Coastguard Worker        rpath=`echo $rpath | sed -e's/^ *RPATH *//'`
445*9880d681SAndroid Build Coastguard Worker        if [ -n "$rpath" ]; then
446*9880d681SAndroid Build Coastguard Worker          newrpath=`echo $rpath | sed -e's/.*\(\$ORIGIN[^:]*\).*/\1/'`
447*9880d681SAndroid Build Coastguard Worker          chrpath -r $newrpath $Candidate 2>&1 > /dev/null 2>&1
448*9880d681SAndroid Build Coastguard Worker        fi
449*9880d681SAndroid Build Coastguard Worker      fi
450*9880d681SAndroid Build Coastguard Worker    fi
451*9880d681SAndroid Build Coastguard Worker  done
452*9880d681SAndroid Build Coastguard Worker}
453*9880d681SAndroid Build Coastguard Worker
454*9880d681SAndroid Build Coastguard Worker# Create a package of the release binaries.
455*9880d681SAndroid Build Coastguard Workerfunction package_release() {
456*9880d681SAndroid Build Coastguard Worker    cwd=`pwd`
457*9880d681SAndroid Build Coastguard Worker    cd $BuildDir/Phase3/Release
458*9880d681SAndroid Build Coastguard Worker    mv llvmCore-$Release-$RC.install/usr/local $Package
459*9880d681SAndroid Build Coastguard Worker    if [ "$use_gzip" = "yes" ]; then
460*9880d681SAndroid Build Coastguard Worker      tar cfz $BuildDir/$Package.tar.gz $Package
461*9880d681SAndroid Build Coastguard Worker    else
462*9880d681SAndroid Build Coastguard Worker      tar cfJ $BuildDir/$Package.tar.xz $Package
463*9880d681SAndroid Build Coastguard Worker    fi
464*9880d681SAndroid Build Coastguard Worker    mv $Package llvmCore-$Release-$RC.install/usr/local
465*9880d681SAndroid Build Coastguard Worker    cd $cwd
466*9880d681SAndroid Build Coastguard Worker}
467*9880d681SAndroid Build Coastguard Worker
468*9880d681SAndroid Build Coastguard Worker# Exit if any command fails
469*9880d681SAndroid Build Coastguard Worker# Note: pipefail is necessary for running build commands through
470*9880d681SAndroid Build Coastguard Worker# a pipe (i.e. it changes the output of ``false | tee /dev/null ; echo $?``)
471*9880d681SAndroid Build Coastguard Workerset -e
472*9880d681SAndroid Build Coastguard Workerset -o pipefail
473*9880d681SAndroid Build Coastguard Worker
474*9880d681SAndroid Build Coastguard Workerif [ "$do_checkout" = "yes" ]; then
475*9880d681SAndroid Build Coastguard Worker    export_sources
476*9880d681SAndroid Build Coastguard Workerfi
477*9880d681SAndroid Build Coastguard Worker
478*9880d681SAndroid Build Coastguard Worker(
479*9880d681SAndroid Build Coastguard WorkerFlavors="Release"
480*9880d681SAndroid Build Coastguard Workerif [ "$do_debug" = "yes" ]; then
481*9880d681SAndroid Build Coastguard Worker    Flavors="Debug $Flavors"
482*9880d681SAndroid Build Coastguard Workerfi
483*9880d681SAndroid Build Coastguard Workerif [ "$do_asserts" = "yes" ]; then
484*9880d681SAndroid Build Coastguard Worker    Flavors="$Flavors Release+Asserts"
485*9880d681SAndroid Build Coastguard Workerfi
486*9880d681SAndroid Build Coastguard Worker
487*9880d681SAndroid Build Coastguard Workerfor Flavor in $Flavors ; do
488*9880d681SAndroid Build Coastguard Worker    echo ""
489*9880d681SAndroid Build Coastguard Worker    echo ""
490*9880d681SAndroid Build Coastguard Worker    echo "********************************************************************************"
491*9880d681SAndroid Build Coastguard Worker    echo "  Release:     $Release-$RC"
492*9880d681SAndroid Build Coastguard Worker    echo "  Build:       $Flavor"
493*9880d681SAndroid Build Coastguard Worker    echo "  System Info: "
494*9880d681SAndroid Build Coastguard Worker    echo "    `uname -a`"
495*9880d681SAndroid Build Coastguard Worker    echo "********************************************************************************"
496*9880d681SAndroid Build Coastguard Worker    echo ""
497*9880d681SAndroid Build Coastguard Worker
498*9880d681SAndroid Build Coastguard Worker    c_compiler="$CC"
499*9880d681SAndroid Build Coastguard Worker    cxx_compiler="$CXX"
500*9880d681SAndroid Build Coastguard Worker    llvmCore_phase1_objdir=$BuildDir/Phase1/$Flavor/llvmCore-$Release-$RC.obj
501*9880d681SAndroid Build Coastguard Worker    llvmCore_phase1_destdir=$BuildDir/Phase1/$Flavor/llvmCore-$Release-$RC.install
502*9880d681SAndroid Build Coastguard Worker
503*9880d681SAndroid Build Coastguard Worker    llvmCore_phase2_objdir=$BuildDir/Phase2/$Flavor/llvmCore-$Release-$RC.obj
504*9880d681SAndroid Build Coastguard Worker    llvmCore_phase2_destdir=$BuildDir/Phase2/$Flavor/llvmCore-$Release-$RC.install
505*9880d681SAndroid Build Coastguard Worker
506*9880d681SAndroid Build Coastguard Worker    llvmCore_phase3_objdir=$BuildDir/Phase3/$Flavor/llvmCore-$Release-$RC.obj
507*9880d681SAndroid Build Coastguard Worker    llvmCore_phase3_destdir=$BuildDir/Phase3/$Flavor/llvmCore-$Release-$RC.install
508*9880d681SAndroid Build Coastguard Worker
509*9880d681SAndroid Build Coastguard Worker    rm -rf $llvmCore_phase1_objdir
510*9880d681SAndroid Build Coastguard Worker    rm -rf $llvmCore_phase1_destdir
511*9880d681SAndroid Build Coastguard Worker
512*9880d681SAndroid Build Coastguard Worker    rm -rf $llvmCore_phase2_objdir
513*9880d681SAndroid Build Coastguard Worker    rm -rf $llvmCore_phase2_destdir
514*9880d681SAndroid Build Coastguard Worker
515*9880d681SAndroid Build Coastguard Worker    rm -rf $llvmCore_phase3_objdir
516*9880d681SAndroid Build Coastguard Worker    rm -rf $llvmCore_phase3_destdir
517*9880d681SAndroid Build Coastguard Worker
518*9880d681SAndroid Build Coastguard Worker    mkdir -p $llvmCore_phase1_objdir
519*9880d681SAndroid Build Coastguard Worker    mkdir -p $llvmCore_phase1_destdir
520*9880d681SAndroid Build Coastguard Worker
521*9880d681SAndroid Build Coastguard Worker    mkdir -p $llvmCore_phase2_objdir
522*9880d681SAndroid Build Coastguard Worker    mkdir -p $llvmCore_phase2_destdir
523*9880d681SAndroid Build Coastguard Worker
524*9880d681SAndroid Build Coastguard Worker    mkdir -p $llvmCore_phase3_objdir
525*9880d681SAndroid Build Coastguard Worker    mkdir -p $llvmCore_phase3_destdir
526*9880d681SAndroid Build Coastguard Worker
527*9880d681SAndroid Build Coastguard Worker    ############################################################################
528*9880d681SAndroid Build Coastguard Worker    # Phase 1: Build llvmCore and clang
529*9880d681SAndroid Build Coastguard Worker    echo "# Phase 1: Building llvmCore"
530*9880d681SAndroid Build Coastguard Worker    configure_llvmCore 1 $Flavor $llvmCore_phase1_objdir
531*9880d681SAndroid Build Coastguard Worker    build_llvmCore 1 $Flavor \
532*9880d681SAndroid Build Coastguard Worker        $llvmCore_phase1_objdir $llvmCore_phase1_destdir
533*9880d681SAndroid Build Coastguard Worker    clean_RPATH $llvmCore_phase1_destdir/usr/local
534*9880d681SAndroid Build Coastguard Worker
535*9880d681SAndroid Build Coastguard Worker    ########################################################################
536*9880d681SAndroid Build Coastguard Worker    # Phase 2: Build llvmCore with newly built clang from phase 1.
537*9880d681SAndroid Build Coastguard Worker    c_compiler=$llvmCore_phase1_destdir/usr/local/bin/clang
538*9880d681SAndroid Build Coastguard Worker    cxx_compiler=$llvmCore_phase1_destdir/usr/local/bin/clang++
539*9880d681SAndroid Build Coastguard Worker    echo "# Phase 2: Building llvmCore"
540*9880d681SAndroid Build Coastguard Worker    configure_llvmCore 2 $Flavor $llvmCore_phase2_objdir
541*9880d681SAndroid Build Coastguard Worker    build_llvmCore 2 $Flavor \
542*9880d681SAndroid Build Coastguard Worker        $llvmCore_phase2_objdir $llvmCore_phase2_destdir
543*9880d681SAndroid Build Coastguard Worker    clean_RPATH $llvmCore_phase2_destdir/usr/local
544*9880d681SAndroid Build Coastguard Worker
545*9880d681SAndroid Build Coastguard Worker    ########################################################################
546*9880d681SAndroid Build Coastguard Worker    # Phase 3: Build llvmCore with newly built clang from phase 2.
547*9880d681SAndroid Build Coastguard Worker    c_compiler=$llvmCore_phase2_destdir/usr/local/bin/clang
548*9880d681SAndroid Build Coastguard Worker    cxx_compiler=$llvmCore_phase2_destdir/usr/local/bin/clang++
549*9880d681SAndroid Build Coastguard Worker    echo "# Phase 3: Building llvmCore"
550*9880d681SAndroid Build Coastguard Worker    configure_llvmCore 3 $Flavor $llvmCore_phase3_objdir
551*9880d681SAndroid Build Coastguard Worker    build_llvmCore 3 $Flavor \
552*9880d681SAndroid Build Coastguard Worker        $llvmCore_phase3_objdir $llvmCore_phase3_destdir
553*9880d681SAndroid Build Coastguard Worker    clean_RPATH $llvmCore_phase3_destdir/usr/local
554*9880d681SAndroid Build Coastguard Worker
555*9880d681SAndroid Build Coastguard Worker    ########################################################################
556*9880d681SAndroid Build Coastguard Worker    # Testing: Test phase 3
557*9880d681SAndroid Build Coastguard Worker    echo "# Testing - built with clang"
558*9880d681SAndroid Build Coastguard Worker    test_llvmCore 3 $Flavor $llvmCore_phase3_objdir
559*9880d681SAndroid Build Coastguard Worker
560*9880d681SAndroid Build Coastguard Worker    ########################################################################
561*9880d681SAndroid Build Coastguard Worker    # Compare .o files between Phase2 and Phase3 and report which ones
562*9880d681SAndroid Build Coastguard Worker    # differ.
563*9880d681SAndroid Build Coastguard Worker    if [ "$do_compare" = "yes" ]; then
564*9880d681SAndroid Build Coastguard Worker        echo
565*9880d681SAndroid Build Coastguard Worker        echo "# Comparing Phase 2 and Phase 3 files"
566*9880d681SAndroid Build Coastguard Worker        for p2 in `find $llvmCore_phase2_objdir -name '*.o'` ; do
567*9880d681SAndroid Build Coastguard Worker            p3=`echo $p2 | sed -e 's,Phase2,Phase3,'`
568*9880d681SAndroid Build Coastguard Worker            # Substitute 'Phase2' for 'Phase3' in the Phase 2 object file in
569*9880d681SAndroid Build Coastguard Worker            # case there are build paths in the debug info. On some systems,
570*9880d681SAndroid Build Coastguard Worker            # sed adds a newline to the output, so pass $p3 through sed too.
571*9880d681SAndroid Build Coastguard Worker            if ! cmp -s \
572*9880d681SAndroid Build Coastguard Worker                <(env LC_CTYPE=C sed -e 's,Phase2,Phase3,g' $p2) \
573*9880d681SAndroid Build Coastguard Worker                <(env LC_CTYPE=C sed -e '' $p3) 16 16; then
574*9880d681SAndroid Build Coastguard Worker                echo "file `basename $p2` differs between phase 2 and phase 3"
575*9880d681SAndroid Build Coastguard Worker            fi
576*9880d681SAndroid Build Coastguard Worker        done
577*9880d681SAndroid Build Coastguard Worker    fi
578*9880d681SAndroid Build Coastguard Workerdone
579*9880d681SAndroid Build Coastguard Worker
580*9880d681SAndroid Build Coastguard Worker) 2>&1 | tee $LogDir/testing.$Release-$RC.log
581*9880d681SAndroid Build Coastguard Worker
582*9880d681SAndroid Build Coastguard Workerpackage_release
583*9880d681SAndroid Build Coastguard Worker
584*9880d681SAndroid Build Coastguard Workerset +e
585*9880d681SAndroid Build Coastguard Worker
586*9880d681SAndroid Build Coastguard Worker# Woo hoo!
587*9880d681SAndroid Build Coastguard Workerecho "### Testing Finished ###"
588*9880d681SAndroid Build Coastguard Workerif [ "$use_gzip" = "yes" ]; then
589*9880d681SAndroid Build Coastguard Worker  echo "### Package: $Package.tar.gz"
590*9880d681SAndroid Build Coastguard Workerelse
591*9880d681SAndroid Build Coastguard Worker  echo "### Package: $Package.tar.xz"
592*9880d681SAndroid Build Coastguard Workerfi
593*9880d681SAndroid Build Coastguard Workerecho "### Logs: $LogDir"
594*9880d681SAndroid Build Coastguard Worker
595*9880d681SAndroid Build Coastguard Workerecho "### Errors:"
596*9880d681SAndroid Build Coastguard Workerif [ -s "$LogDir/deferred_errors.log" ]; then
597*9880d681SAndroid Build Coastguard Worker  cat "$LogDir/deferred_errors.log"
598*9880d681SAndroid Build Coastguard Worker  exit 1
599*9880d681SAndroid Build Coastguard Workerelse
600*9880d681SAndroid Build Coastguard Worker  echo "None."
601*9880d681SAndroid Build Coastguard Workerfi
602*9880d681SAndroid Build Coastguard Worker
603*9880d681SAndroid Build Coastguard Workerexit 0
604