android_setup.sh revision 52f0297aafc1e267fda6e612f168a9fe5bc62784
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 DEFINES="${DEFINES} skia_shared_lib=1" 130 131 # Setup the build variation depending on the target device 132 TARGET_DEVICE="$1" 133 134 if [ -z "$TARGET_DEVICE" ]; then 135 echo "INFO: no target device type was specified so using the default 'arm_v7'" 136 TARGET_DEVICE="arm_v7" 137 fi 138 139 case $TARGET_DEVICE in 140 nexus_s) 141 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=1 armv7=1 arm_thumb=0" 142 DEFINES="${DEFINES} skia_texture_cache_mb_limit=24" 143 ;; 144 nexus_4 | nexus_7 | nexus_10) 145 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=1 armv7=1 arm_thumb=0" 146 ;; 147 xoom) 148 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=0 armv7=1 arm_thumb=0" 149 ;; 150 galaxy_nexus) 151 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=1 armv7=1 arm_thumb=0" 152 DEFINES="${DEFINES} skia_texture_cache_mb_limit=32" 153 ;; 154 razr_i) 155 DEFINES="${DEFINES} skia_arch_type=x86 skia_arch_width=32" 156 DEFINES="${DEFINES} skia_texture_cache_mb_limit=32" 157 ;; 158 arm_v7) 159 DEFINES="${DEFINES} skia_arch_type=arm arm_neon_optional=1 armv7=1 arm_thumb=0" 160 ;; 161 arm_v7_thumb) 162 DEFINES="${DEFINES} skia_arch_type=arm arm_neon_optional=1 armv7=1 arm_thumb=1" 163 ;; 164 arm) 165 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=0 armv7=0 arm_thumb=0" 166 ;; 167 arm_thumb) 168 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=0 armv7=0 arm_thumb=1" 169 ;; 170 x86) 171 DEFINES="${DEFINES} skia_arch_type=x86 skia_arch_width=32" 172 DEFINES="${DEFINES} skia_texture_cache_mb_limit=32" 173 ;; 174 *) 175 echo -n "ERROR: unknown device specified ($TARGET_DEVICE), valid values: " 176 echo "nexus_[s,4,7,10] xoom galaxy_nexus arm arm_thumb arm_v7 arm_v7_thumb x86" 177 return 1; 178 ;; 179 esac 180 181 echo "The build is targeting the device: $TARGET_DEVICE" 182 183 exportVar GYP_DEFINES "$DEFINES" 184 exportVar SKIA_OUT "out/config/android-${TARGET_DEVICE}" 185} 186 187# Run the setup device command initially as a convenience for the user 188#setup_device 189#echo "** The device has been setup for you by default. If you would like to **" 190#echo "** use a different device then run the setup_device function with the **" 191#echo "** appropriate input. **" 192 193# Use the "android" flavor of the Makefile generator for both Linux and OS X. 194exportVar GYP_GENERATORS "make-android" 195 196# Helper function so that when we run "make" to build for clank it exports 197# the toolchain variables to make. 198#make_android() { 199# CC="$CROSS_CC" CXX="$CROSS_CXX" LINK="$CROSS_LINK" \ 200# AR="$CROSS_AR" RANLIB="$CROSS_RANLIB" \ 201# command make $* 202#} 203