Skip to content

Commit

Permalink
Node MacOS: Use /usr/local ; Android: Use 'setenv-android-tools.sh' f…
Browse files Browse the repository at this point in the history
…rom GlueGen
  • Loading branch information
sgothel committed Dec 31, 2019
1 parent 90fd879 commit f65c043
Show file tree
Hide file tree
Showing 5 changed files with 418 additions and 53 deletions.
@@ -0,0 +1,373 @@
#! /bin/sh

# Aligned with Android SDK build-tools 29 and NDK 20 as of 2019-12-10
#
# As it is no more easily achievable to download the complete SDK
# separately, I used Android-Studio to fetch all parts incl. the NDK.
# Thereafter I copied ~/Android/Sdk -> /opt-linux-x86_64/android-sdk-linux_x86_64
# which I also use for the official crosscompilation.
#
# Variable names borrowed from ~/Android/Sdk/ndk/20.1.5948944/build/cmake/android.toolchain.cmake
# We only use ANDROID_API_LEVEL instead of ANDROID_PLATFORM_LEVEL, as it describes the API level.
#
#
# User should set environment variables:
# ==========================================
#
# - ANDROID_HOME - defaults to one of
# ~/Android/Sdk
# /opt-linux-x86_64/android-sdk-linux_x86_64
# /opt/android-sdk-linux_x86_64
# /usr/local/android-sdk-linux_x86_64
#
# - ANDROID_API_LEVEL - defaults to 24
#
# - ANDROID_HOST_TAG - defaults to linux-x86_64
#
# - ANDROID_ABI - defaults to x86_64, one of
# armeabi-v7a (with NEON by default since NDK r21)
# arm64-v8a
# x86_64
# x86
#
# Following environment variables will be set
# ============================================
#
# - ANDROID_SYSROOT_ABI
# - ANDROID_TOOLCHAIN_NAME
# - ANDROID_LLVM_TRIPLE
# - ANDROID_BUILD_TOOLS_VERSION
# - ANDROID_NDK
# - ANDROID_BUILDTOOLS_ROOT
# - ANDROID_TOOLCHAIN_ROOT
# - ANDROID_TOOLCHAIN_SYSROOT0
# - ANDROID_TOOLCHAIN_SYSROOT0_LIB
# - ANDROID_TOOLCHAIN_SYSROOT1
# - ANDROID_TOOLCHAIN_SYSROOT1_INC
# - ANDROID_TOOLCHAIN_SYSROOT1_INC_ARCH
# - ANDROID_TOOLCHAIN_SYSROOT1_INC_STL
# - ANDROID_TOOLCHAIN_SYSROOT1_LIB1
# - ANDROID_TOOLCHAIN_SYSROOT1_LIB2
#
# Android Studio SDK + NDK Filesystem Layout (official)
#
# ~/Android/Sdk/
# ~/Android/Sdk/build-tools/29.0.2/
# ~/Android/Sdk/build-tools/29.0.2/zipalign (*)
# ~/Android/Sdk/ndk/
# ~/Android/Sdk/ndk/20.1.5948944/platforms/android-24/arch-arm64 (1)
# ~/Android/Sdk/ndk/20.1.5948944/platforms/android-24/arch-arm64/usr/lib/libc.a (*)(1)
# ~/Android/Sdk/ndk/20.1.5948944/sysroot/ (gcc)
# ~/Android/Sdk/ndk/20.1.5948944/sysroot/usr/include/ (gcc)
# ~/Android/Sdk/ndk/20.1.5948944/sysroot/usr/lib/aarch64-linux-android/libc.a (gcc)
# ~/Android/Sdk/ndk/20.1.5948944/toolchains/
# ~/Android/Sdk/ndk/20.1.5948944/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/aarch64-linux-android/bin/ld (gcc)
# ~/Android/Sdk/ndk/20.1.5948944/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ld (gcc)
# ~/Android/Sdk/ndk/20.1.5948944/toolchains/llvm/
# ~/Android/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ld (*)
# ~/Android/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/linux-x86_64/aarch64-linux-android/bin/ld
# ~/Android/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/linux-x86_64/bin/clang (*)
# ~/Android/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/linux-x86_64/sysroot (2)
# ~/Android/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include
# ~/Android/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android/asm/types.h (*) (2,3)
# ~/Android/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc.a (*)
# ~/Android/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so (*)
# ~/Android/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/24/libc.a (*) (2)
# ~/Android/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/complex (*) (4)
#
# (*) tested by this script
#
# (1) ANDROID_TOOLCHAIN_SYSROOT0 exposes all libs with standard FS layout usr/lib, but no include files
# -> ANDROID_TOOLCHAIN_SYSROOT0_LIB
#
# (2) ANDROID_TOOLCHAIN_SYSROOT1 exposes all libs but without standard FS layout, also exposes include files
# -> ANDROID_TOOLCHAIN_SYSROOT1_INC
#
# (3) ANDROID_TOOLCHAIN_SYSROOT1 also exposes the arch dependent include files, i.e. asm/types.h etc
# -> ANDROID_TOOLCHAIN_SYSROOT1_INC_ARCH
#
# (4) ANDROID_TOOLCHAIN_SYSROOT1_INC_STL for LLVM's C++ STL lib (default since NDK r18)
# Using LLVM's c++_shared as of NDK r18: https://developer.android.com/ndk/guides/cpp-support.html
# LLVM's c++ headers must come before other system header!
# Also see https://github.com/android/ndk/issues/452 and https://gitlab.kitware.com/cmake/cmake/issues/17059
#
# Native libraries of (1) and (2) are identical
#
# Having
# ANDROID_HOME=~/Android/Sdk
# ANDROID_API_LEVEL 24
# ANDROID_HOST_TAG linux-x86_64
# ANDROID_ABI arm64-v8a
# Using derived values of
# ANDROID_BUILD_TOOLS_VERSION=29.0.2
# ANDROID_NDK_VERSION=20.1.5948944
# ANDROID_TOOLCHAIN_NAME aarch64-linux-android
# ANDROID_TOOLCHAIN_PLATFORM_NAME=arm64
# ANDROID_SYSROOT_ABI=arm64

echo $0

NDK_TOOLCHAIN_VERSION=clang
echo "Setting NDK_TOOLCHAIN_VERSION to ${NDK_TOOLCHAIN_VERSION} default!"

if [ -z "${ANDROID_API_LEVEL}" ] ; then
ANDROID_API_LEVEL=24
echo "Setting undefined ANDROID_API_LEVEL to ${ANDROID_API_LEVEL} default!"
fi
if [ -z "${ANDROID_HOST_TAG}" ] ; then
ANDROID_HOST_TAG=linux-x86_64
echo "Setting undefined ANDROID_HOST_TAG to ${ANDROID_HOST_TAG} default!"
fi

if [ -z "${ANDROID_ABI}" ] ; then
ANDROID_ABI=x86_64
echo "Setting undefined ANDROID_ABI to ${ANDROID_ABI} default!"
fi
if [ "${ANDROID_ABI}" = "armeabi-v7a" ] ; then
# with NEON by default since NDK r21
ANDROID_SYSROOT_ABI=arm
#CMAKE_SYSTEM_PROCESSOR=armv7-a
ANDROID_TOOLCHAIN_NAME=arm-linux-androideabi
ANDROID_LLVM_TRIPLE=armv7-none-linux-androideabi
elif [ "${ANDROID_ABI}" = "arm64-v8a" ] ; then
ANDROID_SYSROOT_ABI=arm64
#CMAKE_SYSTEM_PROCESSOR=aarch64
ANDROID_TOOLCHAIN_NAME=aarch64-linux-android
ANDROID_LLVM_TRIPLE=aarch64-none-linux-android
elif [ "${ANDROID_ABI}" = "x86_64" ] ; then
ANDROID_SYSROOT_ABI=x86_64
#CMAKE_SYSTEM_PROCESSOR=x86_64
ANDROID_TOOLCHAIN_NAME=x86_64-linux-android
ANDROID_LLVM_TRIPLE=x86_64-none-linux-android
elif [ "${ANDROID_ABI}" = "x86" ] ; then
ANDROID_SYSROOT_ABI=x86
#CMAKE_SYSTEM_PROCESSOR=i686
ANDROID_TOOLCHAIN_NAME=i686-linux-android
ANDROID_LLVM_TRIPLE=i686-none-linux-android
else
echo "ANDROID_ABI is ${ANDROID_ABI} and not supported!"
exit 1
fi

echo "Preset-0 (user)"
echo ANDROID_HOME ${ANDROID_HOME}
echo ANDROID_API_LEVEL ${ANDROID_API_LEVEL}
echo ANDROID_HOST_TAG ${ANDROID_HOST_TAG}
echo ANDROID_ABI ${ANDROID_ABI}
echo
echo Preset-1
echo NDK_TOOLCHAIN_VERSION ${NDK_TOOLCHAIN_VERSION}
echo ANDROID_SYSROOT_ABI ${ANDROID_SYSROOT_ABI}
echo ANDROID_TOOLCHAIN_NAME ${ANDROID_TOOLCHAIN_NAME}
echo "ANDROID_LLVM_TRIPLE ${ANDROID_LLVM_TRIPLE} (compiler target)"
echo ANDROID_BUILD_TOOLS_VERSION ${ANDROID_BUILD_TOOLS_VERSION}
echo ANDROID_NDK ${ANDROID_NDK}
echo
echo Preset-2
echo ANDROID_BUILDTOOLS_ROOT ${ANDROID_BUILDTOOLS_ROOT}
echo ANDROID_TOOLCHAIN_ROOT ${ANDROID_TOOLCHAIN_ROOT}
echo ANDROID_TOOLCHAIN_SYSROOT0 ${ANDROID_TOOLCHAIN_SYSROOT0}
echo ANDROID_TOOLCHAIN_SYSROOT0_LIB ${ANDROID_TOOLCHAIN_SYSROOT0_LIB}
echo ANDROID_TOOLCHAIN_SYSROOT1 ${ANDROID_TOOLCHAIN_SYSROOT1}
echo ANDROID_TOOLCHAIN_SYSROOT1_INC ${ANDROID_TOOLCHAIN_SYSROOT1_INC}
echo ANDROID_TOOLCHAIN_SYSROOT1_INC_ARCH ${ANDROID_TOOLCHAIN_SYSROOT1_INC_ARCH}
echo ANDROID_TOOLCHAIN_SYSROOT1_INC_STL ${ANDROID_TOOLCHAIN_SYSROOT1_INC_STL}
echo ANDROID_TOOLCHAIN_SYSROOT1_LIB1 ${ANDROID_TOOLCHAIN_SYSROOT1_LIB1}
echo ANDROID_TOOLCHAIN_SYSROOT1_LIB2 ${ANDROID_TOOLCHAIN_SYSROOT1_LIB2}
echo

check_exists() {
if [ ! -e "$1" ] ; then
echo "$1" does not exist
exit 1
fi
return 0
}

if [ -z "${ANDROID_HOME}" ] ; then
if [ -e ${HOME}/Android/Sdk ] ; then
ANDROID_HOME=${HOME}/Android/Sdk
elif [ -e /opt-linux-x86_64/android-sdk-linux_x86_64 ] ; then
ANDROID_HOME=/opt-linux-x86_64/android-sdk-linux_x86_64
elif [ -e /opt/android-sdk-linux_x86_64 ] ; then
ANDROID_HOME=/opt/android-sdk-linux_x86_64
elif [ -e /usr/local/android-sdk-linux_x86_64 ] ; then
ANDROID_HOME=/usr/local/android-sdk-linux_x86_64
else
echo ANDROID_HOME is not specified and does not exist in default locations
exit 1
fi
elif [ ! -e ${ANDROID_HOME} ] ; then
echo ANDROID_HOME ${ANDROID_HOME} does not exist
exit 1
fi

unset ANDROID_BUILD_TOOLS_VERSION
if [ -z "${ANDROID_BUILD_TOOLS_VERSION}" ] ; then
# basename $(dirname `find /home/sven/Android/Sdk/build-tools -name zipalign | sort -u | tail -n1`)
fzipalign=`find ${ANDROID_HOME}/build-tools -name zipalign | sort -u | tail -n1`
if [ ! -z "${fzipalign}" ] ; then
dzipalign=`dirname ${fzipalign}`
vzipalign=`basename ${dzipalign}`
if [ -e ${ANDROID_HOME}/build-tools/${vzipalign}/zipalign ] ; then
ANDROID_BUILD_TOOLS_VERSION=${vzipalign}
fi
fi
if [ -z "${ANDROID_BUILD_TOOLS_VERSION}" ] ; then
echo ANDROID_BUILD_TOOLS_VERSION ${ANDROID_HOME}/build-tools/ANDROID_BUILD_TOOLS_VERSION/zipalign does not exist
exit 1
fi
fi

if [ -z "${ANDROID_NDK}" ] ; then
#
# Generic android-ndk
#
if [ -e ${ANDROID_HOME}/ndk ] ; then
# basename $(dirname `find ndk -name toolchains -a -type d | sort -u | tail -n1`)
d2toolchains=`find ${ANDROID_HOME}/ndk -name toolchains -a -type d | sort -u | tail -n1`
if [ ! -z "${d2toolchains}" ] ; then
dtoolchains=`dirname ${d2toolchains}`
vtoolchains=`basename ${dtoolchains}`
# ~/Android/Sdk/ndk/20.1.5948944/sysroot/usr/lib/aarch64-linux-android/libc.a (*)
if [ -e ${ANDROID_HOME}/ndk/${vtoolchains}/sysroot/usr/lib/aarch64-linux-android/libc.a ] ; then
ANDROID_NDK_VERSION=${vtoolchains}
fi
fi
if [ -z "${ANDROID_NDK_VERSION}" ] ; then
echo ANDROID_NDK_VERSION ${ANDROID_HOME}/ndk/ANDROID_NDK_VERSION/sysroot/usr/lib/aarch64-linux-android/libc.a does not exist
else
ANDROID_NDK=${ANDROID_HOME}/ndk/${vtoolchains}
fi
fi
if [ -z "${ANDROID_NDK}" ] ; then
if [ -e /usr/local/android-ndk ] ; then
ANDROID_NDK=/usr/local/android-ndk
elif [ -e /opt-linux-x86_64/android-ndk ] ; then
ANDROID_NDK=/opt-linux-x86_64/android-ndk
elif [ -e /opt/android-ndk ] ; then
ANDROID_NDK=/opt/android-ndk
fi
fi
if [ -z "${ANDROID_NDK}" ] ; then
echo ANDROID_NDK is not specified and does not exist in default locations
exit 1
fi
fi
if [ ! -e "${ANDROID_NDK}" ] ; then
echo ANDROID_NDK ${ANDROID_NDK} does not exist
exit 1
fi

ANDROID_BUILDTOOLS_ROOT=${ANDROID_HOME}/build-tools/${ANDROID_BUILD_TOOLS_VERSION}
ANDROID_TOOLCHAIN_ROOT=${ANDROID_NDK}/toolchains/llvm/prebuilt/${ANDROID_HOST_TAG}

ANDROID_TOOLCHAIN_SYSROOT0=${ANDROID_NDK}/platforms/android-${ANDROID_API_LEVEL}/arch-${ANDROID_SYSROOT_ABI}
ANDROID_TOOLCHAIN_SYSROOT0_LIB=${ANDROID_TOOLCHAIN_SYSROOT0}/usr/lib

ANDROID_TOOLCHAIN_SYSROOT1=${ANDROID_TOOLCHAIN_ROOT}/sysroot
ANDROID_TOOLCHAIN_SYSROOT1_INC=${ANDROID_TOOLCHAIN_SYSROOT1}/usr/include
ANDROID_TOOLCHAIN_SYSROOT1_INC_ARCH=${ANDROID_TOOLCHAIN_SYSROOT1_INC}/${ANDROID_TOOLCHAIN_NAME}
ANDROID_TOOLCHAIN_SYSROOT1_INC_STL=${ANDROID_TOOLCHAIN_SYSROOT1_INC}/c++/v1
ANDROID_TOOLCHAIN_SYSROOT1_LIB1=${ANDROID_TOOLCHAIN_SYSROOT1}/usr/lib/${ANDROID_TOOLCHAIN_NAME}/${ANDROID_API_LEVEL}
ANDROID_TOOLCHAIN_SYSROOT1_LIB2=${ANDROID_TOOLCHAIN_SYSROOT1}/usr/lib/${ANDROID_TOOLCHAIN_NAME}

# ~/Android/Sdk/build-tools/29.0.2/zipalign (*)
check_exists ${ANDROID_BUILDTOOLS_ROOT}/zipalign

# ~/Android/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ld (*)
check_exists ${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_NAME}-ld

# ~/Android/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/linux-x86_64/bin/clang (*)
check_exists ${ANDROID_TOOLCHAIN_ROOT}/bin/clang

# ~/Android/Sdk/ndk/20.1.5948944/platforms/android-24/arch-arm64/usr/lib/libc.a (*)
check_exists ${ANDROID_TOOLCHAIN_SYSROOT0_LIB}/libc.a

# ~/Android/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android/asm/types.h (*) (2)
check_exists ${ANDROID_TOOLCHAIN_SYSROOT1_INC_ARCH}/asm/types.h

# ~/Android/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/complex (*) (4)
check_exists ${ANDROID_TOOLCHAIN_SYSROOT1_INC_STL}/complex

# ~/Android/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/24/libc.a (*)
check_exists ${ANDROID_TOOLCHAIN_SYSROOT1_LIB1}/libc.a

# ~/Android/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc.a (*)
# ~/Android/Sdk/ndk/20.1.5948944/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so (*)
check_exists ${ANDROID_TOOLCHAIN_SYSROOT1_LIB2}/libc.a
check_exists ${ANDROID_TOOLCHAIN_SYSROOT1_LIB2}/libc++_shared.so

export ANDROID_HOME
export ANDROID_API_LEVEL
export ANDROID_HOST_TAG
export ANDROID_ABI

export NDK_TOOLCHAIN_VERSION
export ANDROID_SYSROOT_ABI
export ANDROID_TOOLCHAIN_NAME
export ANDROID_LLVM_TRIPLE
export ANDROID_BUILD_TOOLS_VERSION
export ANDROID_NDK

export ANDROID_BUILDTOOLS_ROOT
export ANDROID_TOOLCHAIN_ROOT
export ANDROID_TOOLCHAIN_SYSROOT0
export ANDROID_TOOLCHAIN_SYSROOT0_LIB
export ANDROID_TOOLCHAIN_SYSROOT1
export ANDROID_TOOLCHAIN_SYSROOT1_INC
export ANDROID_TOOLCHAIN_SYSROOT1_INC_ARCH
export ANDROID_TOOLCHAIN_SYSROOT1_INC_STL
export ANDROID_TOOLCHAIN_SYSROOT1_LIB1
export ANDROID_TOOLCHAIN_SYSROOT1_LIB2

echo "Postset-0 (user)"
echo ANDROID_HOME ${ANDROID_HOME}
echo ANDROID_API_LEVEL ${ANDROID_API_LEVEL}
echo ANDROID_HOST_TAG ${ANDROID_HOST_TAG}
echo ANDROID_ABI ${ANDROID_ABI}
echo
echo Postset-1
echo NDK_TOOLCHAIN_VERSION ${NDK_TOOLCHAIN_VERSION}
echo ANDROID_SYSROOT_ABI ${ANDROID_SYSROOT_ABI}
echo ANDROID_TOOLCHAIN_NAME ${ANDROID_TOOLCHAIN_NAME}
echo "ANDROID_LLVM_TRIPLE ${ANDROID_LLVM_TRIPLE} (compiler target)"
echo ANDROID_BUILD_TOOLS_VERSION ${ANDROID_BUILD_TOOLS_VERSION}
echo ANDROID_NDK ${ANDROID_NDK}
echo
echo Postset-2
echo ANDROID_BUILDTOOLS_ROOT ${ANDROID_BUILDTOOLS_ROOT}
echo ANDROID_TOOLCHAIN_ROOT ${ANDROID_TOOLCHAIN_ROOT}
echo ANDROID_TOOLCHAIN_SYSROOT0 ${ANDROID_TOOLCHAIN_SYSROOT0}
echo ANDROID_TOOLCHAIN_SYSROOT0_LIB ${ANDROID_TOOLCHAIN_SYSROOT0_LIB}
echo ANDROID_TOOLCHAIN_SYSROOT1 ${ANDROID_TOOLCHAIN_SYSROOT1}
echo ANDROID_TOOLCHAIN_SYSROOT1_INC ${ANDROID_TOOLCHAIN_SYSROOT1_INC}
echo ANDROID_TOOLCHAIN_SYSROOT1_INC_ARCH ${ANDROID_TOOLCHAIN_SYSROOT1_INC_ARCH}
echo ANDROID_TOOLCHAIN_SYSROOT1_INC_STL ${ANDROID_TOOLCHAIN_SYSROOT1_INC_STL}
echo ANDROID_TOOLCHAIN_SYSROOT1_LIB1 ${ANDROID_TOOLCHAIN_SYSROOT1_LIB1}
echo ANDROID_TOOLCHAIN_SYSROOT1_LIB2 ${ANDROID_TOOLCHAIN_SYSROOT1_LIB2}
echo

export -p | grep ANDROID

#
# CC="$ANDROID_NDK/toolchains/llvm/prebuilt/$ANDROID_HOST_TAG/bin/clang -target $ANDROID_LLVM_TRIPLE"
#
## Generic flags.
##list(APPEND ANDROID_COMPILER_FLAGS
# -g
# -DANDROID
# -fdata-sections
# -ffunction-sections
# -funwind-tables
# -fstack-protector-strong
# -no-canonical-prefixes)
#list(APPEND ANDROID_LINKER_FLAGS
# -Wl,--build-id
# -Wl,--warn-shared-textrel
# -Wl,--fatal-warnings)
#list(APPEND ANDROID_LINKER_FLAGS_EXE -Wl,--gc-sections)
#
#list(APPEND ANDROID_COMPILER_FLAGS_RELEASE -O2)
#

0 comments on commit f65c043

Please sign in to comment.