#!/usr/bin/env bash

set -x
set -euo pipefail

# shellcheck disable=SC1091
. lib.sh

main() {
    local arch="${1}"
    local td
    td="$(mktemp -d)"
    pushd "${td}"

    # fake java and javac, it is not necessary for what we build, but the build
    # script ask for it
    cat << EOF > /usr/bin/java
#!/usr/bin/env bash
echo "java version \"1.7.0\""
echo "OpenJDK Runtime Environment (IcedTea 2.6.9)"
echo "OpenJDK 64-Bit Server VM (build 24.131-b00, mixed mode)"
EOF

    cat << EOF > /usr/bin/javac
#!/usr/bin/env bash
echo "javac 1.7.0"
EOF

    chmod +x /usr/bin/java
    chmod +x /usr/bin/javac

    # more faking
    export ANDROID_JAVA_HOME=/tmp
    mkdir /tmp/lib/
    touch /tmp/lib/tools.jar

    install_packages ca-certificates \
        curl \
        gcc-multilib \
        git \
        g++-multilib \
        libncurses5 \
        libtinfo5 \
        make \
        openssh-client \
        python \
        python3 \
        xz-utils
    purge_list+=(default-jre)

    curl --retry 3 -sSfL https://storage.googleapis.com/git-repo-downloads/repo -O
    chmod +x repo

    # this is the minimum set of modules that are need to build bionic
    # this was created by trial and error
    python3 ./repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_r1

    python3 ./repo sync -c art
    python3 ./repo sync -c bionic
    python3 ./repo sync -c build/make
    python3 ./repo sync -c build/blueprint
    python3 ./repo sync -c build/soong
    python3 ./repo sync -c external/clang
    python3 ./repo sync -c external/compiler-rt
    python3 ./repo sync -c external/elfutils
    python3 ./repo sync -c external/jemalloc
    python3 ./repo sync -c external/libcxx
    python3 ./repo sync -c external/libcxxabi
    python3 ./repo sync -c external/libunwind
    python3 ./repo sync -c external/libunwind_llvm
    python3 ./repo sync -c external/llvm
    python3 ./repo sync -c external/lzma
    python3 ./repo sync -c external/mksh
    python3 ./repo sync -c external/safe-iop
    python3 ./repo sync -c external/valgrind
    python3 ./repo sync -c external/vixl
    python3 ./repo sync -c external/zlib
    python3 ./repo sync -c frameworks/hardware/interfaces
    python3 ./repo sync -c hardware/interfaces
    python3 ./repo sync -c libnativehelper
    python3 ./repo sync -c prebuilts/build-tools
    python3 ./repo sync -c prebuilts/clang/host/linux-x86
    python3 ./repo sync -c prebuilts/clang-tools
    #python3 ./repo sync -c prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9
    #python3 ./repo sync -c prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9
    python3 ./repo sync -c prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8
    python3 ./repo sync -c prebuilts/go/linux-x86
    python3 ./repo sync -c prebuilts/misc
    python3 ./repo sync -c prebuilts/sdk
    python3 ./repo sync -c system/core
    python3 ./repo sync -c system/libhidl
    python3 ./repo sync -c system/tools/hidl

    case "${arch}" in
        arm)
            python3 ./repo sync prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9
        ;;
        arm64)
            python3 ./repo sync prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9
            python3 ./repo sync prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9
        ;;
        x86)
            python3 ./repo sync prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.9
        ;;
        x86_64)
            python3 ./repo sync prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.9
        ;;
    esac

    # avoid build tests
    rm bionic/linker/tests/Android.mk
    rm bionic/tests/Android.mk
    rm bionic/tests/Android.bp
    rm bionic/benchmarks/Android.bp
    rm bionic/tests/libs/Android.bp
    rm bionic/tests/headers/Android.bp
    rm bionic/tests/headers/posix/Android.bp

    sed -i -z -e 's/cc_test {.*}//g' bionic/libc/malloc_debug/Android.bp
    sed -i -z -e 's/cc_test {.*}//g' bionic/libc/malloc_hooks/Android.bp
    sed -i -z -e 's/cc_test_host {.*}//g' bionic/tools/relocation_packer/Android.bp

    export ALLOW_MISSING_DEPENDENCIES=true

    # patch the linker to avoid the error
    # FATAL: kernel did not supply AT_SECURE
    #sed -i -e 's/if (!kernel_supplied_AT_SECURE)/if (false)/g' bionic/linker/linker_environ.cpp

    set +u
    # shellcheck disable=SC1091
    source build/envsetup.sh
    lunch "aosp_${arch}-user"
    mmma bionic/
    mmma external/mksh/
    mmma system/core/toolbox/
    set -u

    if [[ "${arch}" = "arm" ]]; then
        mv out/target/product/generic/system/ /
    else
        mv "out/target/product/generic_${arch}/system"/ /
    fi

    # list from https://elinux.org/Android_toolbox
    for tool in cat chmod chown cmp cp ctrlaltdel date df dmesg du \
        hd id ifconfig iftop insmod ioctl ionice kill ln log ls \
        lsmod lsof lsusb md5 mkdir mount mv nandread netstat notify \
        printenv ps reboot renice rm rmdir rmmod route schedtop sendevent \
        setconsole setprop sleep smd start stop sync top touch umount \
        uptime vmstat watchprops wipe; do
        ln -s /system/bin/toolbox "/system/bin/${tool}"
    done

    echo "127.0.0.1 localhost" > /system/etc/hosts

    purge_packages

    popd

    rm -rf "${td}"
    rm "${0}"
}

main "${@}"
