diff options
Diffstat (limited to 'rsync/build.sh')
| -rwxr-xr-x | rsync/build.sh | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/rsync/build.sh b/rsync/build.sh new file mode 100755 index 0000000..1160e74 --- /dev/null +++ b/rsync/build.sh @@ -0,0 +1,67 @@ +#!/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 +tc="$ndk/toolchains/llvm/prebuilt/linux-x86_64/bin" + +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 |