#!/bin/sh
#
# Copyright (c) 2020-now by the Zeek Project. See LICENSE for details.

set -o errexit
set -o nounset

BINDIR=$(dirname "$0")
while [ $# -ne 0 ]; do
    case "$1" in
        --bindir) BINDIR=$2; shift 2;;
    esac
done

HILTI_CONFIG=${BINDIR}/hilti-config
SPICY_CONFIG=${BINDIR}/spicy-config

for config in "${HILTI_CONFIG}" "${SPICY_CONFIG}"; do
    if [ ! -x "${config}" ]; then
        echo "${config} is not an executable file"
        exit 1
    fi
done

# Helper function to from a given Spicy `*-config` executable determine the location of a header.
search_header() {
    config=$1
    header=$2;

    for flag in $(${config} --cxxflags); do
        if ! echo "${flag}" | grep -q '^-I'; then
            continue
        fi
        dir=${flag#??}
        if [ -e "${dir}/${header}" ]; then
            location=${dir}/${header}
        fi
    done

    if [ -z "${location+x}" ]; then
        echo "Error: could not determine location of ${header}"
        exit 1
    fi

    echo "${location}"
}

LIBHILTI=$(search_header "${HILTI_CONFIG}" hilti/rt/libhilti.h)
LIBSPICY=$(search_header "${SPICY_CONFIG}" spicy/rt/libspicy.h)

# Extract version from `hilti-config`. It should be identical to the one from `spicy-config`.
VERSION=$(${HILTI_CONFIG} --version | cut -d ' ' -f1)

# The cache is read from the environment variable `SPICY_CACHE`
# if set; else a patch under the user's home directory is used.
CACHE=${SPICY_CACHE:-$HOME/.cache/spicy/${VERSION}}

rm -rf "${CACHE}"
mkdir -p "${CACHE}"

# NOTE: The compiler invocations here should be kept in sync
# with what we do in `CMakeLists.txt`.
#
# Precompiling libspicy.h causes the following warnings with GCC:
#
#     error: #pragma once in main file [-Werror]
#
# Disable -Werror explicitly here to avoid this. It's fixed with GCC 14.
# (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47857)
cp "${LIBHILTI}" "${CACHE}/precompiled_libhilti_debug.h"
$("${HILTI_CONFIG}" --cxx --cxxflags --debug) -x c++-header "${LIBHILTI}" -o "${CACHE}/precompiled_libhilti_debug.h.gch"

cp "${LIBHILTI}" "${CACHE}/precompiled_libhilti.h"

$("${HILTI_CONFIG}" --cxx --cxxflags) -x c++-header "${LIBHILTI}" -o "${CACHE}/precompiled_libhilti.h.gch"

cp "${LIBSPICY}" "${CACHE}/precompiled_libspicy_debug.h"
$("${SPICY_CONFIG}" --cxx --cxxflags --debug) -x c++-header "${LIBSPICY}" -Wno-error -o "${CACHE}/precompiled_libspicy_debug.h.gch"

cp "${LIBSPICY}" "${CACHE}/precompiled_libspicy.h"
$("${SPICY_CONFIG}" --cxx --cxxflags) -x c++-header "${LIBSPICY}" -Wno-error -o "${CACHE}/precompiled_libspicy.h.gch"
