blob: 0a7fcda1c72c91d809dbc5f9978448f8955daada (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
#!/bin/sh
# Build rsync for each Android ABI from pinned source via the NDK. Output is a
# stripped PIE executable named lib*.so, packaged inside the APK and exec'd from
# nativeLibraryDir. Optional dependencies are disabled so the binary needs
# nothing outside Bionic; zlib and popt come from rsync's bundled copies.
set -eu
root=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
. "$root/versions"
# Locate the NDK toolchain.
ndk=${ANDROID_NDK_HOME:-${ANDROID_NDK_ROOT:-}}
if [ -z "$ndk" ] && [ -n "${ANDROID_HOME:-}" ]; then
ndk="$ANDROID_HOME/ndk/$ANDROID_NDK"
fi
if [ -z "$ndk" ] || [ ! -d "$ndk" ]; then
echo "rsync: Android NDK not found; set ANDROID_NDK_HOME" >&2
exit 1
fi
# NDK prebuilt toolchains are named by build host, not target. Pick the tag
# matching this machine (macOS ships an x86_64 clang that runs under Rosetta on
# Apple Silicon); the target ABI is selected separately below.
case "$(uname -s)" in
Linux) host_tag=linux-x86_64 ;;
Darwin) host_tag=darwin-x86_64 ;;
*) echo "rsync: unsupported build host $(uname -s)" >&2; exit 1 ;;
esac
tc="$ndk/toolchains/llvm/prebuilt/$host_tag/bin"
if [ ! -d "$tc" ]; then
echo "rsync: NDK toolchain not found at $tc" >&2
exit 1
fi
work="$root/rsync/work"
tarball="$root/rsync/rsync-${RSYNC_VERSION}.tar.gz"
src="$work/rsync-${RSYNC_VERSION}"
# Fetch and verify the pinned source tarball.
mkdir -p "$work"
if [ ! -f "$tarball" ]; then
echo "rsync: fetching $RSYNC_URL"
curl -fsSL "$RSYNC_URL" -o "$tarball"
fi
echo "rsync: verifying sha256"
( cd "$root/rsync" && sha256sum -c "rsync-${RSYNC_VERSION}.tar.gz.sha256" )
# No system libraries, no docs (md2man needs python3), no iconv.
flags="--disable-md2man --disable-openssl --disable-xxhash --disable-zstd \
--disable-lz4 --disable-iconv --disable-acl-support --disable-xattr-support \
--with-included-popt --with-included-zlib"
for abi in $ABIS; do
case "$abi" in
arm64-v8a) host=aarch64-linux-android cc="aarch64-linux-android${ANDROID_MIN_SDK}-clang" ;;
armeabi-v7a) host=arm-linux-androideabi cc="armv7a-linux-androideabi${ANDROID_MIN_SDK}-clang" ;;
x86_64) host=x86_64-linux-android cc="x86_64-linux-android${ANDROID_MIN_SDK}-clang" ;;
x86) host=i686-linux-android cc="i686-linux-android${ANDROID_MIN_SDK}-clang" ;;
*) echo "rsync: unknown ABI $abi" >&2; exit 1 ;;
esac
# Fresh build tree per ABI.
rm -rf "$src"
tar xzf "$tarball" -C "$work"
echo "rsync: configuring $abi"
( cd "$src" && \
CC="$tc/$cc" AR="$tc/llvm-ar" RANLIB="$tc/llvm-ranlib" \
CFLAGS="-O2 -fPIE -ffile-prefix-map=$src=." LDFLAGS="-pie" \
./configure --host="$host" $flags >/dev/null )
echo "rsync: building $abi"
( cd "$src" && make -s rsync )
dest="$root/app/src/main/jniLibs/$abi"
mkdir -p "$dest"
cp "$src/rsync" "$dest/libxrsync.so"
"$tc/llvm-strip" "$dest/libxrsync.so"
echo "rsync: $abi -> jniLibs/$abi/libxrsync.so"
done
|