11bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu#!/bin/sh
21bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu#
31bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu# Copyright (C) 2013 The Android Open Source Project
41bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu#
51bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu# Licensed under the Apache License, Version 2.0 (the "License");
61bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu# you may not use this file except in compliance with the License.
71bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu# You may obtain a copy of the License at
81bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu#
91bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu#      http://www.apache.org/licenses/LICENSE-2.0
101bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu#
111bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu# Unless required by applicable law or agreed to in writing, software
121bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu# distributed under the License is distributed on an "AS IS" BASIS,
131bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu# See the License for the specific language governing permissions and
151bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu# limitations under the License.
161bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu#
171bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu#  This shell script is used to rebuild the on-device llvm and mclinker
181bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu#  binaries for the Android NDK.
191bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu#
201bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
211bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu# include common function and variable definitions
221bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu. `dirname $0`/prebuilt-common.sh
231bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
241bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan GuPROGRAM_PARAMETERS="<src-dir> <ndk-dir>"
251bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
261bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan GuPROGRAM_DESCRIPTION=\
271bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu"Rebuild LLVM-related on-device binaries for the Android NDK.
281bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
291bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan GuWhere <src-dir> is the location of toolchain sources, <ndk-dir> is
301bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Guthe top-level NDK installation path."
311bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
321bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan GuRELEASE=`date +%Y%m%d`
331bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan GuBUILD_OUT=/tmp/ndk-$USER/build/toolchain
341bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan GuTOOLCHAIN_BUILD_PREFIX="$BUILD_OUT/../prefix"
351bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan GuARCHS="$DEFAULT_ARCHS"
361bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan GuBUILDTOOLS=$ANDROID_NDK_ROOT/build/tools
371bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
381bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan GuOPTION_OUT_DIR=
391bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Guregister_var_option "--out-dir=<path>" OPTION_OUT_DIR "On-device toolchain will be put at <path>"
401bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
411bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan GuOPTION_ARCH=
421bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Guregister_var_option "--arch=<arm,x86,mips>" OPTION_ARCH "Default: all"
431bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
441bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan GuOPTION_GCC_VERSION=
451bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Guregister_var_option "--gcc-version=<version>" OPTION_GCC_VERSION "Specify GCC toolchain version [Default: $DEFAULT_GCC_VERSION]"
461bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
471bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Guregister_jobs_option
481bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
491bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Guextract_parameters "$@"
501bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
511bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Guprepare_canadian_toolchain /tmp/ndk-$USER/build
521bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
531bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gufix_option TOOLCHAIN_BUILD_PREFIX "$OPTION_OUT_DIR" "On-device toolchain will be put at <path>"
541bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gufix_option ARCHS "$OPTION_ARCH" "on-device architecture"
551bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan GuARCHS="`commas_to_spaces $ARCHS`"
561bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gusetup_default_log_file $BUILD_OUT/config.log
571bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
581bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Guset_parameters ()
591bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu{
601bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    SRC_DIR="$1"
611bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    NDK_DIR="$2"
621bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    TOOLCHAIN="llvm-$DEFAULT_LLVM_VERSION"
631bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
641bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    # Check source directory
651bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    #
661bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    if [ -z "$SRC_DIR" ] ; then
671bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu        echo "ERROR: Missing source directory parameter. See --help for details."
681bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu        exit 1
691bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    fi
701bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
711bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    if [ ! -d "$SRC_DIR/$TOOLCHAIN/llvm" ] ; then
721bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu        echo "ERROR: Source directory does not contain llvm sources: $SRC_DIR/$TOOLCHAIN/llvm"
731bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu        exit 1
741bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    fi
751bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
761bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    SRC_DIR=`cd $SRC_DIR; pwd`
771bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    log "Using source directory: $SRC_DIR"
781bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
791bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    # Check NDK installation directory
801bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    #
811bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    if [ -z "$NDK_DIR" ] ; then
821bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu        echo "ERROR: Missing NDK directory parameter. See --help for details."
831bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu        exit 1
841bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    fi
851bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
861bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    if [ ! -d "$NDK_DIR" ] ; then
871bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu        mkdir -p $NDK_DIR
881bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu        if [ $? != 0 ] ; then
891bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu            echo "ERROR: Could not create target NDK installation path: $NDK_DIR"
901bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu            exit 1
911bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu        fi
921bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    fi
931bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    NDK_DIR=`cd $NDK_DIR; pwd`
941bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    log "Using NDK directory: $NDK_DIR"
951bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
961bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    # Check toolchain name
971bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    #
981bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    if [ -z "$TOOLCHAIN" ] ; then
991bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu        echo "ERROR: Missing toolchain name parameter. See --help for details."
1001bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu        exit 1
1011bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    fi
1021bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu}
1031bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
1041bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Guset_parameters $PARAMETERS
1051bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
1061bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Guprepare_target_build
1071bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Guprepare_abi_configure_build
1081bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Guset_toolchain_ndk $NDK_DIR $TOOLCHAIN
1091bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
1101bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Guif [ "$MINGW" != "yes" -a "$DARWIN" != "yes" ] ; then
1111bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    dump "Using C compiler: $CC"
1121bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    dump "Using C++ compiler: $CXX"
1131bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gufi
1141bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
1151bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gurm -rf $BUILD_OUT
1161bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gumkdir -p $BUILD_OUT
1171bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
1181bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan GuMAKE_FLAGS=
1191bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Guif [ "$VERBOSE" = "yes" ]; then
1201bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    MAKE_FLAGS="VERBOSE=1"
1211bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gufi
1221bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
1231bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gudump "Copy     : mclinker source"
1241bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan GuMCLINKER_SRC_DIR=$BUILD_OUT/mclinker
1251bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gumkdir -p $MCLINKER_SRC_DIR
1261bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gufail_panic "Couldn't create mclinker source directory: $MCLINKER_SRC_DIR"
1271bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
1281bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gurun copy_directory "$SRC_DIR/mclinker" "$MCLINKER_SRC_DIR"
1291bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gufail_panic "Couldn't copy mclinker source: $MCLINKER_SRC_DIR"
1301bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
1311bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gucd $MCLINKER_SRC_DIR && run ./autogen.sh
1321bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gufail_panic "Couldn't run autogen.sh in $MCLINKER_SRC_DIR"
1331bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
1347da9ad73c2566f509b2f96faba9e30990107b1d7WenHan Gu# Remove aosp stuff away from PATH to prevent configure error.
1357da9ad73c2566f509b2f96faba9e30990107b1d7WenHan Guaosp="${ANDROID_NDK_ROOT%/}"
1367da9ad73c2566f509b2f96faba9e30990107b1d7WenHan Guaosp="${aosp%/ndk}"
1377da9ad73c2566f509b2f96faba9e30990107b1d7WenHan Guaosp_regex="${aosp}/[^:]*:"
1387da9ad73c2566f509b2f96faba9e30990107b1d7WenHan GuPATH="`echo $PATH | sed -e \"s#$aosp_regex##g\"`"
1397da9ad73c2566f509b2f96faba9e30990107b1d7WenHan Guexport PATH
1401bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
1411bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gufor arch in $ARCHS; do
1421bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  dump "Rebuild for architecture $arch"
1431bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
1441bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  # configure the toolchain
1451bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  dump "Configure: $TOOLCHAIN toolchain build"
1461bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  LLVM_BUILD_OUT=$BUILD_OUT/llvm/$arch
1471bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  mkdir -p $LLVM_BUILD_OUT && cd $LLVM_BUILD_OUT
1481bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  fail_panic "Couldn't cd into llvm build path: $LLVM_BUILD_OUT"
1491bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
1501bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  toolchain_prefix=`get_default_toolchain_prefix_for_arch $arch`
1511bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  toolchain_name=`get_default_toolchain_name_for_arch $arch`
1521bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  if [ -n "$OPTION_GCC_VERSION" ]; then
1531bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    toolchain_name="${toolchain_name//${DEFAULT_GCC_VERSION}/${OPTION_GCC_VERSION}}"
1541bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  fi
1551bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  extra_configure_flags=''
1561bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  if [ $arch = "arm" ]; then
1571bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    extra_configure_flags='-mthumb -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16'
1581bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  fi
1591bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
1601bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  run $BUILDTOOLS/make-standalone-toolchain.sh \
1611bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --toolchain=$toolchain_name \
1621bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --stl=stlport \
1631bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --arch=$arch \
1641bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --system=linux-$HOST_ARCH \
1651bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --platform=android-9 \
1661bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --install-dir=$BUILD_OUT/ndk-standalone-$arch
1671bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  fail_panic "Couldn't make standalone for $arch"
1681bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
1691bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  mkdir -p $TOOLCHAIN_BUILD_PREFIX/$arch
1701bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  cp -f $BUILD_OUT/ndk-standalone-$arch/$toolchain_prefix/lib/libstlport_shared.so $TOOLCHAIN_BUILD_PREFIX/$arch
1711bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
1721bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  CC=$BUILD_OUT/ndk-standalone-$arch/bin/$toolchain_prefix-gcc
1731bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  CXX=$BUILD_OUT/ndk-standalone-$arch/bin/$toolchain_prefix-g++
1741bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  export CC CXX
1751bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
1761bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  run $SRC_DIR/$TOOLCHAIN/llvm/configure \
1771bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --prefix=$TOOLCHAIN_BUILD_PREFIX/$arch \
1781bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --host=$toolchain_prefix \
1791bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --with-bug-report-url=$DEFAULT_ISSUE_TRACKER_URL \
1801bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --enable-targets=$arch \
1811bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --enable-optimized \
1821bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --disable-polly \
1831bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --with-clang-srcdir=/dev/null \
1841bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --enable-shared \
1851bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --with-extra-ld-options=-lstlport_shared \
1861bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --disable-assertions \
1871bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --with-extra-options="$extra_configure_flags"
1881bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  fail_panic "Couldn't configure llvm toolchain for $arch"
1891bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
1901bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  dump "Building : llvm toolchain [this can take a long time]."
1911bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  unset CC CXX  # Need for BuildTools
1921bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  export CC CXX
1931bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  run make -j$NUM_JOBS $MAKE_FLAGS
1941bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  fail_panic "Couldn't compile llvm toolchain"
1951bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
1961bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  # Copy binaries what we need
1971bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  mkdir -p $TOOLCHAIN_BUILD_PREFIX/$arch
1983263b7e0913ce6b5098f5e4b8bbf2e5e4785bad8WenHan Gu  cp -f $LLVM_BUILD_OUT/Release/lib/libLLVM-${DEFAULT_LLVM_VERSION}.so $TOOLCHAIN_BUILD_PREFIX/$arch
1991bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  cp -f $LLVM_BUILD_OUT/Release/bin/le32-none-ndk-translate $TOOLCHAIN_BUILD_PREFIX/$arch
2001bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  cp -f $LLVM_BUILD_OUT/Release/bin/llc $TOOLCHAIN_BUILD_PREFIX/$arch
2011bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
2021bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  # build mclinker only against default the LLVM version, once
2031bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  dump "Configure: mclinker against $TOOLCHAIN"
2041bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  MCLINKER_BUILD_OUT=$MCLINKER_SRC_DIR/build/$arch
2051bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  mkdir -p $MCLINKER_BUILD_OUT && cd $MCLINKER_BUILD_OUT
2061bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  fail_panic "Couldn't cd into mclinker build path: $MCLINKER_BUILD_OUT"
2071bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
2081bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  CC=$BUILD_OUT/ndk-standalone-$arch/bin/$toolchain_prefix-gcc
2091bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  CXX="$BUILD_OUT/ndk-standalone-$arch/bin/$toolchain_prefix-g++ -lstlport_shared"
2101bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  export CC CXX
2111bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
2121bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  run $MCLINKER_SRC_DIR/configure \
2131bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --prefix=$TOOLCHAIN_BUILD_PREFIX/$arch \
2141bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --with-llvm-config=$LLVM_BUILD_OUT/BuildTools/Release/bin/llvm-config \
2153263b7e0913ce6b5098f5e4b8bbf2e5e4785bad8WenHan Gu    --with-llvm-shared-lib=$LLVM_BUILD_OUT/Release/lib/libLLVM-${DEFAULT_LLVM_VERSION}.so \
2161bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --enable-targets=$arch \
2171bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu    --host=$toolchain_prefix
2181bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  fail_panic "Couldn't configure mclinker for $arch"
2191bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
220a265bd1090e03082f19ed03cfda0b339e0c2dbf5WenHan Gu  CXXFLAGS="$CXXFLAGS -fexceptions"  # optimized/ScriptParser.cc needs it
221a265bd1090e03082f19ed03cfda0b339e0c2dbf5WenHan Gu  export CXXFLAGS
2221bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  dump "Building : mclinker"
2231bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  cd $MCLINKER_BUILD_OUT
224a265bd1090e03082f19ed03cfda0b339e0c2dbf5WenHan Gu  run make -j$NUM_JOBS $MAKE_FLAGS CXXFLAGS="$CXXFLAGS"
2251bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  fail_panic "Couldn't compile mclinker"
2261bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
2271bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  mkdir -p $TOOLCHAIN_BUILD_PREFIX/$arch
2281bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  cp -f $MCLINKER_BUILD_OUT/optimized/ld.mcld $TOOLCHAIN_BUILD_PREFIX/$arch
2291bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
2301bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  # Strip
2311bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  STRIP=$BUILD_OUT/ndk-standalone-$arch/bin/$toolchain_prefix-strip
2321bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu  find $TOOLCHAIN_BUILD_PREFIX/$arch -maxdepth 1 -type f -exec $STRIP --strip-all {} \;
2331bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gudone
2341bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gu
2351bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan GuTOOLCHAIN_BUILD_PREFIX="`cd $TOOLCHAIN_BUILD_PREFIX; pwd`"
2361bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gudump "Done. Output is under $TOOLCHAIN_BUILD_PREFIX"
2371bb27f0bcc500835368b42781f78b0c1fa9c2561WenHan Gurm -rf $BUILD_OUT
238