summaryrefslogtreecommitdiffstats
path: root/Android/android-env.sh
diff options
context:
space:
mode:
authorMalcolm Smith <smith@chaquo.com>2024-03-21 23:52:29 (GMT)
committerGitHub <noreply@github.com>2024-03-21 23:52:29 (GMT)
commit3ec57307e70ee6f42410e844d3399bbd598917ba (patch)
tree6a8a4241ab77eb831818110235cd67d6f1263bf1 /Android/android-env.sh
parent50f9b0b1e0fb181875751cef951351ed007b6397 (diff)
downloadcpython-3ec57307e70ee6f42410e844d3399bbd598917ba.zip
cpython-3ec57307e70ee6f42410e844d3399bbd598917ba.tar.gz
cpython-3ec57307e70ee6f42410e844d3399bbd598917ba.tar.bz2
gh-71052: Add Android build script and instructions (#116426)
Diffstat (limited to 'Android/android-env.sh')
-rw-r--r--Android/android-env.sh87
1 files changed, 87 insertions, 0 deletions
diff --git a/Android/android-env.sh b/Android/android-env.sh
new file mode 100644
index 0000000..3ce3e03
--- /dev/null
+++ b/Android/android-env.sh
@@ -0,0 +1,87 @@
+# This script must be sourced with the following variables already set:
+: ${ANDROID_HOME:?} # Path to Android SDK
+: ${HOST:?} # GNU target triplet
+
+# You may also override the following:
+: ${api_level:=21} # Minimum Android API level the build will run on
+: ${PREFIX:-} # Path in which to find required libraries
+
+
+# Print all messages on stderr so they're visible when running within build-wheel.
+log() {
+ echo "$1" >&2
+}
+
+fail() {
+ log "$1"
+ exit 1
+}
+
+# When moving to a new version of the NDK, carefully review the following:
+#
+# * https://developer.android.com/ndk/downloads/revision_history
+#
+# * https://android.googlesource.com/platform/ndk/+/ndk-rXX-release/docs/BuildSystemMaintainers.md
+# where XX is the NDK version. Do a diff against the version you're upgrading from, e.g.:
+# https://android.googlesource.com/platform/ndk/+/ndk-r25-release..ndk-r26-release/docs/BuildSystemMaintainers.md
+ndk_version=26.2.11394342
+
+ndk=$ANDROID_HOME/ndk/$ndk_version
+if ! [ -e $ndk ]; then
+ log "Installing NDK: this may take several minutes"
+ yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "ndk;$ndk_version"
+fi
+
+if [ $HOST = "arm-linux-androideabi" ]; then
+ clang_triplet=armv7a-linux-androideabi
+else
+ clang_triplet=$HOST
+fi
+
+# These variables are based on BuildSystemMaintainers.md above, and
+# $ndk/build/cmake/android.toolchain.cmake.
+toolchain=$(echo $ndk/toolchains/llvm/prebuilt/*)
+export AR="$toolchain/bin/llvm-ar"
+export AS="$toolchain/bin/llvm-as"
+export CC="$toolchain/bin/${clang_triplet}${api_level}-clang"
+export CXX="${CC}++"
+export LD="$toolchain/bin/ld"
+export NM="$toolchain/bin/llvm-nm"
+export RANLIB="$toolchain/bin/llvm-ranlib"
+export READELF="$toolchain/bin/llvm-readelf"
+export STRIP="$toolchain/bin/llvm-strip"
+
+# The quotes make sure the wildcard in the `toolchain` assignment has been expanded.
+for path in "$AR" "$AS" "$CC" "$CXX" "$LD" "$NM" "$RANLIB" "$READELF" "$STRIP"; do
+ if ! [ -e "$path" ]; then
+ fail "$path does not exist"
+ fi
+done
+
+export CFLAGS=""
+export LDFLAGS="-Wl,--build-id=sha1 -Wl,--no-rosegment"
+
+# Many packages get away with omitting -lm on Linux, but Android is stricter.
+LDFLAGS="$LDFLAGS -lm"
+
+# -mstackrealign is included where necessary in the clang launcher scripts which are
+# pointed to by $CC, so we don't need to include it here.
+if [ $HOST = "arm-linux-androideabi" ]; then
+ CFLAGS="$CFLAGS -march=armv7-a -mthumb"
+fi
+
+if [ -n "${PREFIX:-}" ]; then
+ abs_prefix=$(realpath $PREFIX)
+ CFLAGS="$CFLAGS -I$abs_prefix/include"
+ LDFLAGS="$LDFLAGS -L$abs_prefix/lib"
+
+ export PKG_CONFIG="pkg-config --define-prefix"
+ export PKG_CONFIG_LIBDIR="$abs_prefix/lib/pkgconfig"
+fi
+
+# Use the same variable name as conda-build
+if [ $(uname) = "Darwin" ]; then
+ export CPU_COUNT=$(sysctl -n hw.ncpu)
+else
+ export CPU_COUNT=$(nproc)
+fi