| #!/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" |
| exit 1 |
| fi |
| |
| NDK_PATH=$1 |
| ARCH="$2" |
| ANDROID_SDK_VERSION=$3 |
| |
| if [ $ANDROID_SDK_VERSION -lt 23 ]; then |
| echo "$ANDROID_SDK_VERSION should equal or later than 23(Android 6.0)" |
| fi |
| |
| CC_VER="4.9" |
| |
| case $ARCH in |
| arm) |
| DEST_CPU="arm" |
| TOOLCHAIN_NAME="armv7-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" |
| exit 1 |
| ;; |
| esac |
| |
| HOST_OS="linux" |
| HOST_ARCH="x86_64" |
| export CC_host=$(which gcc) |
| export CXX_host=$(which 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 -a $minor -lt 3 ]; then |
| echo "host gcc $host_gcc_version is too old, need gcc 6.3.0" |
| exit 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 |