build-host-prebuilts.sh revision 6099deecb0b4f2805135f3670c41be971fbe4e3d
1d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner#!/bin/sh
2d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner#
31c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' Turner# Copyright (C) 2011 The Android Open Source Project
41c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' Turner#
51c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' Turner# Licensed under the Apache License, Version 2.0 (the "License");
61c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' Turner# you may not use this file except in compliance with the License.
71c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' Turner# You may obtain a copy of the License at
81c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' Turner#
91c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' Turner#      http://www.apache.org/licenses/LICENSE-2.0
101c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' Turner#
111c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' Turner# Unless required by applicable law or agreed to in writing, software
121c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' Turner# distributed under the License is distributed on an "AS IS" BASIS,
131c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' Turner# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' Turner# See the License for the specific language governing permissions and
151c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' Turner# limitations under the License.
161c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' Turner#
171c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' Turner# Rebuild all host toolchains and programs
18d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner#
19d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
20d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerPROGDIR=$(dirname $0)
21d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner. $PROGDIR/prebuilt-common.sh
22d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
23d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerNDK_DIR=$ANDROID_NDK_ROOT
24d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerregister_var_option "--ndk-dir=<path>" NDK_DIR "NDK installation directory"
25d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
26d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerSYSTEMS=$HOST_TAG
27d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner# Replace x86_64 by x86 at the end of SYSTEMS since we will produce
28d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner# 32-bit toolchains by default, i.e. unless you use the --try-64 flag
29d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ "${SYSTEMS%%x86_64}" != "$SYSTEMS" ]; then
30d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    SYSTEMS=${SYSTEMS%%x86_64}x86
31d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
32d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner# If we are on Linux, we are able to generate the Windows binaries
33d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner# with the mingw32 cross-toolchain.
34d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ "$SYSTEMS" = "linux-x86" ]; then
35d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    SYSTEMS=$SYSTEMS",windows"
36d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
37d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerCUSTOM_SYSTEMS=
38d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerregister_option "--systems=<names>" do_SYSTEMS "List of host systems to build for"
39d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerdo_SYSTEMS () { CUSTOM_SYSTEMS=true; SYSTEMS=$1; }
40d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
411c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' TurnerARCHS=$DEFAULT_ARCHS
42d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerregister_var_option "--arch=<list>" ARCHS "List of target archs to build for"
43d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
44d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerPACKAGE_DIR=
45d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerregister_var_option "--package-dir=<path>" PACKAGE_DIR "Package toolchain into this directory"
46d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
47d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerDARWIN_SSH=
48d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerregister_var_option "--darwin-ssh=<hostname>" DARWIN_SSH "Generate darwin packages on remote host"
49d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
50d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerNO_GEN_PLATFORMS=
51d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerregister_var_option "--no-gen-platforms" NO_GEN_PLATFORMS "Don't generate platforms/ directory, use existing one"
52d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
538e58e6b10c9c82e2085420b0e2f4c82d1db9b5c3Logan ChienLLVM_VERSION_LIST=$DEFAULT_LLVM_VERSION_LIST
546099deecb0b4f2805135f3670c41be971fbe4e3dAndrew Hsiehregister_var_option "--llvm-version-list=<vers>" LLVM_VERSION_LIST "List of LLVM release versions"
558e58e6b10c9c82e2085420b0e2f4c82d1db9b5c3Logan Chien
56d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerregister_try64_option
57d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
58d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerPROGRAM_PARAMETERS="<toolchain-src-dir>"
59d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerPROGRAM_DESCRIPTION=\
60d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner"This script can be used to rebuild all the host NDK toolchains at once.
61d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerYou need to give it the path to the toolchain source directory, as
62d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerdownloaded by the 'download-toolchain-sources.sh' dev-script."
63d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
64d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerextract_parameters "$@"
65d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
66d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner# Check toolchain source path
67d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerSRC_DIR="$PARAMETERS"
68d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ -z "$SRC_DIR" ]; then
69d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    echo "ERROR: Please provide the path to the toolchain source tree. See --help"
70d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    exit 1
71d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
72d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
73d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ ! -d "$SRC_DIR" ]; then
74d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    echo "ERROR: Not a directory: '$SRC_DIR'"
75d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    exit 1
76d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
77d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
781c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' Turnerif [ ! -f "$SRC_DIR/build/configure" -o ! -d "$SRC_DIR/gcc/gcc-$DEFAULT_GCC_VERSION" ]; then
79612e5d967db47c99996511a9e78f7c29d2dbdc67Nick Kralevich    echo "ERROR: The file $SRC_DIR/build/configure or"
80612e5d967db47c99996511a9e78f7c29d2dbdc67Nick Kralevich    echo "       the directory $SRC_DIR/gcc/gcc-$DEFAULT_GCC_VERSION does not exist"
81612e5d967db47c99996511a9e78f7c29d2dbdc67Nick Kralevich    echo "This is not the top of a toolchain tree: $SRC_DIR"
82d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    echo "You must give the path to a copy of the toolchain source directories"
83d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    echo "created by 'download-toolchain-sources.sh."
84d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    exit 1
85d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
86d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
87d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner# Now we can do the build
88d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerBUILDTOOLS=$ANDROID_NDK_ROOT/build/tools
89d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
90d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ -z "$NO_GEN_PLATFORMS" ]; then
91d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    echo "Preparing the build..."
92d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    run $BUILDTOOLS/gen-platforms.sh --minimal --dst-dir=$NDK_DIR --ndk-dir=$NDK_DIR --arch=$(spaces_to_commas $ARCHS)
93d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    fail_panic "Could not generate minimal sysroot!"
94d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerelse
95d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    if [ ! -d "$NDK_DIR/platforms" ]; then
96d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        echo "ERROR: --no-gen-platforms used but directory missing: $NDK_DIR/platforms"
97d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        exit 1
98d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    fi
99d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
100d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
101d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerSYSTEMS=$(commas_to_spaces $SYSTEMS)
102d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerARCHS=$(commas_to_spaces $ARCHS)
1038e58e6b10c9c82e2085420b0e2f4c82d1db9b5c3Logan ChienLLVM_VERSION_LIST=$(commas_to_spaces $LLVM_VERSION_LIST)
104d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
105d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ "$DARWIN_SSH" -a -z "$CUSTOM_SYSTEMS" ]; then
106d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    SYSTEMS=" darwin-x86"
107d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
108d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
109d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerFLAGS=
110d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ "$VERBOSE" = "yes" ]; then
111d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    FLAGS=$FLAGS" --verbose"
112d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
113d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ "$VERBOSE2" = "yes" ]; then
114d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    FLAGS=$FLAGS" --verbose"
115d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
116d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ "$TRY64" = "yes" ]; then
11709a968eb0b25413ccc5cce15d04216a630e85631Ray Donnelly    FLAGS=$FLAGS" --try-64"
118d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerelse
119d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    force_32bit_binaries
120d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
121d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ "$PACKAGE_DIR" ]; then
1221c855558c00aaf7f8f86335b605e7b78d8a17172David 'Digit' Turner    mkdir -p "$PACKAGE_DIR"
1231c855558c00aaf7f8f86335b605e7b78d8a17172David 'Digit' Turner    fail_panic "Could not create package directory: $PACKAGE_DIR"
124d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    FLAGS=$FLAGS" --package-dir=$PACKAGE_DIR"
125d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
126d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
127d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerdo_remote_host_build ()
128d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner{
129d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    local SYSTEM="$1"
130d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    local ARCH="$2"
131d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    local REMOTE_HOST="$3"
132d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
133d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # 1/ Copy the NDK toolchain build scripts
134d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # 2/ Copy the toolchain sources/package
135d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # 3/ Ssh to unpack the build scripts, and run them
136d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # 4/ Copy back the generated prebuilt binaries
137d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    #
138d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    dump "Preparing remote build on $REMOTE_HOST..."
139d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
140d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # First try to create a remote temp directory on the remote host
141d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # Do it first so we can fail fast, not after spending time preparing
142d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # large tarballs.
143d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    dump "Creating remote temp directory"
144d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    TMPREMOTE=/tmp/ndk-$USER/darwin-prebuild
145d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    run ssh $REMOTE_HOST "mkdir -p $TMPREMOTE && rm -rf $TMPREMOTE/*"
146d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    fail_panic "Could not create temporary build directory on $REMOTE_HOST"
147d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
148d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # Now, package all the stuff we're going to send in a temporary
149d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # directory here on the machine, except toolchain sources
150d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    TMPDARWIN=$NDK_TMPDIR/darwin  # Where we're going to package stuff
151d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    log "Using temporary work directory: $TMPDARWIN"
152d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    mkdir -p "$TMPDARWIN"
153d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    dump "Prepare NDK build scripts"
154d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    copy_directory "$ANDROID_NDK_ROOT/build" "$TMPDARWIN/ndk/build"
155d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    copy_file_list "$ANDROID_NDK_ROOT" "$TMPDARWIN/ndk" sources/android/libthread_db
156d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    copy_file_list "$ANDROID_NDK_ROOT" "$TMPDARWIN/ndk" "$STLPORT_SUBDIR"
157d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    copy_file_list "$ANDROID_NDK_ROOT" "$TMPDARWIN/ndk" "$GABIXX_SUBDIR"
1585c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner    copy_file_list "$ANDROID_NDK_ROOT" "$TMPDARWIN/ndk" sources/host-tools
159d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    dump "Prepare platforms files"
160d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    copy_directory "$NDK_DIR/platforms" "$TMPDARWIN/ndk/platforms"
161d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    dump "Copying NDK build scripts and platform files to remote..."
162d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    (cd "$TMPDARWIN" && tar czf - ndk) | (ssh $REMOTE_HOST tar xzf - -C $TMPREMOTE)
163d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    fail_panic "Could not copy!"
164d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    rm -rf $TMPDARWIN
165d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
166d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # Copy the toolchain sources
167d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    dump "Copy toolchain sources to remote"
168d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    ssh $REMOTE_HOST mkdir -p $TMPREMOTE/toolchain &&
169d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    (cd "$SRC_DIR" && tar czf - .) | (ssh $REMOTE_HOST tar xzf - -C $TMPREMOTE/toolchain)
170d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    fail_panic "Could not copy toolchain!"
171d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
172d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # Time to run the show :-)
173d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    for ARCH in $(commas_to_spaces $ARCHS); do
174d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        dump "Running remote $ARCH toolchain build..."
175d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        SYSROOT=$TMPREMOTE/ndk/platforms/android-$(get_default_api_level_for_arch $ARCH)/arch-$ARCH
176d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        run ssh $REMOTE_HOST "$TMPREMOTE/ndk/build/tools/build-host-prebuilts.sh $TMPREMOTE/toolchain --package-dir=$TMPREMOTE/packages --arch=$ARCH --ndk-dir=$TMPREMOTE/ndk --no-gen-platforms"
177d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        fail_panic "Could not build prebuilt $ARCH toolchain on Darwin!"
178d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    done
179d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # Get the results
180d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    dump "Copying back Darwin prebuilt packages..."
181d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    mkdir -p $TMPDARWIN/packages && rm -rf $TMPDARWIN/packages/*
182d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    run scp $REMOTE_HOST:$TMPREMOTE/packages/*-darwin-* $TMPDARWIN/packages
183d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    fail_panic "Could not grab Darwin packages!"
184d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
185d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    for PACK in $TMPDARWIN/packages/*; do
186d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        if [ "$PACKAGE_DIR" ]; then
187d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner            echo "Copying $(basename $PACK) to $PACKAGE_DIR..."
188d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner            cp $PACK $PACKAGE_DIR/
189d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        else
190d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner            echo "Unpacking $(basename $PACK) into $NDK_DIR..."
191d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner            unpack_archive $PACK $NDK_DIR
192d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        fi
193d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        fail_panic ""
194d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    done
195d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
196d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    dump "Cleaning up remote machine..."
197d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    run ssh $REMOTE_HOST rm -rf $TMPREMOTE
198d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner}
199d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
200d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfor SYSTEM in $SYSTEMS; do
201d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
202d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # First, build the toolchains
203d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    TOOLCHAIN_FLAGS=$FLAGS
204d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    if [ "$HOST_TAG" = "linux-x86" -a "$SYSTEM" = "windows" ]; then
205d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        TOOLCHAIN_FLAGS=$TOOLCHAIN_FLAGS" --mingw"
206d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    fi
207d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
208d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner     # Should we do a remote build?
209d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    if [ "$SYSTEM" != "$HOST_TAG" ]; then
210d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        case $SYSTEM in
211d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner            darwin-*)
212d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner                if [ "$DARWIN_SSH" ]; then
213d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner                    do_remote_host_build "$SYSTEM" "$ARCH" "$DARWIN_SSH"
214d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner                else
215d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner                    echo "WARNING: Can't build $SYSTEM binaries on this system!"
216d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner                    echo "Consider using the --darwin-ssh option."
217d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner                fi
218d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner                continue
219d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        esac
220d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    fi
221d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
222d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # First, ndk-stack
223d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    echo "Building $SYSTEM ndk-stack"
224d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    run $BUILDTOOLS/build-ndk-stack.sh $TOOLCHAIN_FLAGS
225d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    fail_panic "ndk-stack build failure!"
226d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
2275c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner    echo "Building $SYSTEM ndk-make"
2285c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner    run $BUILDTOOLS/build-host-make.sh $TOOLCHAIN_FLAGS
2295c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner    fail_panic "make build failure!"
2305c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner
2315c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner    echo "Building $SYSTEM ndk-awk"
2325c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner    run $BUILDTOOLS/build-host-awk.sh $TOOLCHAIN_FLAGS
2335c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner    fail_panic "awk build failure!"
2345c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner
2355c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner    echo "Building $SYSTEM ndk-sed"
2365c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner    run $BUILDTOOLS/build-host-sed.sh $TOOLCHAIN_FLAGS
2375c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner    fail_panic "sed build failure!"
2385c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner
239ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner    if [ "$SYSTEM" = "windows" ]; then
240aed73a4495adbed0d4e398598344b68eda1a349fAndrew Hsieh        echo "Building $SYSTEM toolbox"
241ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner        run $BUILDTOOLS/build-host-toolbox.sh $FLAGS
242ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner        fail_panic "Windows toolbox build failure!"
243ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner    fi
244ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner
245d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # Then the toolchains
246d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    for ARCH in $ARCHS; do
247f7e74d4ece211f975f6bfc90132e26a6048b79f1David 'Digit' Turner        TOOLCHAIN_NAMES=$(get_toolchain_name_list_for_arch $ARCH)
248f7e74d4ece211f975f6bfc90132e26a6048b79f1David 'Digit' Turner        if [ -z "$TOOLCHAIN_NAMES" ]; then
249d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner            echo "ERROR: Invalid architecture name: $ARCH"
250d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner            exit 1
251d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        fi
252d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
253f7e74d4ece211f975f6bfc90132e26a6048b79f1David 'Digit' Turner        for TOOLCHAIN_NAME in $TOOLCHAIN_NAMES; do
254f7e74d4ece211f975f6bfc90132e26a6048b79f1David 'Digit' Turner            echo "Building $SYSTEM toolchain for $ARCH architecture: $TOOLCHAIN_NAME"
255f7e74d4ece211f975f6bfc90132e26a6048b79f1David 'Digit' Turner            run $BUILDTOOLS/build-gcc.sh "$SRC_DIR" "$NDK_DIR" $TOOLCHAIN_NAME $TOOLCHAIN_FLAGS
256f7e74d4ece211f975f6bfc90132e26a6048b79f1David 'Digit' Turner            fail_panic "Could not build $TOOLCHAIN_NAME-$SYSTEM!"
257f7e74d4ece211f975f6bfc90132e26a6048b79f1David 'Digit' Turner        done
258d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    done
259d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
2608e58e6b10c9c82e2085420b0e2f4c82d1db9b5c3Logan Chien    # Build llvm and clang
2618e58e6b10c9c82e2085420b0e2f4c82d1db9b5c3Logan Chien    for LLVM_VERSION in $LLVM_VERSION_LIST; do
2628e58e6b10c9c82e2085420b0e2f4c82d1db9b5c3Logan Chien        echo "Building $SYSTEM clang/llvm-$LLVM_VERSION"
2638e58e6b10c9c82e2085420b0e2f4c82d1db9b5c3Logan Chien        run $BUILDTOOLS/build-llvm.sh "$SRC_DIR" "$NDK_DIR" "llvm-$LLVM_VERSION" $TOOLCHAIN_FLAGS
2648e58e6b10c9c82e2085420b0e2f4c82d1db9b5c3Logan Chien        fail_panic "Could not build llvm for $SYSTEM"
2658e58e6b10c9c82e2085420b0e2f4c82d1db9b5c3Logan Chien    done
2668e58e6b10c9c82e2085420b0e2f4c82d1db9b5c3Logan Chien
267d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # We're done for this system
268d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerdone
269d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
270d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ "$PACKAGE_DIR" ]; then
271d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    echo "Done, please look at $PACKAGE_DIR"
272d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerelse
273d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    echo "Done"
274d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
275d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
27609a968eb0b25413ccc5cce15d04216a630e85631Ray Donnellyexit 0
277