1 1.1 christos #!/usr/bin/env bash 2 1.1 christos 3 1.1 christos # ==================================================================== 4 1.1 christos # Sets the cross compile environment for Android 5 1.1 christos # 6 1.1 christos # Based upon OpenSSL's setenv-android.sh by TH, JW, and SM. 7 1.1 christos # Heavily modified by JWW for Crypto++. 8 1.1 christos # Updated by Skycoder42 for current recommendations for Android. 9 1.1 christos # Modified by JWW for Unbound. 10 1.1 christos # ==================================================================== 11 1.1 christos 12 1.1 christos ######################################### 13 1.1 christos ##### Some validation ##### 14 1.1 christos ######################################### 15 1.1 christos 16 1.1 christos if [ -z "$ANDROID_API" ]; then 17 1.1 christos echo "ANDROID_API is not set. Please set it" 18 1.1 christos [[ "$0" = "${BASH_SOURCE[0]}" ]] && exit 1 || return 1 19 1.1 christos fi 20 1.1 christos 21 1.1 christos if [ -z "$ANDROID_CPU" ]; then 22 1.1 christos echo "ANDROID_CPU is not set. Please set it" 23 1.1 christos [[ "$0" = "${BASH_SOURCE[0]}" ]] && exit 1 || return 1 24 1.1 christos fi 25 1.1 christos 26 1.1 christos if [ ! -d "$ANDROID_NDK_ROOT" ]; then 27 1.1 christos echo "ERROR: ANDROID_NDK_ROOT is not a valid path. Please set it." 28 1.1 christos echo "NDK root is $ANDROID_NDK_ROOT" 29 1.1 christos [ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1 30 1.1 christos fi 31 1.1 christos 32 1.1 christos # cryptest-android.sh may run this script without sourcing. 33 1.1 christos if [ "$0" = "${BASH_SOURCE[0]}" ]; then 34 1.1 christos echo "setenv-android.sh is usually sourced, but not this time." 35 1.1 christos fi 36 1.1 christos 37 1.1 christos ##################################################################### 38 1.1 christos 39 1.1 christos # Need to set THIS_HOST to darwin-x86_64, linux-x86_64, 40 1.1 christos # windows, or windows-x86_64 41 1.1 christos 42 1.1 christos if [[ "$(uname -s | grep -i -c darwin)" -ne 0 ]]; then 43 1.1 christos THIS_HOST=darwin-x86_64 44 1.1 christos elif [[ "$(uname -s | grep -i -c linux)" -ne 0 ]]; then 45 1.1 christos THIS_HOST=linux-x86_64 46 1.1 christos else 47 1.1 christos echo "ERROR: Unknown host" 48 1.1 christos [ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1 49 1.1 christos fi 50 1.1 christos 51 1.1 christos ANDROID_TOOLCHAIN="$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$THIS_HOST/bin" 52 1.1 christos ANDROID_SYSROOT="$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$THIS_HOST/sysroot" 53 1.1 christos 54 1.1 christos # Error checking 55 1.1 christos if [ ! -d "$ANDROID_TOOLCHAIN" ]; then 56 1.1 christos echo "ERROR: ANDROID_TOOLCHAIN is not a valid path. Please set it." 57 1.1 christos echo "Path is $ANDROID_TOOLCHAIN" 58 1.1 christos [ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1 59 1.1 christos fi 60 1.1 christos 61 1.1 christos # Error checking 62 1.1 christos if [ ! -d "$ANDROID_SYSROOT" ]; then 63 1.1 christos echo "ERROR: ANDROID_SYSROOT is not a valid path. Please set it." 64 1.1 christos echo "Path is $ANDROID_SYSROOT" 65 1.1 christos [ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1 66 1.1 christos fi 67 1.1 christos 68 1.1 christos ##################################################################### 69 1.1 christos 70 1.1 christos THE_ARCH=$(tr '[:upper:]' '[:lower:]' <<< "$ANDROID_CPU") 71 1.1 christos 72 1.1 christos # https://developer.android.com/ndk/guides/abis.html 73 1.1 christos case "$THE_ARCH" in 74 1.1 christos armv7*|armeabi*) 75 1.1 christos CC="armv7a-linux-androideabi$ANDROID_API-clang" 76 1.1 christos CXX="armv7a-linux-androideabi$ANDROID_API-clang++" 77 1.1 christos LD="arm-linux-androideabi-ld" 78 1.1 christos AS="arm-linux-androideabi-as" 79 1.1 christos AR="arm-linux-androideabi-ar" 80 1.1 christos RANLIB="arm-linux-androideabi-ranlib" 81 1.1 christos STRIP="arm-linux-androideabi-strip" 82 1.1 christos 83 1.1 christos CFLAGS="-march=armv7-a -mthumb -mfloat-abi=softfp -funwind-tables -fexceptions" 84 1.1 christos CXXFLAGS="-march=armv7-a -mthumb -mfloat-abi=softfp -funwind-tables -fexceptions -frtti" 85 1.1 christos ;; 86 1.1 christos 87 1.1 christos armv8*|aarch64|arm64*) 88 1.1 christos CC="aarch64-linux-android$ANDROID_API-clang" 89 1.1 christos CXX="aarch64-linux-android$ANDROID_API-clang++" 90 1.1 christos LD="aarch64-linux-android-ld" 91 1.1 christos AS="aarch64-linux-android-as" 92 1.1 christos AR="aarch64-linux-android-ar" 93 1.1 christos RANLIB="aarch64-linux-android-ranlib" 94 1.1 christos STRIP="aarch64-linux-android-strip" 95 1.1 christos 96 1.1 christos CFLAGS="-funwind-tables -fexceptions" 97 1.1 christos CXXFLAGS="-funwind-tables -fexceptions -frtti" 98 1.1 christos ;; 99 1.1 christos 100 1.1 christos x86) 101 1.1 christos CC="i686-linux-android$ANDROID_API-clang" 102 1.1 christos CXX="i686-linux-android$ANDROID_API-clang++" 103 1.1 christos LD="i686-linux-android-ld" 104 1.1 christos AS="i686-linux-android-as" 105 1.1 christos AR="i686-linux-android-ar" 106 1.1 christos RANLIB="i686-linux-android-ranlib" 107 1.1 christos STRIP="i686-linux-android-strip" 108 1.1 christos 109 1.1 christos CFLAGS="-mtune=intel -mssse3 -mfpmath=sse -funwind-tables -fexceptions" 110 1.1 christos CXXFLAGS="-mtune=intel -mssse3 -mfpmath=sse -funwind-tables -fexceptions -frtti" 111 1.1 christos ;; 112 1.1 christos 113 1.1 christos x86_64|x64) 114 1.1 christos CC="x86_64-linux-android$ANDROID_API-clang" 115 1.1 christos CXX="x86_64-linux-android$ANDROID_API-clang++" 116 1.1 christos LD="x86_64-linux-android-ld" 117 1.1 christos AS="x86_64-linux-android-as" 118 1.1 christos AR="x86_64-linux-android-ar" 119 1.1 christos RANLIB="x86_64-linux-android-ranlib" 120 1.1 christos STRIP="x86_64-linux-android-strip" 121 1.1 christos 122 1.1 christos CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -mtune=intel -funwind-tables -fexceptions" 123 1.1 christos CXXFLAGS="-march=x86-64 -msse4.2 -mpopcnt -mtune=intel -funwind-tables -fexceptions -frtti" 124 1.1 christos ;; 125 1.1 christos 126 1.1 christos *) 127 1.1 christos echo "ERROR: Unknown architecture $ANDROID_CPU" 128 1.1 christos [ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1 129 1.1 christos ;; 130 1.1 christos esac 131 1.1 christos 132 1.1 christos ##################################################################### 133 1.1 christos 134 1.1 christos # Error checking 135 1.1 christos if [ ! -e "$ANDROID_TOOLCHAIN/$CC" ]; then 136 1.1 christos echo "ERROR: Failed to find Android clang. Please edit this script." 137 1.1 christos [ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1 138 1.1 christos fi 139 1.1 christos 140 1.1 christos # Error checking 141 1.1 christos if [ ! -e "$ANDROID_TOOLCHAIN/$CXX" ]; then 142 1.1 christos echo "ERROR: Failed to find Android clang++. Please edit this script." 143 1.1 christos [ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1 144 1.1 christos fi 145 1.1 christos 146 1.1 christos # Error checking 147 1.1 christos if [ ! -e "$ANDROID_TOOLCHAIN/$RANLIB" ]; then 148 1.1 christos echo "ERROR: Failed to find Android ranlib. Please edit this script." 149 1.1 christos [ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1 150 1.1 christos fi 151 1.1 christos 152 1.1 christos # Error checking 153 1.1 christos if [ ! -e "$ANDROID_TOOLCHAIN/$AR" ]; then 154 1.1 christos echo "ERROR: Failed to find Android ar. Please edit this script." 155 1.1 christos [ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1 156 1.1 christos fi 157 1.1 christos 158 1.1 christos # Error checking 159 1.1 christos if [ ! -e "$ANDROID_TOOLCHAIN/$AS" ]; then 160 1.1 christos echo "ERROR: Failed to find Android as. Please edit this script." 161 1.1 christos [ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1 162 1.1 christos fi 163 1.1 christos 164 1.1 christos # Error checking 165 1.1 christos if [ ! -e "$ANDROID_TOOLCHAIN/$LD" ]; then 166 1.1 christos echo "ERROR: Failed to find Android ld. Please edit this script." 167 1.1 christos [ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1 168 1.1 christos fi 169 1.1 christos 170 1.1 christos ##################################################################### 171 1.1 christos 172 1.1 christos LENGTH=${#ANDROID_TOOLCHAIN} 173 1.1 christos SUBSTR=${PATH:0:$LENGTH} 174 1.1 christos if [ "$SUBSTR" != "$ANDROID_TOOLCHAIN" ]; then 175 1.1 christos export PATH="$ANDROID_TOOLCHAIN:$PATH" 176 1.1 christos fi 177 1.1 christos 178 1.1 christos ##################################################################### 179 1.1 christos 180 1.1 christos export CPP CC CXX LD AS AR RANLIB STRIP 181 1.1 christos export ANDROID_SYSROOT="$AOSP_SYSROOT" 182 1.1 christos export CPPFLAGS="-D__ANDROID_API__=$ANDROID_API" 183 1.1 christos export CFLAGS="$CFLAGS --sysroot=$AOSP_SYSROOT" 184 1.1 christos export CXXFLAGS="$CXXFLAGS -stdlib=libc++ --sysroot=$AOSP_SYSROOT" 185 1.1 christos 186 1.1 christos ##################################################################### 187 1.1 christos 188 1.1 christos echo "ANDROID_TOOLCHAIN: $ANDROID_TOOLCHAIN" 189 1.1 christos 190 1.1 christos echo "CPP: $(command -v "$CPP")" 191 1.1 christos echo "CC: $(command -v "$CC")" 192 1.1 christos echo "CXX: $(command -v "$CXX")" 193 1.1 christos echo "LD: $(command -v "$LD")" 194 1.1 christos echo "AS: $(command -v "$AS")" 195 1.1 christos echo "AR: $(command -v "$AR")" 196 1.1 christos 197 1.1 christos echo "ANDROID_SYSROOT: $ANDROID_SYSROOT" 198 1.1 christos 199 1.1 christos echo "CPPFLAGS: $CPPFLAGS" 200 1.1 christos echo "CFLAGS: $CFLAGS" 201 1.1 christos echo "CXXFLAGS: $CXXFLAGS" 202 1.1 christos 203 1.1 christos [ "$0" = "${BASH_SOURCE[0]}" ] && exit 0 || return 0 204