123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- #!/bin/sh
- # Fedora
- # dnf install wget git make which patch findutils unzip
- # Ubuntu
- # apt install wget git build-essential unzip time python
- # ./android_do
- die() { echo "Error: $1"; exit 1; }
- need() { which "$1" >/dev/null 2>/dev/null || die "Missing $1"; }
- need which
- need wget
- need git
- need make
- need patch
- need find
- need unzip
- need ls
- need uname
- need pwd
- need mkdir
- need rm
- need time
- need rustc
- need cargo
- BUILD_PATH=$(pwd)/build_android
- NDK_VERSION="android-ndk-r25b"
- case $(uname -s) in
- Darwin)
- TYPE=darwin
- ;;
- Linux)
- TYPE=linux
- ;;
- *)
- TYPE=
- ;;
- esac
- if test "x$CJDNS_NDK_PATH" != "x"; then
- false # we already have an ndk path...
- elif test "x$TYPE" = xdarwin; then
- CJDNS_NDK_PATH_HINT=$(echo "$HOME"/Library/Android/sdk/ndk/* | tail -1)
- elif test "x$TYPE" = xlinux; then
- CJDNS_NDK_PATH_HINT=$(echo "$HOME"/Android/Sdk/ndk/* | tail -1)
- fi
- if test "x$CJDNS_NDK_PATH" = "x"; then
- if test "x$CJDNS_NDK_PATH_HINT" != "x" && [ -d "$CJDNS_NDK_PATH_HINT" ]; then
- echo "Using NDK at path $CJDNS_NDK_PATH_HINT"
- CJDNS_NDK_PATH=$CJDNS_NDK_PATH_HINT
- elif [ -d "$BUILD_PATH/$NDK_VERSION/" ]; then
- CJDNS_NDK_PATH="$BUILD_PATH/$NDK_VERSION"
- echo "Using previously downloaded NDK $CJDNS_NDK_PATH"
- else
- echo "No NDK path known, NDK will be downloaded"
- fi
- elif [ -d "$CJDNS_NDK_PATH" ]; then
- echo "Using NDK at specified path $CJDNS_NDK_PATH"
- else
- die "NDK path $CJDNS_NDK_PATH is not a directory"
- fi
- cpu_arch="$(uname -m)"
- [ -z "$cpu_arch" ] && die "NO CPU ARCHITECTURE DETECTED"
- [ "$cpu_arch" = "i686" ] && cpu_arch="x86"
- if test "x$CJDNS_NDK_PATH" = "x"; then
- mkdir "$BUILD_PATH" 2>/dev/null
- cd "$BUILD_PATH"
- filename="$NDK_VERSION-${TYPE}.zip"
- echo "$filename"
- if ! [ -f "$filename" ]; then
- url="https://dl.google.com/android/repository/$NDK_VERSION-${TYPE}.zip"
- wget "$url" || die "wget $url failed"
- fi
- if ! [ -d "$NDK_VERSION" ]; then
- unzip -q "$filename" || die "failed to unzip "
- fi
- CJDNS_NDK_PATH="$BUILD_PATH/$NDK_VERSION"
- [ -d "$CJDNS_NDK_PATH" ] || die "NDK zip file does not contain expected content"
- cd ..
- fi
- BUILD_0='
- APP_ABI=armv7a
- RUST_TARGET=armv7-linux-androideabi
- EABI=androideabi
- VERSION=26
- '
- BUILD_1='
- APP_ABI=aarch64
- VERSION=26
- '
- BUILD_2='
- APP_ABI=i686
- VERSION=26
- '
- BUILD_3='
- APP_ABI=x86_64
- VERSION=26
- '
- # https://github.com/rust-lang/rust/pull/85806
- find "${BUILD_PATH}" -name 'libunwind.a' | \
- sed 's@libunwind.a$@libgcc.a@' | \
- while read x; do
- echo "INPUT(-lunwind)" > $x
- done
- for i in $(seq 0 100); do
- BUILD=$(eval echo "\$BUILD_$i")
- if test "x$BUILD" = "x"; then
- continue
- fi
- RUST_TARGET=
- APP_ABI=
- VERSION=
- EABI=android
- export $BUILD
- if test "x$RUST_TARGET" = "x"; then
- RUST_TARGET="$APP_ABI-linux-$EABI"
- fi
- if ! [ -d "$(rustc --target "$RUST_TARGET" --print target-libdir)" ]; then
- echo
- echo "Skipping $RUST_TARGET because we dont have that toolchain"
- echo "Use: \`rustup target add $RUST_TARGET\` to install it"
- echo
- echo
- continue
- fi
- CROSS_PATH=$CJDNS_NDK_PATH/toolchains/llvm/prebuilt/${TYPE}-${cpu_arch}/bin
- CROSS_PREFIX=${CROSS_PATH}/llvm
- export CC=${CROSS_PATH}/${APP_ABI}-linux-${EABI}${VERSION}-clang
- # Used by cjdns nodejs build
- export SYSTEM=linux
- export CROSS=1
- # Used by cjdns libuv build AND sodiumoxide
- export AR=${CROSS_PREFIX}-ar
- export RANLIB=${CROSS_PREFIX}-ranlib
- # Whatever target we happen to be using, use CC as the linker
- export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=$CC
- export CARGO_TARGET_I686_LINUX_ANDROID_LINKER=$CC
- export CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER=$CC
- export CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER=$CC
- echo "Compiler CC: $CC - $(${CC} --version)"
- cargo build --release -v --target "$RUST_TARGET"
- done
|