# Copyright 2015 Google Inc. # # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. #!/bin/bash # # setup_toolchain.sh: Sets toolchain environment variables used by other scripts. # Fail-fast if anything in the script fails. set -e # check that the preconditions for this script are met if [ $(type -t verbose) != 'function' ]; then echo "ERROR: The verbose function is expected to be defined" return 1 fi if [ $(type -t exportVar) != 'function' ]; then echo "ERROR: The exportVar function is expected to be defined" return 1 fi if [ $(type -t absPath) != 'function' ]; then echo "ERROR: The absPath function is expected to be defined" return 1 fi if [ -z "$SCRIPT_DIR" ]; then echo "ERROR: The SCRIPT_DIR variable is expected to be defined" return 1 fi function default_toolchain() { TOOLCHAINS=${SCRIPT_DIR}/../toolchains ANDROID_ARCH=${ANDROID_ARCH-arm} NDK=r12b if [[ $ANDROID_ARCH == *64* ]]; then API=21 # Android 5.0 else API=14 # Android 4.0 fi if [ "$SKIA_VULKAN" == "true" ]; then API=24 # Android N Preview fi TOOLCHAIN=$ANDROID_ARCH-$NDK-$API HOST=`uname | tr '[A-Z]' '[a-z]'` exportVar ANDROID_TOOLCHAIN "${TOOLCHAINS}/${TOOLCHAIN}" if [ ! -d "$ANDROID_TOOLCHAIN" ]; then mkdir -p $TOOLCHAINS pushd $TOOLCHAINS curl -o $NDK.zip https://dl.google.com/android/repository/android-ndk-$NDK-$HOST-x86_64.zip unzip $NDK.zip UNZIPPED=android-ndk-$NDK ./$UNZIPPED/build/tools/make-standalone-toolchain.sh \ --use-llvm \ --arch=$ANDROID_ARCH \ --platform=android-$API \ --install_dir=$TOOLCHAIN cp $UNZIPPED/prebuilt/android-$ANDROID_ARCH/gdbserver/gdbserver $TOOLCHAIN cp -r $UNZIPPED/prebuilt/${HOST}-x86_64 $TOOLCHAIN/host_prebuilt rm $NDK.zip rm -rf $UNZIPPED popd fi verbose "Targeting NDK API $API (NDK Revision $NDK)" } #check to see if the toolchain has been defined and if not setup the default toolchain if [ -z "$ANDROID_TOOLCHAIN" ]; then default_toolchain if [ ! -d "$ANDROID_TOOLCHAIN" ]; then echo "ERROR: unable to download/setup the required toolchain (${ANDROID_TOOLCHAIN})" return 1; fi fi GCC=$(command ls $ANDROID_TOOLCHAIN/bin/*-gcc | head -n1) if [ -z "$GCC" ]; then echo "ERROR: Could not find Android cross-compiler in: ${ANDROID_TOOLCHAIN}/bin" return 1 fi # Remove the '-gcc' at the end to get the full toolchain prefix ANDROID_TOOLCHAIN_PREFIX=${GCC%%-gcc} CCACHE=${ANDROID_MAKE_CCACHE-$(which ccache || true)} # Cross compiling Android on Mac is not currently supported by gyp. # It doesn't appear to be supported on Windows either. # As of now, we will only support cross compiling on Linux. # libjpeg-turbo assembly code for x86 and x86-64 Android devices # must be disabled for Android on non-Linux platforms because # of this issue. We still support compiling on Mac and other # variants for local development, but shipping versions of Skia # should be compiled on Linux for performance reasons. # TODO (msarett): Collect more information about this. if [ $HOST == "linux" ]; then if [ "$USE_CLANG" != "true" ]; then exportVar CC_target "$CCACHE $ANDROID_TOOLCHAIN_PREFIX-gcc" exportVar CXX_target "$CCACHE $ANDROID_TOOLCHAIN_PREFIX-g++" exportVar LINK_target "$CCACHE $ANDROID_TOOLCHAIN_PREFIX-gcc" exportVar CC_host "$CCACHE cc" exportVar CXX_host "$CCACHE c++" exportVar LINK_host "$CCACHE cc" else exportVar CC_target "$CCACHE $ANDROID_TOOLCHAIN_PREFIX-clang" exportVar CXX_target "$CCACHE $ANDROID_TOOLCHAIN_PREFIX-clang++" exportVar LINK_target "$CCACHE $ANDROID_TOOLCHAIN_PREFIX-clang" exportVar CC_host "$CCACHE clang" exportVar CXX_host "$CCACHE clang++" exportVar LINK_host "$CCACHE clang" fi exportVar AR_target "$ANDROID_TOOLCHAIN_PREFIX-ar" exportVar RANLIB_target "$ANDROID_TOOLCHAIN_PREFIX-ranlib" exportVar OBJCOPY_target "$ANDROID_TOOLCHAIN_PREFIX-objcopy" exportVar STRIP_target "$ANDROID_TOOLCHAIN_PREFIX-strip" exportVar AR_host "ar" exportVar RANLIB_host "ranlib" exportVar OBJCOPY_host "objcopy" exportVar STRIP_host "strip" else if [ "$USE_CLANG" != "true" ]; then exportVar CC "$CCACHE $ANDROID_TOOLCHAIN_PREFIX-gcc" exportVar CXX "$CCACHE $ANDROID_TOOLCHAIN_PREFIX-g++" exportVar LINK "$CCACHE $ANDROID_TOOLCHAIN_PREFIX-gcc" else exportVar CC "$CCACHE $ANDROID_TOOLCHAIN_PREFIX-clang" exportVar CXX "$CCACHE $ANDROID_TOOLCHAIN_PREFIX-clang++" exportVar LINK "$CCACHE $ANDROID_TOOLCHAIN_PREFIX-clang" fi exportVar AR "$ANDROID_TOOLCHAIN_PREFIX-ar" exportVar RANLIB "$ANDROID_TOOLCHAIN_PREFIX-ranlib" exportVar OBJCOPY "$ANDROID_TOOLCHAIN_PREFIX-objcopy" exportVar STRIP "$ANDROID_TOOLCHAIN_PREFIX-strip" fi # GCC doesn't seem to put this on its include path when setting -march=mips32r2. # Oddly, it does for mips32, mips32r3, and mips32r5, but it's gone again for mips32r6. # Clang's fine. if [ "$USE_CLANG" != "true" ]; then if [ "$ANDROID_ARCH" == "mips" ]; then exportVar CXX_target "$CXX_target -isystem $ANDROID_TOOLCHAIN/include/c++/4.9.x/mipsel-linux-android" fi fi # Create symlinks for nm & readelf and add them to the path so that the ninja # build uses them instead of attempting to use the one on the system. # This is required to build using ninja on a Mac. if [ $HOST == "darwin" ]; then ln -sf $ANDROID_TOOLCHAIN_PREFIX-nm $ANDROID_TOOLCHAIN/bin/nm ln -sf $ANDROID_TOOLCHAIN_PREFIX-readelf $ANDROID_TOOLCHAIN/bin/readelf ln -sf $ANDROID_TOOLCHAIN_PREFIX-as $ANDROID_TOOLCHAIN/bin/as fi exportVar PATH ${ANDROID_TOOLCHAIN}/bin:${PATH}