#!/bin/sh

set -e

export LANG=C
export LC_ALL=C

cleanup() {
  rm -rf "$INCLUDE_DIRS_TMPFILE"
}

trap cleanup TERM INT EXIT

DEST="${DEST:-$PWD}"

CMAKE_CACHE_FILE="${1:-CMakeCache.txt}"
CMAKE_CXX_COMPILER="$(sed -n -e 's/CMAKE_CXX_COMPILER:FILEPATH=\(.*\)$/\1/p' "$CMAKE_CACHE_FILE")"
CMAKE_C_COMPILER="$(sed -n -e 's/CMAKE_C_COMPILER:FILEPATH=\(.*\)$/\1/p' "$CMAKE_CACHE_FILE")"

INCLUDE_DIRS_PREFIX="${2:-$DEST}"
INCLUDE_DIRS_TMPFILE="$(mktemp -p "$DEST" include_dirs_XXXXXXXXXX.txt)"
INCLUDE_DIRS_FILE="${INCLUDE_DIRS_FILE:-$DEST/include_dirs.txt}"

C_BUILTIN_FILE="${C_BUILTIN_FILE:-$DEST/builtins.h}"
CXX_BUILTIN_FILE="${CXX_BUILTIN_FILE:-$DEST/builtins.hpp}"

if [ -z "${RSYNC+x}" ]; then
  RSYNC=rsync
fi

{
  {
    echo | "$CMAKE_CXX_COMPILER" -xc++ -E -Wp,-v - 2>&1;
    echo | "$CMAKE_C_COMPILER" -xc -E -Wp,-v - 2>&1;
  } \
  | sed -n -e 's/\s\+\(\/.*$\).*/\1/p';
  
  sed -n -e 's/.*_INCLUDE_DIRS:INTERNAL=\(.*\)$/\1/p' "$CMAKE_CACHE_FILE";
} \
| sed 's/;/\n/g' |  sed '/^$/d' | sort -u 2>/dev/null 1> "$INCLUDE_DIRS_TMPFILE"

{
  echo '#include <...> search starts here:'
  # shellcheck disable=SC1117
  sed -n -e "s@\(.*\)@$INCLUDE_DIRS_PREFIX\1@p" "$INCLUDE_DIRS_TMPFILE"
  echo 'End of search list.'
} > "$INCLUDE_DIRS_FILE"

if [ -n "$RSYNC" ]; then
  "$RSYNC" -arR --files-from="$INCLUDE_DIRS_TMPFILE" / "$DEST"
  echo "Include folders copied to $DEST" >&2
fi

"$CMAKE_C_COMPILER" -xc -dM -E - < /dev/null > "$C_BUILTIN_FILE"
echo "C Compiler built-ins written to $C_BUILTIN_FILE" >&2
"$CMAKE_CXX_COMPILER" -xc++ -dM -E - < /dev/null > "$CXX_BUILTIN_FILE"
echo "C++ Compiler built-ins written to $CXX_BUILTIN_FILE" >&2