Home | History | Annotate | Line # | Download | only in android
      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