#! /bin/sh

JINX_MAJOR_VER=0.4

HOST_CFLAGS="-O2 -pipe -fstack-clash-protection"
HOST_CXXFLAGS="${HOST_CFLAGS} -Wp,-D_GLIBCXX_ASSERTIONS"
HOST_LDFLAGS="-Wl,-O1 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now"

TARGET_CFLAGS="$HOST_CFLAGS"
TARGET_CXXFLAGS="$HOST_CXXFLAGS"
TARGET_LDFLAGS="$HOST_LDFLAGS"

if [ -z "$ARCHITECTURE" ]; then
    ARCHITECTURE=x86_64
fi

OS_TRIPLET=$ARCHITECTURE-vinix-mlibc

case "$ARCHITECTURE" in
    x86_64)
        TARGET_CFLAGS="$TARGET_CFLAGS -march=x86-64 -mtune=generic -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer"
        TARGET_CXXFLAGS="$TARGET_CXXFLAGS -march=x86-64 -mtune=generic -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer"
        TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,-z,pack-relative-relocs"
        ;;
esac

post_package_strip() {
    if [ -z "$strip_command" ]; then
        strip_command="${OS_TRIPLET}-strip"
    fi

    for f in $(find "${dest_dir}"); do
        if file "$f" | grep 'not stripped' >/dev/null; then
            echo "* stripping '$f'..."
            stripped_file="$(mktemp)"
            ${strip_command} "$f" -o "$stripped_file"
            chmod --reference="$f" "$stripped_file"
            mv -f "$stripped_file" "$f"
        fi
    done
}

autotools_configure() {
        CFLAGS="$TARGET_CFLAGS" \
        CXXFLAGS="$TARGET_CXXFLAGS" \
        LDFLAGS="$TARGET_LDFLAGS" \
    autotools_configure_noflags "$@"
}

autotools_configure_noflags() {
    if [ -z "${configure_script_path}" ]; then
        configure_script_path="${source_dir}/configure"
    fi

        ac_cv_func_malloc_0_nonnull=yes \
        ac_cv_func_calloc_0_nonnull=yes \
        ac_cv_func_realloc_0_nonnull=yes \
    ${configure_script_path} \
        --host=${OS_TRIPLET} \
        --with-sysroot=${sysroot_dir} \
        --prefix=${prefix} \
        --sysconfdir=/etc \
        --localstatedir=/var \
        --bindir=${prefix}/bin \
        --sbindir=${prefix}/bin \
        --libdir=${prefix}/lib \
        --disable-static \
        --enable-shared \
        --disable-malloc0returnsnull \
        "$@"
}

autotools_recursive_regen() {
    ACLOCAL_INCLUDE=""
    if [ -d ${sysroot_dir}/usr/share/aclocal ]; then
        ACLOCAL_INCLUDE="-I${sysroot_dir}/usr/share/aclocal"
    fi

    for f in $(find . -name configure.ac -o -name configure.in -type f | sort); do
        echo "* autotools regen in '$(dirname $f)'..."
        ( cd "$(dirname "$f")" && autoreconf -fvi "$@" $ACLOCAL_INCLUDE )
    done
}

meson_configure() {
        CFLAGS="$TARGET_CFLAGS" \
        CXXFLAGS="$TARGET_CXXFLAGS" \
        LDFLAGS="$TARGET_LDFLAGS" \
    meson_configure_noflags "$@"
}

meson_configure_noflags() {
    if [ -z "${meson_source_dir}" ]; then
        meson_source_dir="${source_dir}"
    fi

    meson setup "${meson_source_dir}" \
        --cross-file "${base_dir}/build-support/cross_file-$ARCHITECTURE.txt" \
        --prefix=${prefix} \
        --sysconfdir=/etc \
        --localstatedir=/var \
        --libdir=lib \
        --sbindir=bin \
        --buildtype=release \
        -Ddefault_library=shared \
        "$@"
}

cmake_configure() {
        CFLAGS="$TARGET_CFLAGS" \
        CXXFLAGS="$TARGET_CXXFLAGS" \
        LDFLAGS="$TARGET_LDFLAGS" \
    cmake_configure_noflags \
        "$@"
}

cmake_configure_noflags() {
    if [ -z "${cmake_source_dir}" ]; then
        cmake_source_dir="${source_dir}"
    fi

    cmake "${cmake_source_dir}" \
        -DCMAKE_TOOLCHAIN_FILE="${base_dir}/build-support/CMakeToolchain-$ARCHITECTURE.txt" \
        -DCMAKE_INSTALL_PREFIX=${prefix} \
        -DCMAKE_INSTALL_SYSCONFDIR=/etc \
        -DCMAKE_INSTALL_LOCALSTATEDIR=/var \
        -DCMAKE_INSTALL_LIBDIR=lib \
        -DCMAKE_INSTALL_SBINDIR=bin \
        -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED_LIBS=True \
        -DENABLE_STATIC=False \
        -DPKG_CONFIG_EXECUTABLE="/usr/local/bin/$OS_TRIPLET-pkg-config" \
        -GNinja \
        "$@"
}

if [ "$in_container" = true ]; then
    export VMODULES="/tmp/.vmodules"
    mkdir -p "${VMODULES}"/cache
    mkdir -p /tmp/v_$(id -u)
fi

PROD=true
