| #!/bin/bash | |
| # In order to cross-compile node for Android using NDK, run: | |
| # source android-configure <path_to_ndk> [arch] | |
| # | |
| # By running android-configure with source, will allow environment variables to | |
| # be persistent in current session. This is useful for installing native node | |
| # modules with npm. Also, don't forget to set the arch in npm config using | |
| # 'npm config set arch=<arch>' | |
| if [ $# -ne 3 ]; then | |
| echo "$0 should have 3 parameters: ndk_path, target_arch and sdk_version" | |
| return 1 | |
| fi | |
| NDK_PATH=$1 | |
| ARCH="$2" | |
| ANDROID_SDK_VERSION=$3 | |
| if [ $ANDROID_SDK_VERSION -lt 24 ]; then | |
| echo "$ANDROID_SDK_VERSION should equal or later than 24 (Android 7.0)" | |
| fi | |
| case $ARCH in | |
| arm) | |
| DEST_CPU="arm" | |
| TOOLCHAIN_NAME="armv7a-linux-androideabi" | |
| ;; | |
| x86) | |
| DEST_CPU="ia32" | |
| TOOLCHAIN_NAME="i686-linux-android" | |
| ;; | |
| x86_64) | |
| DEST_CPU="x64" | |
| TOOLCHAIN_NAME="x86_64-linux-android" | |
| ARCH="x64" | |
| ;; | |
| arm64|aarch64) | |
| DEST_CPU="arm64" | |
| TOOLCHAIN_NAME="aarch64-linux-android" | |
| ARCH="arm64" | |
| ;; | |
| *) | |
| echo "Unsupported architecture provided: $ARCH" | |
| return 1 | |
| ;; | |
| esac | |
| HOST_OS="linux" | |
| HOST_ARCH="x86_64" | |
| export CC_host=$(command -v gcc) | |
| export CXX_host=$(command -v g++) | |
| host_gcc_version=$($CC_host --version | grep gcc | awk '{print $NF}') | |
| major=$(echo $host_gcc_version | awk -F . '{print $1}') | |
| minor=$(echo $host_gcc_version | awk -F . '{print $2}') | |
| if [ -z $major ] || [ -z $minor ] || [ $major -lt 6 ] || ( [ $major -eq 6 ] && [ $minor -lt 3 ] ); then | |
| echo "host gcc $host_gcc_version is too old, need gcc 6.3.0" | |
| return 1 | |
| fi | |
| SUFFIX="$TOOLCHAIN_NAME$ANDROID_SDK_VERSION" | |
| TOOLCHAIN=$NDK_PATH/toolchains/llvm/prebuilt/$HOST_OS-$HOST_ARCH | |
| export PATH=$TOOLCHAIN/bin:$PATH | |
| export CC=$TOOLCHAIN/bin/$SUFFIX-clang | |
| export CXX=$TOOLCHAIN/bin/$SUFFIX-clang++ | |
| GYP_DEFINES="target_arch=$ARCH" | |
| GYP_DEFINES+=" v8_target_arch=$ARCH" | |
| GYP_DEFINES+=" android_target_arch=$ARCH" | |
| GYP_DEFINES+=" host_os=$HOST_OS OS=android" | |
| export GYP_DEFINES | |
| if [ -f "configure" ]; then | |
| ./configure \ | |
| --dest-cpu=$DEST_CPU \ | |
| --dest-os=android \ | |
| --without-snapshot \ | |
| --openssl-no-asm \ | |
| --cross-compiling | |
| fi |