#!/bin/bash

if [ -z $ANDROID_NDK_ROOT ]; then
	ANDROID_NDK_ROOT=~/Android/Sdk/ndk/26.1.10909125
fi
OPENSSL_VERSION=3.3.1

API_LEVEL=24

BUILD_DIR=out/openssl_android_build

BUILD_TARGETS="x86_64 x86 arm64-v8a armeabi-v7a"

rm -rf out/openssl-${OPENSSL_VERSION}

if [ ! -d out/openssl-${OPENSSL_VERSION} ]
then
    if [ ! -f out/openssl-${OPENSSL_VERSION}.tar.gz ]
    then
        wget https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz -O out/openssl-${OPENSSL_VERSION}.tar.gz | exit 128
    fi
    tar -C out/ -xzf out/openssl-${OPENSSL_VERSION}.tar.gz || exit 128
fi
WORK_DIR=out/openssl-${OPENSSL_VERSION}

##### export ndk directory. Required by openssl-build-scripts #####
export ANDROID_NDK_ROOT
echo ANDROID_NDK_ROOT=$ANDROID_NDK_ROOT

##### build-function #####
build_the_thing() {
    TOOLCHAIN=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64
    export PATH=$TOOLCHAIN/$TRIBLE/bin:$TOOLCHAIN/bin:$PATH
    echo $PATH
    export GLOBAL_OPTIONS="
        no-apps
        no-asm
        no-async
        no-autoerrinit
        no-cmp
        no-cms
        no-comp
        no-deprecated
        no-dgram
        no-docs
        no-dsa
        no-dso
        no-dtls
        no-dynamic-engine
        no-ec2m
        no-egd
        no-engine
        no-err
        no-filenames
        no-gost
        no-http
        no-idea
        no-legacy
        no-md2
        no-md4
        no-module
        no-multiblock
        no-nextprotoneg
        no-ocsp
        no-psk
        no-shared
        no-sock
        no-srp
        no-ssl3
        no-ssl-trace
        no-stdio
        no-tests
        no-thread-pool
        no-threads
        no-trace
        no-ui-console
        no-uplink
        no-weak-ssl-ciphers
        no-zlib
        -Os
        -DOPENSSL_SMALL_FOOTPRINT"
    pwd
    echo "./Configure $SSL_TARGET $OPTIONS $GLOBAL_OPTIONS -fuse-ld=$TOOLCHAIN/bin/ld" && \
    ./Configure $SSL_TARGET $OPTIONS $GLOBAL_OPTIONS -fuse-ld=$TOOLCHAIN/bin/ld no-tests && \
    make clean && \
    make build_generated && \
    make libcrypto.a libssl.a || exit 128
}

##### set variables according to build-tagret #####
for build_target in $BUILD_TARGETS
do
    echo "Building $build_target"
    pwd
    pushd $WORK_DIR || exit 128

    case $build_target in
    armeabi-v7a)
        TRIBLE="arm-linux-androideabi"
        OPTIONS="--target=armv7a-linux-androideabi -ffunction-sections -fdata-sections -Wl,--fix-cortex-a8 -fPIC -D__ANDROID_API__=$API_LEVEL -Wno-macro-redefined"
        DESTDIR="/tmp/$BUILD_DIR/armeabi-v7a"
        SSL_TARGET="android-arm"
        CC=clang
    ;;
    x86)
        TRIBLE="i686-linux-android"
        OPTIONS="-fPIC -ffunction-sections -fdata-sections -D__ANDROID_API__=${API_LEVEL} -Wno-macro-redefined"
        DESTDIR="/tmp/$BUILD_DIR/x86"
        SSL_TARGET="android-x86"
        CC=clang
    ;;
    x86_64)
        TRIBLE="x86_64-linux-android"
        OPTIONS="--static -static -ffunction-sections -fdata-sections -D__ANDROID_API__=${API_LEVEL} -Wno-macro-redefined"
        DESTDIR="/tmp/$BUILD_DIR/x86_64"
        SSL_TARGET="android-x86_64"
        CC=clang
    ;;
    arm64-v8a)
        TRIBLE="aarch64-linux-android"
        OPTIONS="--static -static -ffunction-sections -fdata-sections -fPIC -D__ANDROID_API__=${API_LEVEL} -Wno-macro-redefined"
        DESTDIR="/tmp/$BUILD_DIR/arm64-v8a"
        SSL_TARGET="android-arm64"
        CC=clang
    ;;
    esac

    rm -rf $DESTDIR
    build_the_thing
    popd
#### copy libraries and includes to output-directory #####
    echo WORK_DIR=$WORK_DIR
    rm -rf deps/openssl/android/$build_target/
    mkdir -p deps/openssl/android/$build_target/usr/local/include/
    mkdir -p deps/openssl/android/$build_target/usr/local/lib/
    cp -R $WORK_DIR/include/* deps/openssl/android/$build_target/usr/local/include/
    cp $WORK_DIR/*.a deps/openssl/android/$build_target/usr/local/lib/
done

echo Success