#!/usr/bin/env bash

set -eo pipefail

[[ -n "$SCRATCH_DIR" && -n "$DRIVER_DIR" && -n "$OUTPUT_DIR" ]] || {
    echo >&2 "SCRATCH_DIR, DRIVER_DIR and OUTPUT_DIR all need to be set"
    exit 1
}

DOCKERIZED=${DOCKERIZED:-0}
DRIVER_SCRATCH="${SCRATCH_DIR}/src"
BUILD_SCRATCH="${SCRATCH_DIR}/cmake-build"

modfiles0() (
    local dir="${1:-${DRIVER_SCRATCH}/driver}"
    cd "$dir"
    find . -type f \( -name 'Makefile' -o -name '*.c' -o -name '*.h' \) -print0 \
        | LC_ALL=C sort -z
)

get_module_version() (
    # MODULE_VERSION would be more readable, but it would clash with a
    # variable exported from our CI. Beware!
    if [[ -n "$M_VERSION" ]]; then
        echo "$M_VERSION"
    else
        modfiles0 "$@" \
            | xargs -0 sha256sum \
            | awk '{print$1 " " $2}' \
            | sha256sum \
            | awk '{print$1}'
    fi
)

archive_dockerized() {
    local source_archive

    source_archive="${OUTPUT_DIR}/${module_version}/"
    if [[ ! -d "$source_archive" ]]; then
        mkdir -p "$source_archive" "$source_archive"/bpf

        cp ./*.c ./*.h Makefile "$source_archive"
        cp bpf/*.c bpf/*.h bpf/Makefile "$source_archive"/bpf
    else
        echo "Duplicate version '${module_version}' detected, skipping..."
    fi
}

archive_ci() {
    local source_archive

    source_archive="${OUTPUT_DIR}/${module_version}.tgz"
    if [[ -s "$source_archive" ]]; then
        exit 0
    fi

    modfiles0 . | xargs -0 tar cfvz "$source_archive" >&2
}

archive_files() {
    if ((DOCKERIZED)); then
        archive_dockerized
    else
        archive_ci
    fi
}

rm -rf "$DRIVER_SCRATCH" "$BUILD_SCRATCH" 2> /dev/null || true
mkdir -p "$DRIVER_SCRATCH" "$BUILD_SCRATCH"
cp -r "${DRIVER_DIR}/." "${DRIVER_SCRATCH}"

cd "$BUILD_SCRATCH"
cmake \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_C_FLAGS="-fno-pie" \
    -DPROBE_NAME=collector \
    -DBUILD_USERSPACE=OFF \
    -DBUILD_DRIVER=ON \
    -DENABLE_DKMS=OFF \
    -DBUILD_BPF=ON \
    "$DRIVER_SCRATCH"
# Copy a few files generated by cmake to the source directory.
cp "${BUILD_SCRATCH}/driver/src/Makefile" "${DRIVER_SCRATCH}/driver/Makefile"
cp "${BUILD_SCRATCH}/driver/src/driver_config.h" "${DRIVER_SCRATCH}/driver/driver_config.h"

cd "${DRIVER_SCRATCH}/driver"
module_version="$(get_module_version .)"
echo "$module_version"

archive_files
