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