build-host-prebuilts.sh revision 433f2c4e0348d448f4e31efa93537f1784bf47b4
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"
363b28972d8a5a108579496233266fccd69c9d2fe5Andrew Hsieh    # If darwin toolchain exist, build darwin too
373b28972d8a5a108579496233266fccd69c9d2fe5Andrew Hsieh    if [ -f "${DARWIN_TOOLCHAIN}-gcc" ]; then
383b28972d8a5a108579496233266fccd69c9d2fe5Andrew Hsieh        SYSTEMS=$SYSTEMS",darwin-x86"
393b28972d8a5a108579496233266fccd69c9d2fe5Andrew Hsieh    fi
40d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
41d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerCUSTOM_SYSTEMS=
42d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerregister_option "--systems=<names>" do_SYSTEMS "List of host systems to build for"
43d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerdo_SYSTEMS () { CUSTOM_SYSTEMS=true; SYSTEMS=$1; }
44d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
451c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' TurnerARCHS=$DEFAULT_ARCHS
46d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerregister_var_option "--arch=<list>" ARCHS "List of target archs to build for"
47d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
48d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerPACKAGE_DIR=
49d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerregister_var_option "--package-dir=<path>" PACKAGE_DIR "Package toolchain into this directory"
50d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
51d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerDARWIN_SSH=
52d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerregister_var_option "--darwin-ssh=<hostname>" DARWIN_SSH "Generate darwin packages on remote host"
53d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
54d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerNO_GEN_PLATFORMS=
55d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerregister_var_option "--no-gen-platforms" NO_GEN_PLATFORMS "Don't generate platforms/ directory, use existing one"
56d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
578e58e6b10c9c82e2085420b0e2f4c82d1db9b5c3Logan ChienLLVM_VERSION_LIST=$DEFAULT_LLVM_VERSION_LIST
586099deecb0b4f2805135f3670c41be971fbe4e3dAndrew Hsiehregister_var_option "--llvm-version-list=<vers>" LLVM_VERSION_LIST "List of LLVM release versions"
598e58e6b10c9c82e2085420b0e2f4c82d1db9b5c3Logan Chien
60bedf803c145294a8a1970accd860d8a49379f9e7Andrew HsiehCHECK_FLAG=
61bedf803c145294a8a1970accd860d8a49379f9e7Andrew Hsiehdo_check_option () { CHECK_FLAG="--check"; }
62bedf803c145294a8a1970accd860d8a49379f9e7Andrew Hsiehregister_option "--check" do_check_option "Check host prebuilts"
63bedf803c145294a8a1970accd860d8a49379f9e7Andrew Hsieh
64d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerregister_try64_option
65d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
66d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerPROGRAM_PARAMETERS="<toolchain-src-dir>"
67d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerPROGRAM_DESCRIPTION=\
68d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner"This script can be used to rebuild all the host NDK toolchains at once.
69d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerYou need to give it the path to the toolchain source directory, as
70d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerdownloaded by the 'download-toolchain-sources.sh' dev-script."
71d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
72d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerextract_parameters "$@"
73d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
74d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner# Check toolchain source path
75d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerSRC_DIR="$PARAMETERS"
76d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ -z "$SRC_DIR" ]; then
77d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    echo "ERROR: Please provide the path to the toolchain source tree. See --help"
78d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    exit 1
79d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
80d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
81d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ ! -d "$SRC_DIR" ]; then
82d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    echo "ERROR: Not a directory: '$SRC_DIR'"
83d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    exit 1
84d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
85d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
861c663b4a2961e4c9bde69eb740327083bbc92ed8David 'Digit' Turnerif [ ! -f "$SRC_DIR/build/configure" -o ! -d "$SRC_DIR/gcc/gcc-$DEFAULT_GCC_VERSION" ]; then
87612e5d967db47c99996511a9e78f7c29d2dbdc67Nick Kralevich    echo "ERROR: The file $SRC_DIR/build/configure or"
88612e5d967db47c99996511a9e78f7c29d2dbdc67Nick Kralevich    echo "       the directory $SRC_DIR/gcc/gcc-$DEFAULT_GCC_VERSION does not exist"
89612e5d967db47c99996511a9e78f7c29d2dbdc67Nick Kralevich    echo "This is not the top of a toolchain tree: $SRC_DIR"
90d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    echo "You must give the path to a copy of the toolchain source directories"
91d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    echo "created by 'download-toolchain-sources.sh."
92d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    exit 1
93d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
94d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
95d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner# Now we can do the build
96d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerBUILDTOOLS=$ANDROID_NDK_ROOT/build/tools
97d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
98d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ -z "$NO_GEN_PLATFORMS" ]; then
99d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    echo "Preparing the build..."
100d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    run $BUILDTOOLS/gen-platforms.sh --minimal --dst-dir=$NDK_DIR --ndk-dir=$NDK_DIR --arch=$(spaces_to_commas $ARCHS)
101d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    fail_panic "Could not generate minimal sysroot!"
102d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerelse
103d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    if [ ! -d "$NDK_DIR/platforms" ]; then
104d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        echo "ERROR: --no-gen-platforms used but directory missing: $NDK_DIR/platforms"
105d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        exit 1
106d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    fi
107d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
108d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
109d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerSYSTEMS=$(commas_to_spaces $SYSTEMS)
110d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerARCHS=$(commas_to_spaces $ARCHS)
1118e58e6b10c9c82e2085420b0e2f4c82d1db9b5c3Logan ChienLLVM_VERSION_LIST=$(commas_to_spaces $LLVM_VERSION_LIST)
112d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
113d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ "$DARWIN_SSH" -a -z "$CUSTOM_SYSTEMS" ]; then
114d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    SYSTEMS=" darwin-x86"
115d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
116d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
117d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' TurnerFLAGS=
118d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ "$VERBOSE" = "yes" ]; then
119d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    FLAGS=$FLAGS" --verbose"
120d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
121d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ "$VERBOSE2" = "yes" ]; then
122d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    FLAGS=$FLAGS" --verbose"
123d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
124d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ "$TRY64" = "yes" ]; then
12509a968eb0b25413ccc5cce15d04216a630e85631Ray Donnelly    FLAGS=$FLAGS" --try-64"
126d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerelse
127d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    force_32bit_binaries
128d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
129d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ "$PACKAGE_DIR" ]; then
1301c855558c00aaf7f8f86335b605e7b78d8a17172David 'Digit' Turner    mkdir -p "$PACKAGE_DIR"
1311c855558c00aaf7f8f86335b605e7b78d8a17172David 'Digit' Turner    fail_panic "Could not create package directory: $PACKAGE_DIR"
132d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    FLAGS=$FLAGS" --package-dir=$PACKAGE_DIR"
133d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
134d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
135d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerdo_remote_host_build ()
136d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner{
137d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    local SYSTEM="$1"
138d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    local ARCH="$2"
139d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    local REMOTE_HOST="$3"
140d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
141d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # 1/ Copy the NDK toolchain build scripts
142d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # 2/ Copy the toolchain sources/package
143d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # 3/ Ssh to unpack the build scripts, and run them
144d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # 4/ Copy back the generated prebuilt binaries
145d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    #
146d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    dump "Preparing remote build on $REMOTE_HOST..."
147d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
148d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # First try to create a remote temp directory on the remote host
149d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # Do it first so we can fail fast, not after spending time preparing
150d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # large tarballs.
151d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    dump "Creating remote temp directory"
152d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    TMPREMOTE=/tmp/ndk-$USER/darwin-prebuild
153d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    run ssh $REMOTE_HOST "mkdir -p $TMPREMOTE && rm -rf $TMPREMOTE/*"
154d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    fail_panic "Could not create temporary build directory on $REMOTE_HOST"
155d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
156d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # Now, package all the stuff we're going to send in a temporary
157d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # directory here on the machine, except toolchain sources
158d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    TMPDARWIN=$NDK_TMPDIR/darwin  # Where we're going to package stuff
159d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    log "Using temporary work directory: $TMPDARWIN"
160d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    mkdir -p "$TMPDARWIN"
161d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    dump "Prepare NDK build scripts"
162d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    copy_directory "$ANDROID_NDK_ROOT/build" "$TMPDARWIN/ndk/build"
163d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    copy_file_list "$ANDROID_NDK_ROOT" "$TMPDARWIN/ndk" sources/android/libthread_db
164d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    copy_file_list "$ANDROID_NDK_ROOT" "$TMPDARWIN/ndk" "$STLPORT_SUBDIR"
165d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    copy_file_list "$ANDROID_NDK_ROOT" "$TMPDARWIN/ndk" "$GABIXX_SUBDIR"
1665c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner    copy_file_list "$ANDROID_NDK_ROOT" "$TMPDARWIN/ndk" sources/host-tools
167d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    dump "Prepare platforms files"
168d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    copy_directory "$NDK_DIR/platforms" "$TMPDARWIN/ndk/platforms"
169d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    dump "Copying NDK build scripts and platform files to remote..."
170d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    (cd "$TMPDARWIN" && tar czf - ndk) | (ssh $REMOTE_HOST tar xzf - -C $TMPREMOTE)
171d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    fail_panic "Could not copy!"
172d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    rm -rf $TMPDARWIN
173d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
174d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # Copy the toolchain sources
175d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    dump "Copy toolchain sources to remote"
176d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    ssh $REMOTE_HOST mkdir -p $TMPREMOTE/toolchain &&
177d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    (cd "$SRC_DIR" && tar czf - .) | (ssh $REMOTE_HOST tar xzf - -C $TMPREMOTE/toolchain)
178d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    fail_panic "Could not copy toolchain!"
179d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
180d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # Time to run the show :-)
181d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    for ARCH in $(commas_to_spaces $ARCHS); do
182d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        dump "Running remote $ARCH toolchain build..."
183d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        SYSROOT=$TMPREMOTE/ndk/platforms/android-$(get_default_api_level_for_arch $ARCH)/arch-$ARCH
184d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David '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"
185d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        fail_panic "Could not build prebuilt $ARCH toolchain on Darwin!"
186d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    done
187d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # Get the results
188d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    dump "Copying back Darwin prebuilt packages..."
189d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    mkdir -p $TMPDARWIN/packages && rm -rf $TMPDARWIN/packages/*
190d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    run scp $REMOTE_HOST:$TMPREMOTE/packages/*-darwin-* $TMPDARWIN/packages
191d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    fail_panic "Could not grab Darwin packages!"
192d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
193d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    for PACK in $TMPDARWIN/packages/*; do
194d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        if [ "$PACKAGE_DIR" ]; then
195d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner            echo "Copying $(basename $PACK) to $PACKAGE_DIR..."
196d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner            cp $PACK $PACKAGE_DIR/
197d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        else
198d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner            echo "Unpacking $(basename $PACK) into $NDK_DIR..."
199d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner            unpack_archive $PACK $NDK_DIR
200d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        fi
201d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        fail_panic ""
202d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    done
203d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
204d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    dump "Cleaning up remote machine..."
205d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    run ssh $REMOTE_HOST rm -rf $TMPREMOTE
206d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner}
207d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
208d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfor SYSTEM in $SYSTEMS; do
209d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
2103b28972d8a5a108579496233266fccd69c9d2fe5Andrew Hsieh    # Add --mingw/--darwin flag
211d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    TOOLCHAIN_FLAGS=$FLAGS
212bd2fa8bbb88e221220827bbfca6db13016893d35Andrew Hsieh    CANADIAN_BUILD=no
2133b28972d8a5a108579496233266fccd69c9d2fe5Andrew Hsieh    if [ "$HOST_TAG32" = "linux-x86" ]; then
2143b28972d8a5a108579496233266fccd69c9d2fe5Andrew Hsieh        case "$SYSTEM" in
2153b28972d8a5a108579496233266fccd69c9d2fe5Andrew Hsieh            windows)
2163b28972d8a5a108579496233266fccd69c9d2fe5Andrew Hsieh                TOOLCHAIN_FLAGS=$TOOLCHAIN_FLAGS" --mingw"
217bd2fa8bbb88e221220827bbfca6db13016893d35Andrew Hsieh                CANADIAN_BUILD=yes
2183b28972d8a5a108579496233266fccd69c9d2fe5Andrew Hsieh                ;;
219bd2fa8bbb88e221220827bbfca6db13016893d35Andrew Hsieh            darwin-x86)
2203b28972d8a5a108579496233266fccd69c9d2fe5Andrew Hsieh                TOOLCHAIN_FLAGS=$TOOLCHAIN_FLAGS" --darwin"
221bd2fa8bbb88e221220827bbfca6db13016893d35Andrew Hsieh                CANADIAN_BUILD=yes
2223b28972d8a5a108579496233266fccd69c9d2fe5Andrew Hsieh                ;;
2233b28972d8a5a108579496233266fccd69c9d2fe5Andrew Hsieh        esac
224d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    fi
225d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
226524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh    # Should we do a remote build?
227bd2fa8bbb88e221220827bbfca6db13016893d35Andrew Hsieh    if [ "$SYSTEM" != "$HOST_TAG32" -a "$CANADIAN_BUILD" != "yes" ]; then
228d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        case $SYSTEM in
229d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner            darwin-*)
230d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner                if [ "$DARWIN_SSH" ]; then
231d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner                    do_remote_host_build "$SYSTEM" "$ARCH" "$DARWIN_SSH"
232d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner                else
233d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner                    echo "WARNING: Can't build $SYSTEM binaries on this system!"
234d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner                    echo "Consider using the --darwin-ssh option."
235d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner                fi
236d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner                continue
237d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        esac
238d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    fi
239d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
240524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh    # Determin the display system name
241524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh    SYSNAME=$SYSTEM
242524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh    if [ "$TRY64" = "yes" ]; then
243524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh        case $SYSTEM in
244524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh            darwin-x86|linux-x86)
24569e3629c68313d29140e1fdf5c6216a0e8963a22Andrew Hsieh                SYSNAME=${SYSTEM%%x86}x86_64
246524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh                ;;
247524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh            windows)
248524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh                SYSNAME=windows-x86_64
249524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh                ;;
250524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh        esac
251524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh    fi
252d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
253524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh    # First, ndk-stack
254524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh    if [ "$TRY64" != "yes" ]; then
255524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh        # Don't build ndk-stack in 64-bit because unlike other host toolchains
256524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh        # ndk-stack doesn't have separate directories for 32-bit and 64-bit.
257524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh        # 64-bit one will overwrite the 32-bit one
258524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh        echo "Building $SYSNAME ndk-stack"
259524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh        run $BUILDTOOLS/build-ndk-stack.sh $TOOLCHAIN_FLAGS
260524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh        fail_panic "ndk-stack build failure!"
261524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh    fi
262524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh    echo "Building $SYSNAME ndk-make"
2635c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner    run $BUILDTOOLS/build-host-make.sh $TOOLCHAIN_FLAGS
2645c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner    fail_panic "make build failure!"
2655c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner
266524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh    echo "Building $SYSNAME ndk-awk"
2675c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner    run $BUILDTOOLS/build-host-awk.sh $TOOLCHAIN_FLAGS
2685c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner    fail_panic "awk build failure!"
2695c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner
270524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh    echo "Building $SYSNAME ndk-sed"
2715c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner    run $BUILDTOOLS/build-host-sed.sh $TOOLCHAIN_FLAGS
2725c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner    fail_panic "sed build failure!"
2735c1b54f8aa498659c154a5cb909d0e19a9b63e92David 'Digit' Turner
2742641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh    # ToDo: perl in windows
2752641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh    if [ "$SYSTEM" != "windows" ]; then
2762641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh        echo "Building $SYSNAME ndk-perl"
2772641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh        run $BUILDTOOLS/build-host-perl.sh $TOOLCHAIN_FLAGS "$SRC_DIR"
2782641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh        fail_panic "perl build failure!"
2792641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh    fi
2802641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh
281c6798d0201775cd96ae85b67b7653bdc406f2599Lai Wei-Chih    echo "Building $SYSNAME ndk-python"
282433f2c4e0348d448f4e31efa93537f1784bf47b4Andrew Hsieh    run $BUILDTOOLS/build-host-python.sh $TOOLCHAIN_FLAGS "--toolchain-src-dir=$SRC_DIR" "--systems=$SYSTEM" "--force"
283c6798d0201775cd96ae85b67b7653bdc406f2599Lai Wei-Chih    fail_panic "python build failure!"
284c6798d0201775cd96ae85b67b7653bdc406f2599Lai Wei-Chih
285ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner    if [ "$SYSTEM" = "windows" ]; then
286524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh        echo "Building $SYSNAME toolbox"
287ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner        run $BUILDTOOLS/build-host-toolbox.sh $FLAGS
288ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner        fail_panic "Windows toolbox build failure!"
289ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner    fi
290ad1afc5e66ab40201947a3178eba975515b0d73cDavid 'Digit' Turner
291d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # Then the toolchains
292d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    for ARCH in $ARCHS; do
293f7e74d4ece211f975f6bfc90132e26a6048b79f1David 'Digit' Turner        TOOLCHAIN_NAMES=$(get_toolchain_name_list_for_arch $ARCH)
294f7e74d4ece211f975f6bfc90132e26a6048b79f1David 'Digit' Turner        if [ -z "$TOOLCHAIN_NAMES" ]; then
295d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner            echo "ERROR: Invalid architecture name: $ARCH"
296d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner            exit 1
297d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner        fi
298d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
299f7e74d4ece211f975f6bfc90132e26a6048b79f1David 'Digit' Turner        for TOOLCHAIN_NAME in $TOOLCHAIN_NAMES; do
300524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh            echo "Building $SYSNAME toolchain for $ARCH architecture: $TOOLCHAIN_NAME"
301f7e74d4ece211f975f6bfc90132e26a6048b79f1David 'Digit' Turner            run $BUILDTOOLS/build-gcc.sh "$SRC_DIR" "$NDK_DIR" $TOOLCHAIN_NAME $TOOLCHAIN_FLAGS
30269e3629c68313d29140e1fdf5c6216a0e8963a22Andrew Hsieh            fail_panic "Could not build $TOOLCHAIN_NAME-$SYSNAME!"
303f7e74d4ece211f975f6bfc90132e26a6048b79f1David 'Digit' Turner        done
304d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    done
305d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
3068e58e6b10c9c82e2085420b0e2f4c82d1db9b5c3Logan Chien    # Build llvm and clang
307ddeed0481172250935ed47f906905629450d981bAndrew Hsieh    POLLY_FLAGS=
308ddeed0481172250935ed47f906905629450d981bAndrew Hsieh    if [ "$TRY64" != "yes" -a "$SYSTEM" != "windows" ]; then
309ddeed0481172250935ed47f906905629450d981bAndrew Hsieh        POLLY_FLAGS="--with-polly"
310ddeed0481172250935ed47f906905629450d981bAndrew Hsieh    fi
3118e58e6b10c9c82e2085420b0e2f4c82d1db9b5c3Logan Chien    for LLVM_VERSION in $LLVM_VERSION_LIST; do
312524869abdbd228ccb916cc9a4902550dd6382ba2Andrew Hsieh        echo "Building $SYSNAME clang/llvm-$LLVM_VERSION"
313bedf803c145294a8a1970accd860d8a49379f9e7Andrew Hsieh        run $BUILDTOOLS/build-llvm.sh "$SRC_DIR" "$NDK_DIR" "llvm-$LLVM_VERSION" $TOOLCHAIN_FLAGS $POLLY_FLAGS $CHECK_FLAG
31469e3629c68313d29140e1fdf5c6216a0e8963a22Andrew Hsieh        fail_panic "Could not build llvm for $SYSNAME"
3158e58e6b10c9c82e2085420b0e2f4c82d1db9b5c3Logan Chien    done
3168e58e6b10c9c82e2085420b0e2f4c82d1db9b5c3Logan Chien
31769e3629c68313d29140e1fdf5c6216a0e8963a22Andrew Hsieh    # Deploy ld.mcld
31869e3629c68313d29140e1fdf5c6216a0e8963a22Andrew Hsieh    $PROGDIR/deploy-host-mcld.sh --package-dir=$PACKAGE_DIR --systems=$SYSNAME
31969e3629c68313d29140e1fdf5c6216a0e8963a22Andrew Hsieh    fail_panic "Could not deploy ld.mcld for $SYSNAME"
32069e3629c68313d29140e1fdf5c6216a0e8963a22Andrew Hsieh
321d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    # We're done for this system
322d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerdone
323d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
3248fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh# Build tools common to all system
3258fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsiehrun $BUILDTOOLS/build-analyzer.sh "$SRC_DIR" "$NDK_DIR" "llvm-$DEFAULT_LLVM_VERSION" --package-dir="$PACKAGE_DIR"
3268fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh
327d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerif [ "$PACKAGE_DIR" ]; then
328d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    echo "Done, please look at $PACKAGE_DIR"
329d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerelse
330d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner    echo "Done"
331d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turnerfi
332d9bb7ebc331f10c98f5c5513fc8d9e5daf12c6e6David 'Digit' Turner
33309a968eb0b25413ccc5cce15d04216a630e85631Ray Donnellyexit 0
334