android_setup.sh revision 6320e8f393539b7a536b32b5a072a474709da5ff
1function exportVar { 2 NAME=$1 3 VALUE=$2 4 echo export $NAME=\"$VALUE\" 5 export $NAME="$VALUE" 6} 7 8SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 9 10# A valid Android SDK installation is required to build the sample app. 11if [ -z "$ANDROID_SDK_ROOT" ]; then 12 ANDROID_TOOL=$(which android 2>/dev/null) 13 if [ -z "$ANDROID_TOOL" ]; then 14 echo "ERROR: Please define ANDROID_SDK_ROOT in your environment to point" 15 echo " to a valid Android SDK installation." 16 return 1 17 fi 18 ANDROID_SDK_ROOT=$(cd $(dirname "$ANDROID_TOOL")/.. && pwd) 19 exportVar ANDROID_SDK_ROOT "$ANDROID_SDK_ROOT" 20fi 21 22# ant is required to be installed on your system and in your PATH 23ant -version &> /dev/null 24if [[ "$?" != "0" ]]; then 25 echo "ERROR: Unable to find ant. Please install it before proceeding." 26 exit 1 27fi 28 29# check to see that gclient sync ran successfully 30THIRD_PARTY_EXTERNAL_DIR=${SCRIPT_DIR}/../third_party/externals 31if [ ! -d "$THIRD_PARTY_EXTERNAL_DIR" ]; then 32 echo "" 33 echo "ERROR: Unable to find the required third_party dependencies needed to build." 34 echo " To fix this add the following line to your .gclient file and run 'gclient sync'" 35 echo " target_os = ['android']" 36 echo "" 37 exit 1; 38fi 39 40# determine the toolchain that we will be using 41API_LEVEL=14 42 43if [[ -z "$NDK_REV" ]]; 44then 45 NDK_REV="8d" 46fi 47 48if [[ -z "$ANDROID_ARCH" ]]; 49then 50 ANDROID_ARCH="arm" 51fi 52 53TOOLCHAIN_DIR=${SCRIPT_DIR}/../toolchains 54if [ $(uname) == "Linux" ]; then 55 echo "Using Linux toolchain." 56 TOOLCHAIN_TYPE=ndk-r$NDK_REV-$ANDROID_ARCH-linux_v$API_LEVEL 57elif [ $(uname) == "Darwin" ]; then 58 echo "Using Mac toolchain." 59 TOOLCHAIN_TYPE=ndk-r$NDK_REV-$ANDROID_ARCH-mac_v$API_LEVEL 60else 61 echo "Could not automatically determine toolchain! Defaulting to Linux." 62 TOOLCHAIN_TYPE=ndk-r$NDK_REV-$ANDROID_ARCH-linux_v$API_LEVEL 63fi 64exportVar ANDROID_TOOLCHAIN ${TOOLCHAIN_DIR}/${TOOLCHAIN_TYPE}/bin 65 66# if the toolchain doesn't exist on your machine then we need to fetch it 67if [ ! -d "$ANDROID_TOOLCHAIN" ]; then 68 # create the toolchain directory if needed 69 if [ ! -d "$TOOLCHAIN_DIR" ]; then 70 mkdir $TOOLCHAIN_DIR 71 fi 72 # enter the toolchain directory then download, unpack, and remove the tarball 73 pushd $TOOLCHAIN_DIR 74 TARBALL=ndk-r$NDK_REV-v$API_LEVEL.tgz 75 76 echo "Downloading $TARBALL ..." 77 ${SCRIPT_DIR}/download_toolchains.py http://chromium-skia-gm.commondatastorage.googleapis.com/android-toolchains/$TARBALL $TOOLCHAIN_DIR/$TARBALL 78 if [[ "$?" != "0" ]]; then 79 echo "ERROR: Unable to download toolchain $TARBALL." 80 exit 1 81 fi 82 83 echo "Untarring $TOOLCHAIN_TYPE from $TARBALL." 84 tar -xzf $TARBALL $TOOLCHAIN_TYPE 85 echo "Removing $TARBALL" 86 rm $TARBALL 87 popd 88fi 89 90if [ ! -d "$ANDROID_TOOLCHAIN" ]; then 91 echo "ERROR: unable to download/setup the required toolchain (${TOOLCHAIN_TYPE})" 92 return 1; 93fi 94 95echo "The build is targeting NDK API level $API_LEVEL for use on Android 4.0 (NDK Revision $NDK_REV) and above" 96 97LS="/bin/ls" # Use directly to avoid any 'ls' alias that might be defined. 98GCC=$($LS $ANDROID_TOOLCHAIN/*-gcc | head -n1) 99if [ -z "$GCC" ]; then 100 echo "ERROR: Could not find Android cross-compiler in: $ANDROID_TOOLCHAIN" 101 return 1 102fi 103 104# Remove the '-gcc' at the end to get the full toolchain prefix 105ANDROID_TOOLCHAIN_PREFIX=${GCC%%-gcc} 106 107exportVar AR "$ANDROID_TOOLCHAIN_PREFIX-ar" 108if [[ -z "$ANDROID_MAKE_CCACHE" ]]; then 109 exportVar CC "$ANDROID_TOOLCHAIN_PREFIX-gcc" 110 exportVar CXX "$ANDROID_TOOLCHAIN_PREFIX-g++" 111 exportVar LINK "$ANDROID_TOOLCHAIN_PREFIX-gcc" 112else 113 exportVar CC "$ANDROID_MAKE_CCACHE $ANDROID_TOOLCHAIN_PREFIX-gcc" 114 exportVar CXX "$ANDROID_MAKE_CCACHE $ANDROID_TOOLCHAIN_PREFIX-g++" 115 exportVar LINK "$ANDROID_MAKE_CCACHE $ANDROID_TOOLCHAIN_PREFIX-gcc" 116fi 117exportVar RANLIB "$ANDROID_TOOLCHAIN_PREFIX-ranlib" 118exportVar OBJCOPY "$ANDROID_TOOLCHAIN_PREFIX-objcopy" 119exportVar STRIP "$ANDROID_TOOLCHAIN_PREFIX-strip" 120 121# Helper function to configure the GYP defines to the appropriate values 122# based on the target device. 123setup_device() { 124 DEFINES="OS=android" 125 DEFINES="${DEFINES} host_os=$(uname -s | sed -e 's/Linux/linux/;s/Darwin/mac/')" 126 DEFINES="${DEFINES} skia_os=android" 127 DEFINES="${DEFINES} android_base=${SCRIPT_DIR}/.." 128 DEFINES="${DEFINES} android_toolchain=${TOOLCHAIN_TYPE}" 129 130 # Setup the build variation depending on the target device 131 TARGET_DEVICE="$1" 132 133 if [ -z "$TARGET_DEVICE" ]; then 134 echo "INFO: no target device type was specified so using the default 'arm_v7'" 135 TARGET_DEVICE="arm_v7" 136 fi 137 138 case $TARGET_DEVICE in 139 nexus_s) 140 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=1 armv7=1 arm_thumb=0" 141 DEFINES="${DEFINES} skia_texture_cache_mb_limit=24" 142 ;; 143 nexus_4 | nexus_7 | nexus_10) 144 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=1 armv7=1 arm_thumb=0" 145 ;; 146 xoom) 147 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=0 armv7=1 arm_thumb=0" 148 ;; 149 galaxy_nexus) 150 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=1 armv7=1 arm_thumb=0" 151 DEFINES="${DEFINES} skia_texture_cache_mb_limit=32" 152 ;; 153 razr_i) 154 DEFINES="${DEFINES} skia_arch_type=x86 skia_arch_width=32" 155 DEFINES="${DEFINES} skia_texture_cache_mb_limit=32" 156 ;; 157 arm_v7) 158 DEFINES="${DEFINES} skia_arch_type=arm arm_neon_optional=1 armv7=1 arm_thumb=0" 159 ;; 160 arm_v7_thumb) 161 DEFINES="${DEFINES} skia_arch_type=arm arm_neon_optional=1 armv7=1 arm_thumb=1" 162 ;; 163 arm) 164 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=0 armv7=0 arm_thumb=0" 165 ;; 166 arm_thumb) 167 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=0 armv7=0 arm_thumb=1" 168 ;; 169 x86) 170 DEFINES="${DEFINES} skia_arch_type=x86 skia_arch_width=32" 171 DEFINES="${DEFINES} skia_texture_cache_mb_limit=32" 172 ;; 173 *) 174 echo -n "ERROR: unknown device specified ($TARGET_DEVICE), valid values: " 175 echo "nexus_[s,4,7,10] xoom galaxy_nexus arm arm_thumb arm_v7 arm_v7_thumb x86" 176 return 1; 177 ;; 178 esac 179 180 echo "The build is targeting the device: $TARGET_DEVICE" 181 182 exportVar GYP_DEFINES "$DEFINES" 183 exportVar SKIA_OUT "out/config/android-${TARGET_DEVICE}" 184} 185 186# Run the setup device command initially as a convenience for the user 187#setup_device 188#echo "** The device has been setup for you by default. If you would like to **" 189#echo "** use a different device then run the setup_device function with the **" 190#echo "** appropriate input. **" 191 192# Use the "android" flavor of the Makefile generator for both Linux and OS X. 193exportVar GYP_GENERATORS "make-android" 194 195# Helper function so that when we run "make" to build for clank it exports 196# the toolchain variables to make. 197#make_android() { 198# CC="$CROSS_CC" CXX="$CROSS_CXX" LINK="$CROSS_LINK" \ 199# AR="$CROSS_AR" RANLIB="$CROSS_RANLIB" \ 200# command make $* 201#} 202