1#!/bin/sh 2# 3# Copyright (C) 2013 The Android Open Source Project 4# 5# Licensed under the Apache License, Version 2.0 (the "License"); 6# you may not use this file except in compliance with the License. 7# You may obtain a copy of the License at 8# 9# http://www.apache.org/licenses/LICENSE-2.0 10# 11# Unless required by applicable law or agreed to in writing, software 12# distributed under the License is distributed on an "AS IS" BASIS, 13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14# See the License for the specific language governing permissions and 15# limitations under the License. 16# 17# This shell script is used to rebuild the on-device llvm and mclinker 18# binaries for the Android NDK. 19# 20 21# include common function and variable definitions 22. `dirname $0`/prebuilt-common.sh 23 24PROGRAM_PARAMETERS="<src-dir> <ndk-dir>" 25 26PROGRAM_DESCRIPTION=\ 27"Rebuild LLVM-related on-device binaries for the Android NDK. 28 29Where <src-dir> is the location of toolchain sources, <ndk-dir> is 30the top-level NDK installation path." 31 32RELEASE=`date +%Y%m%d` 33BUILD_OUT=/tmp/ndk-$USER/build/toolchain 34TOOLCHAIN_BUILD_PREFIX="$BUILD_OUT/../prefix" 35ARCHS="$DEFAULT_ARCHS" 36BUILDTOOLS=$ANDROID_NDK_ROOT/build/tools 37 38OPTION_OUT_DIR= 39register_var_option "--out-dir=<path>" OPTION_OUT_DIR "On-device toolchain will be put at <path>" 40 41OPTION_ARCH= 42register_var_option "--arch=<arm,x86,mips>" OPTION_ARCH "Default: all" 43 44OPTION_GCC_VERSION= 45register_var_option "--gcc-version=<version>" OPTION_GCC_VERSION "Specify GCC toolchain version [Default: $DEFAULT_GCC_VERSION]" 46 47register_jobs_option 48 49extract_parameters "$@" 50 51prepare_canadian_toolchain /tmp/ndk-$USER/build 52 53fix_option TOOLCHAIN_BUILD_PREFIX "$OPTION_OUT_DIR" "On-device toolchain will be put at <path>" 54fix_option ARCHS "$OPTION_ARCH" "on-device architecture" 55ARCHS="`commas_to_spaces $ARCHS`" 56setup_default_log_file $BUILD_OUT/config.log 57 58set_parameters () 59{ 60 SRC_DIR="$1" 61 NDK_DIR="$2" 62 TOOLCHAIN="llvm-$DEFAULT_LLVM_VERSION" 63 64 # Check source directory 65 # 66 if [ -z "$SRC_DIR" ] ; then 67 echo "ERROR: Missing source directory parameter. See --help for details." 68 exit 1 69 fi 70 71 if [ ! -d "$SRC_DIR/$TOOLCHAIN/llvm" ] ; then 72 echo "ERROR: Source directory does not contain llvm sources: $SRC_DIR/$TOOLCHAIN/llvm" 73 exit 1 74 fi 75 76 SRC_DIR=`cd $SRC_DIR; pwd` 77 log "Using source directory: $SRC_DIR" 78 79 # Check NDK installation directory 80 # 81 if [ -z "$NDK_DIR" ] ; then 82 echo "ERROR: Missing NDK directory parameter. See --help for details." 83 exit 1 84 fi 85 86 if [ ! -d "$NDK_DIR" ] ; then 87 mkdir -p $NDK_DIR 88 if [ $? != 0 ] ; then 89 echo "ERROR: Could not create target NDK installation path: $NDK_DIR" 90 exit 1 91 fi 92 fi 93 NDK_DIR=`cd $NDK_DIR; pwd` 94 log "Using NDK directory: $NDK_DIR" 95 96 # Check toolchain name 97 # 98 if [ -z "$TOOLCHAIN" ] ; then 99 echo "ERROR: Missing toolchain name parameter. See --help for details." 100 exit 1 101 fi 102} 103 104set_parameters $PARAMETERS 105 106prepare_target_build 107prepare_abi_configure_build 108set_toolchain_ndk $NDK_DIR $TOOLCHAIN 109 110if [ "$MINGW" != "yes" -a "$DARWIN" != "yes" ] ; then 111 dump "Using C compiler: $CC" 112 dump "Using C++ compiler: $CXX" 113fi 114 115rm -rf $BUILD_OUT 116mkdir -p $BUILD_OUT 117 118MAKE_FLAGS= 119if [ "$VERBOSE" = "yes" ]; then 120 MAKE_FLAGS="VERBOSE=1" 121fi 122 123dump "Copy : mclinker source" 124MCLINKER_SRC_DIR=$BUILD_OUT/mclinker 125mkdir -p $MCLINKER_SRC_DIR 126fail_panic "Couldn't create mclinker source directory: $MCLINKER_SRC_DIR" 127 128run copy_directory "$SRC_DIR/mclinker" "$MCLINKER_SRC_DIR" 129fail_panic "Couldn't copy mclinker source: $MCLINKER_SRC_DIR" 130 131cd $MCLINKER_SRC_DIR && run ./autogen.sh 132fail_panic "Couldn't run autogen.sh in $MCLINKER_SRC_DIR" 133 134# Remove aosp stuff away from PATH to prevent configure error. 135aosp="${ANDROID_NDK_ROOT%/}" 136aosp="${aosp%/ndk}" 137aosp_regex="${aosp}/[^:]*:" 138PATH="`echo $PATH | sed -e \"s#$aosp_regex##g\"`" 139export PATH 140 141for arch in $ARCHS; do 142 dump "Rebuild for architecture $arch" 143 144 # configure the toolchain 145 dump "Configure: $TOOLCHAIN toolchain build" 146 LLVM_BUILD_OUT=$BUILD_OUT/llvm/$arch 147 mkdir -p $LLVM_BUILD_OUT && cd $LLVM_BUILD_OUT 148 fail_panic "Couldn't cd into llvm build path: $LLVM_BUILD_OUT" 149 150 toolchain_prefix=`get_default_toolchain_prefix_for_arch $arch` 151 toolchain_name=`get_default_toolchain_name_for_arch $arch` 152 if [ -n "$OPTION_GCC_VERSION" ]; then 153 toolchain_name="${toolchain_name//${DEFAULT_GCC_VERSION}/${OPTION_GCC_VERSION}}" 154 fi 155 extra_configure_flags='' 156 if [ $arch = "arm" ]; then 157 extra_configure_flags='-mthumb -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16' 158 fi 159 160 run $BUILDTOOLS/make-standalone-toolchain.sh \ 161 --toolchain=$toolchain_name \ 162 --stl=stlport \ 163 --arch=$arch \ 164 --system=linux-$HOST_ARCH \ 165 --platform=android-9 \ 166 --install-dir=$BUILD_OUT/ndk-standalone-$arch 167 fail_panic "Couldn't make standalone for $arch" 168 169 mkdir -p $TOOLCHAIN_BUILD_PREFIX/$arch 170 cp -f $BUILD_OUT/ndk-standalone-$arch/$toolchain_prefix/lib/libstlport_shared.so $TOOLCHAIN_BUILD_PREFIX/$arch 171 172 CC=$BUILD_OUT/ndk-standalone-$arch/bin/$toolchain_prefix-gcc 173 CXX=$BUILD_OUT/ndk-standalone-$arch/bin/$toolchain_prefix-g++ 174 export CC CXX 175 176 run $SRC_DIR/$TOOLCHAIN/llvm/configure \ 177 --prefix=$TOOLCHAIN_BUILD_PREFIX/$arch \ 178 --host=$toolchain_prefix \ 179 --with-bug-report-url=$DEFAULT_ISSUE_TRACKER_URL \ 180 --enable-targets=$arch \ 181 --enable-optimized \ 182 --disable-polly \ 183 --with-clang-srcdir=/dev/null \ 184 --enable-shared \ 185 --with-extra-ld-options=-lstlport_shared \ 186 --disable-assertions \ 187 --with-extra-options="$extra_configure_flags" 188 fail_panic "Couldn't configure llvm toolchain for $arch" 189 190 dump "Building : llvm toolchain [this can take a long time]." 191 unset CC CXX # Need for BuildTools 192 export CC CXX 193 run make -j$NUM_JOBS $MAKE_FLAGS 194 fail_panic "Couldn't compile llvm toolchain" 195 196 # Copy binaries what we need 197 mkdir -p $TOOLCHAIN_BUILD_PREFIX/$arch 198 cp -f $LLVM_BUILD_OUT/Release/lib/libLLVM-${DEFAULT_LLVM_VERSION}.so $TOOLCHAIN_BUILD_PREFIX/$arch 199 cp -f $LLVM_BUILD_OUT/Release/bin/le32-none-ndk-translate $TOOLCHAIN_BUILD_PREFIX/$arch 200 cp -f $LLVM_BUILD_OUT/Release/bin/llc $TOOLCHAIN_BUILD_PREFIX/$arch 201 202 # build mclinker only against default the LLVM version, once 203 dump "Configure: mclinker against $TOOLCHAIN" 204 MCLINKER_BUILD_OUT=$MCLINKER_SRC_DIR/build/$arch 205 mkdir -p $MCLINKER_BUILD_OUT && cd $MCLINKER_BUILD_OUT 206 fail_panic "Couldn't cd into mclinker build path: $MCLINKER_BUILD_OUT" 207 208 CC=$BUILD_OUT/ndk-standalone-$arch/bin/$toolchain_prefix-gcc 209 CXX="$BUILD_OUT/ndk-standalone-$arch/bin/$toolchain_prefix-g++ -lstlport_shared" 210 export CC CXX 211 212 run $MCLINKER_SRC_DIR/configure \ 213 --prefix=$TOOLCHAIN_BUILD_PREFIX/$arch \ 214 --with-llvm-config=$LLVM_BUILD_OUT/BuildTools/Release/bin/llvm-config \ 215 --with-llvm-shared-lib=$LLVM_BUILD_OUT/Release/lib/libLLVM-${DEFAULT_LLVM_VERSION}.so \ 216 --enable-targets=$arch \ 217 --host=$toolchain_prefix 218 fail_panic "Couldn't configure mclinker for $arch" 219 220 CXXFLAGS="$CXXFLAGS -fexceptions" # optimized/ScriptParser.cc needs it 221 export CXXFLAGS 222 dump "Building : mclinker" 223 cd $MCLINKER_BUILD_OUT 224 run make -j$NUM_JOBS $MAKE_FLAGS CXXFLAGS="$CXXFLAGS" 225 fail_panic "Couldn't compile mclinker" 226 227 mkdir -p $TOOLCHAIN_BUILD_PREFIX/$arch 228 cp -f $MCLINKER_BUILD_OUT/optimized/ld.mcld $TOOLCHAIN_BUILD_PREFIX/$arch 229 230 # Strip 231 STRIP=$BUILD_OUT/ndk-standalone-$arch/bin/$toolchain_prefix-strip 232 find $TOOLCHAIN_BUILD_PREFIX/$arch -maxdepth 1 -type f -exec $STRIP --strip-all {} \; 233done 234 235TOOLCHAIN_BUILD_PREFIX="`cd $TOOLCHAIN_BUILD_PREFIX; pwd`" 236dump "Done. Output is under $TOOLCHAIN_BUILD_PREFIX" 237rm -rf $BUILD_OUT 238