deltachat/ndk-make.sh
Hocuri f4c39273a5
Make ndk-make.sh debug builds (for just one arch) more usable (#2173)
Debug builds of the core (like `ndk-make.sh arm64-v8a`) take about a minute, while
a release bulid (`ndk-make.sh`) takes about 15 minutes.

But as most people seem not to use debug builds regularly because
they are tricky to use, here comes an improvement :) If you gave the wrong argument to `ndk-make.sh`, a warning dialog will now pop up inside the app, telling you what you did wrong and what you should do instead.

`ndk-make.sh` writes its argument into the file `ndkArch`.
`getNdkArch()` in `build.gradle` then reads this file and its content is assigned to
`BuildConfig.NDK_ARCH`. `checkNdkArchitecture()` then checks this.
2021-12-18 15:57:50 +01:00

155 lines
4.9 KiB
Bash
Executable file

#!/bin/sh
# If you want to speed up compilation, you can run this script with your
# architecture as an argument:
#
# ./ndk-make.sh arm64-v8a
#
# Possible values are armeabi-v7a, arm64-v8a, x86 and x86_64.
# You should be able to find out your architecture by running:
#
# adb shell uname -m
#
# Or you just guess your phone's architecture to be arm64-v8a and if you
# guessed wrongly, a warning message will pop up inside the app, telling
# you what the correct one is.
#
# The values in the following lines mean the same:
#
# armeabi-v7a, armv7 and arm
# arm64-v8a, aarch64 and arm64
# x86 and i686
# (there are no synonyms for x86_64)
#
#
# If you put this in your .bashrc, then you can directly build and
# deploy DeltaChat from the jni/deltachat-core-rust directory by
# typing `nmake`:
#
# nmake() {(cd ../..; ./ndk-make.sh arm64-v8a && ./gradlew installFatDebug; notify-send "install finished")}
#
#
# If anything doesn't work, please open an issue!!
set -e
echo "starting time: `date`"
: "${ANDROID_NDK_ROOT:=$ANDROID_NDK_HOME}"
: "${ANDROID_NDK_ROOT:=$ANDROID_NDK}"
if test ! -z "$ANDROID_NDK_ROOT"; then
echo Setting CARGO_TARGET environment variables.
if test -z "$NDK_HOST_TAG"; then
KERNEL="$(uname -s | tr '[:upper:]' '[:lower:]')"
ARCH="$(uname -m)"
NDK_HOST_TAG="$KERNEL-$ARCH"
fi
TOOLCHAIN="$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$NDK_HOST_TAG"
export CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER="$TOOLCHAIN/bin/armv7a-linux-androideabi16-clang"
export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="$TOOLCHAIN/bin/aarch64-linux-android21-clang"
export CARGO_TARGET_I686_LINUX_ANDROID_LINKER="$TOOLCHAIN/bin/i686-linux-android16-clang"
export CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER="$TOOLCHAIN/bin/x86_64-linux-android21-clang"
fi
# Check if the argument is a correct architecture:
if test $1 && echo "armeabi-v7a arm64-v8a x86 x86_64" | grep -vwq $1; then
echo "Architecture '$1' not known, possible values are armeabi-v7a, arm64-v8a, x86 and x86_64."
exit
fi
cd jni
jnidir=$PWD
rm -f armeabi-v7a/*
rm -f arm64-v8a/*
rm -f x86/*
rm -f x86_64/*
mkdir -p armeabi-v7a
mkdir -p arm64-v8a
mkdir -p x86
mkdir -p x86_64
cd deltachat-core-rust
# fix build on MacOS Catalina
unset CPATH
if test -z $1; then
echo Full build
# According to 1.45.0 changelog in https://github.com/rust-lang/rust/blob/master/RELEASES.md,
# "The recommended way to control LTO is with Cargo profiles, either in Cargo.toml or .cargo/config, or by setting CARGO_PROFILE_<name>_LTO in the environment."
export CARGO_PROFILE_RELEASE_LTO=on
RELEASE="release"
RELEASEFLAG="--release"
else
echo Fast, partial, slow debug build. DO NOT UPLOAD THE APK ANYWHERE.
RELEASE="debug"
RELEASEFLAG=
fi
if test -z $1 || test $1 = armeabi-v7a; then
echo "-- cross compiling to armv7-linux-androideabi (arm) --"
export CFLAGS=-D__ANDROID_API__=16
TARGET_CC=armv7a-linux-androideabi16-clang \
cargo +`cat rust-toolchain` build $RELEASEFLAG --target armv7-linux-androideabi -p deltachat_ffi
cp target/armv7-linux-androideabi/$RELEASE/libdeltachat.a $jnidir/armeabi-v7a
fi
if test -z $1 || test $1 = arm64-v8a; then
echo "-- cross compiling to aarch64-linux-android (arm64) --"
export CFLAGS=-D__ANDROID_API__=21
TARGET_CC=aarch64-linux-android21-clang \
cargo +`cat rust-toolchain` build $RELEASEFLAG --target aarch64-linux-android -p deltachat_ffi
cp target/aarch64-linux-android/$RELEASE/libdeltachat.a $jnidir/arm64-v8a
fi
if test -z $1 || test $1 = x86; then
echo "-- cross compiling to i686-linux-android (x86) --"
export CFLAGS=-D__ANDROID_API__=16
TARGET_CC=i686-linux-android16-clang \
cargo +`cat rust-toolchain` build $RELEASEFLAG --target i686-linux-android -p deltachat_ffi
cp target/i686-linux-android/$RELEASE/libdeltachat.a $jnidir/x86
fi
if test -z $1 || test $1 = x86_64; then
echo "-- cross compiling to x86_64-linux-android (x86_64) --"
export CFLAGS=-D__ANDROID_API__=21
TARGET_CC=x86_64-linux-android21-clang \
cargo +`cat rust-toolchain` build $RELEASEFLAG --target x86_64-linux-android -p deltachat_ffi
cp target/x86_64-linux-android/$RELEASE/libdeltachat.a $jnidir/x86_64
fi
echo -- ndk-build --
cd ..
# Set the right arch in Application.mk:
oldDotMk="$(cat Application.mk)"
if test $1; then
# Using temporary file because `sed -i` is not portable
TMP=$(mktemp)
sed "s/APP_ABI.*/APP_ABI := $1/g" Application.mk >"$TMP"
mv "$TMP" Application.mk
else
# We are compiling for all architectures:
TMP=$(mktemp)
sed "s/APP_ABI.*/APP_ABI := armeabi-v7a arm64-v8a x86 x86_64/g" Application.mk >"$TMP"
mv "$TMP" Application.mk
fi
cd ..
ndk-build
cd jni
# Restore old Application.mk:
echo "$oldDotMk" > Application.mk
if test $1; then
echo "NDK_ARCH=$1" > ../ndkArch
else
rm ../ndkArch 2>/dev/null || true # Remove ndkArch, ignore if it doesn't exist
fi
echo "ending time: `date`"