#!/bin/sh

#Build Static Nginx aarch64 Binary

PCRE_TAG=8.45
OPENSSL_TAG=3.0.0
ZLIB_TAG=1.2.11
LIBATOMIC_OPS_TAG=7.6.12
NGINX_TAG=1.21.3
STANDARD="c++17"

base_dir=$(cd $(dirname $0) && pwd)
install_dir="${base_dir}/aarch64_dev"
include_dir="${install_dir}/include"
lib_dir="${install_dir}/lib"
result_dir="${base_dir}/aarch64_result"

custom_flags_set() {
    CXXFLAGS="-std=${STANDARD}"
    CPPFLAGS="--static -static -I${include_dir}"
    LDFLAGS="--static -static -Wl,--no-as-needed -L${lib_dir} -lpthread -pthread"
    LD_LIBRARY_PATH="-L${lib_dir}"
    PKG_CONFIG_PATH="-L${lib_dir}/pkgconfig"
}

custom_flags_reset() {
    CXXFLAGS="-std=${STANDARD}"
    CPPFLAGS=""
    LDFLAGS=""
}

custom_flags_reset

build_libs() {
    #zLib
    [ ! -e ${base_dir}/aarch64_dev/lib/libz.a ] && {
        [ ! -e ${base_dir}/zlib-${ZLIB_TAG} ] && curl -sSL "https://zlib.net/zlib-${ZLIB_TAG}.tar.gz" | tar zxvf -
        cd zlib-${ZLIB_TAG}
        custom_flags_set
        make clean
        CC=aarch64-linux-musl-gcc ./configure --prefix=${install_dir} --static
        make -j"$(nproc)" CXXFLAGS="${CXXFLAGS}" CPPFLAGS="${CPPFLAGS}" LDFLAGS="${LDFLAGS}"
        make install
        cd ..
    }

    #libssl
    [ ! -e ${base_dir}/aarch64_dev/lib/libssl.a ] && {
        [ ! -e ${base_dir}/openssl-${OPENSSL_TAG} ] && curl -sSL "https://www.openssl.org/source/openssl-${OPENSSL_TAG}.tar.gz" | tar zxvf -
        cd openssl-${OPENSSL_TAG}
        custom_flags_set
        make clean
        ./Configure linux-aarch64 --cross-compile-prefix=aarch64-linux-musl- --prefix=${install_dir} threads no-shared no-dso no-comp CXXFLAGS="${CXXFLAGS}" CPPFLAGS="${CPPFLAGS}" LDFLAGS="${LDFLAGS}"
        make -j$(nproc)
        make install_sw
        cd ..
    }

    #pcre
        [ ! -e ${base_dir}/aarch64_dev/lib/libpcre.a ] && {
            [ ! -e ${base_dir}/pcre-${PCRE_TAG} ] && curl -sSL "https://ftp.pcre.org/pub/pcre/pcre-${PCRE_TAG}.tar.gz" | tar zxvf -
            cd pcre-${PCRE_TAG}
            custom_flags_reset
            make clean
            ./configure --prefix=${install_dir} --disable-shared --host=aarch64-linux-musl
            make -j$(nproc)
            make install
            cd ..
        }

    #libatomic_ops
        [ ! -e ${base_dir}/aarch64_dev/lib/libatomic_ops.a ] && {
            [ ! -e ${base_dir}/libatomic_ops-${LIBATOMIC_OPS_TAG} ] && curl -sSL "https://github.com/ivmai/libatomic_ops/releases/download/v${LIBATOMIC_OPS_TAG}/libatomic_ops-${LIBATOMIC_OPS_TAG}.tar.gz" | tar zxvf -
            cd libatomic_ops-${LIBATOMIC_OPS_TAG}
            custom_flags_set
            make clean
            CC=aarch64-linux-musl-gcc CXX=aarch64-linux-musl-g++ \
            ./configure --prefix=${install_dir} --disable-shared --host=aarch64-linux-musl \
            CPPFLAGS="${CPPFLAGS}" LDFLAGS="${LDFLAGS}"
            make -j$(nproc)
            make install
            cd ..
        }

}

build_nginx() {
    [ ! -e ${base_dir}/nginx-${NGINX_TAG} ] && curl -sSL "http://nginx.org/download/nginx-${NGINX_TAG}.tar.gz" | tar zxvf -
    cd nginx-${NGINX_TAG}
    custom_flags_set
    make clean
    ./configure --prefix=/usr/local --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/var/log/nginx_error.log --http-log-path=/var/log/nginx_access.log --pid-path=/run/nginx.pid --lock-path=/run/nginx.lock --with-openssl-opt="linux-aarch64 --cross-compile-prefix=aarch64-linux-musl-" --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-stream_realip_module --with-stream_ssl_preread_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-pcre-jit --with-libatomic --with-compat --with-file-aio --with-threads --with-poll_module --with-select_module --with-cc-opt="${CPPFLAGS}" --with-ld-opt="${LDFLAGS}" --add-module=../ngx_brotli --with-openssl=${base_dir}/openssl-${OPENSSL_TAG}
    [ $? -ne 0 ] && exit 1
    make -j$(nproc) CC=aarch64-linux-musl-gcc CXX=aarch64-linux-musl-g++ AR=aarch64-linux-musl-ar CPPFLAGS="${CPPFLAGS}" LDFLAGS="${LDFLAGS}"
    [ $? -ne 0 ] && exit 2
    cd objs
    aarch64-linux-musl-strip nginx
    ls -la
    file ./nginx
    [ ! -e $result_dir ] && mkdir -p $result_dir
    cp ./nginx ${result_dir}/nginx_static_${NGINX_TAG}
}

[ -n "$1" -a "$1" = "reset" ] && {
    build_libs
}

build_nginx