tools/android_build.sh: update for latest NDK

android_build.sh no longer works with recent NDKs, and it has a lot of
logic to use old NDKs directly that wasn't really necessary because it
could have just required standalone toolchains instead.

Recent NDKs (r19 and later) come with standalone toolchains by default.
Also, they now only include clang, not gcc.

Modify the script to just support these recent NDKs.  Also, default to
arm64 and add support for enabling CRC instructions.
This commit is contained in:
Eric Biggers 2020-10-10 23:02:50 -07:00
parent 4c92394eaa
commit 3b9775d4aa
2 changed files with 59 additions and 67 deletions

View File

@ -1,29 +1,29 @@
#!/bin/bash #!/bin/bash
set -eu set -eu -o pipefail
ARCH="arm32" API_LEVEL=28
COMPILER="gcc" ARCH=arm64
NDKDIR="/opt/android-ndk" CFLAGS=
ENABLE_NEON=false ENABLE_CRC=false
ENABLE_CRYPTO=false ENABLE_CRYPTO=false
NDKDIR=$HOME/android-ndk-r21d
usage() { usage() {
cat << EOF cat << EOF
Usage: $0 [OPTION]... -- [BENCHMARK_PROGRAM_ARG]... Usage: $0 [OPTION]... -- [MAKE_TARGET]...
Build the libdeflate test programs for Android Build libdeflate for Android.
--api-level=LEVEL Android API level to target (default: $API_LEVEL)
--arch=ARCH Architecture: arm32|arm64 (default: $ARCH) --arch=ARCH Architecture: arm32|arm64 (default: $ARCH)
--compiler=COMPILER Compiler: gcc|clang (default: $COMPILER) --enable-crc Enable crc instructions
--enable-crypto Enable crypto instructions
--ndkdir=NDKDIR Android NDK directory (default: $NDKDIR) --ndkdir=NDKDIR Android NDK directory (default: $NDKDIR)
--enable-neon Enable NEON instructions
--enable-crypto Enable crypto extensions (implies NEON too)
EOF EOF
} }
if ! options=$(getopt -o '' \ if ! options=$(getopt -o '' \
-l 'arch:,compiler:,ndkdir:,enable-neon,enable-crypto,help' -- "$@"); then -l 'api-level:,arch:,enable-crc,enable-crypto,help,ndkdir:' -- "$@"); then
usage usage 1>&2
exit 1 exit 1
fi fi
@ -31,20 +31,16 @@ eval set -- "$options"
while [ $# -gt 0 ]; do while [ $# -gt 0 ]; do
case "$1" in case "$1" in
--api-level)
API_LEVEL="$2"
shift
;;
--arch) --arch)
ARCH="$2" ARCH="$2"
shift shift
;; ;;
--compiler) --enable-crc)
COMPILER="$2" ENABLE_CRC=true
shift
;;
--ndkdir)
NDKDIR="$2"
shift
;;
--enable-neon)
ENABLE_NEON=true
;; ;;
--enable-crypto) --enable-crypto)
ENABLE_CRYPTO=true ENABLE_CRYPTO=true
@ -53,63 +49,60 @@ while [ $# -gt 0 ]; do
usage usage
exit 0 exit 0
;; ;;
--ndkdir)
NDKDIR="$2"
shift
;;
--) --)
shift shift
break break
;; ;;
*) *)
echo 1>&2 "Unknown option \"$1\"" echo 1>&2 "Unknown option \"$1\""
usage usage 1>&2
exit 1 exit 1
esac esac
shift shift
done done
CFLAGS="-fPIC" BINDIR=$NDKDIR/toolchains/llvm/prebuilt/linux-x86_64/bin/
case "$ARCH" in case "$ARCH" in
arm|arm32|aarch32) arm|arm32|aarch32)
GCC_TOOLCHAIN="arm-linux-androideabi-4.9" CC=$BINDIR/armv7a-linux-androideabi$API_LEVEL-clang
CLANG_TARGET="armv7-none-linux-androideabi" if $ENABLE_CRC || $ENABLE_CRYPTO; then
if $ENABLE_CRYPTO; then CFLAGS="-march=armv8-a"
CFLAGS+=" -march=armv7-a -mfloat-abi=softfp -mfpu=crypto-neon-fp-armv8" if $ENABLE_CRC; then
elif $ENABLE_NEON; then CFLAGS+=" -mcrc"
CFLAGS+=" -march=armv7-a -mfloat-abi=softfp -mfpu=neon"
else else
CFLAGS+=" -march=armv6" CFLAGS+=" -mnocrc"
fi
if $ENABLE_CRYPTO; then
CFLAGS+=" -mfpu=crypto-neon-fp-armv8"
else
CFLAGS+=" -mfpu=neon"
fi
fi fi
CFLAGS+=" --sysroot=\"$NDKDIR/platforms/android-12/arch-arm\""
;; ;;
arm64|aarch64) arm64|aarch64)
GCC_TOOLCHAIN="aarch64-linux-android-4.9" CC=$BINDIR/aarch64-linux-android$API_LEVEL-clang
CLANG_TARGET="aarch64-none-linux-android" features=""
if $ENABLE_CRYPTO; then if $ENABLE_CRC; then
CFLAGS+=" -march=armv8-a+crypto" features+="+crc"
else fi
CFLAGS+=" -march=armv8-a" if $ENABLE_CRYPTO; then
features+="+crypto"
fi
if [ -n "$features" ]; then
CFLAGS="-march=armv8-a$features"
fi fi
CFLAGS+=" --sysroot=\"$NDKDIR/platforms/android-21/arch-arm64\""
;; ;;
*) *)
echo 1>&2 "Unknown architecture: \"$ARCH\"" echo 1>&2 "Unknown architecture: \"$ARCH\""
usage usage 1>&2
exit 1 exit 1
esac esac
case "$COMPILER" in cmd=(make "-j$(grep -c processor /proc/cpuinfo)" CC="$CC" CFLAGS="$CFLAGS" "$@")
gcc) echo "${cmd[*]}"
CC="\"$NDKDIR/toolchains/$GCC_TOOLCHAIN/prebuilt/linux-x86_64/bin/${GCC_TOOLCHAIN%-*}-gcc\"" "${cmd[@]}"
;;
clang)
CC="\"$NDKDIR/toolchains/llvm/prebuilt/linux-x86_64/bin/clang\""
CFLAGS+=" -target \"$CLANG_TARGET\""
CFLAGS+=" -gcc-toolchain \"$NDKDIR/toolchains/$GCC_TOOLCHAIN/prebuilt/linux-x86_64\""
;;
*)
echo 1>&2 "Unknown compiler: \"$COMPILER\""
usage
exit 1
esac
make -j$(grep -c processor /proc/cpuinfo) test_programs \
CC="$CC" CFLAGS="$CFLAGS" LDFLAGS="-pie"

View File

@ -54,7 +54,7 @@ if [ -z "${SMOKEDATA:-}" ]; then
| head -c 1000000 > "$SMOKEDATA" | head -c 1000000 > "$SMOKEDATA"
fi fi
NDKDIR="${NDKDIR:=/opt/android-ndk}" NDKDIR="${NDKDIR:=$HOME/android-ndk-r21d}"
FILES=("$SMOKEDATA" ./tools/exec_tests.sh benchmark 'test_*') FILES=("$SMOKEDATA" ./tools/exec_tests.sh benchmark 'test_*')
EXEC_TESTS_CMD="WRAPPER= SMOKEDATA=\"$(basename $SMOKEDATA)\" sh exec_tests.sh" EXEC_TESTS_CMD="WRAPPER= SMOKEDATA=\"$(basename $SMOKEDATA)\" sh exec_tests.sh"
@ -245,7 +245,8 @@ checksum_benchmarks() {
############################################################################### ###############################################################################
android_build_and_test() { android_build_and_test() {
run_cmd ./tools/android_build.sh --ndkdir="$NDKDIR" "$@" run_cmd ./tools/android_build.sh --ndkdir="$NDKDIR" "$@" \
all test_programs
run_cmd adb push ${FILES[@]} /data/local/tmp/ run_cmd adb push ${FILES[@]} /data/local/tmp/
# Note: adb shell always returns 0, even if the shell command fails... # Note: adb shell always returns 0, even if the shell command fails...
@ -280,12 +281,10 @@ android_tests() {
return 0 return 0
fi fi
for compiler in gcc clang; do
for flags in "" "--enable-neon" "--enable-crypto"; do
for arch in arm32 arm64; do for arch in arm32 arm64; do
android_build_and_test --arch=$arch \ for flags in "" "--enable-crc" "--enable-crypto" \
--compiler=$compiler $flags "--enable-crc --enable-crypto"; do
done android_build_and_test --arch=$arch $flags
done done
done done
} }