#!/bin/sh

set -e

# Show the usage screen
show_help(){
  cat <<EOF
Usage: $0 [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., FC, FFLAGS...), specify them as
VAR=VALUE. Defaults for the options are specified in brackets.

Options:
  -h, --help              display this help and exit
  --prefix=PREFIX         install files in PREFIX [/usr/local]
  --with-compiler=PROG    use PROG as Fortran compiler [automatically detect]
  --enable-static         statically link programs and libraries [no]
  --disable-static        dynamically link programs and libraries [yes]
  --enable-deterministic  try to make a bit-for-bit deterministic build [no]
  --with-math-font=PATH   specify path to OpenType math font for docs [Libertinus Math]
EOF
}

# Check whether a command exists
check() {
  test -z "$1" && return 1
  printf 'checking for %s... ' "$1"
  command -v "$1" || (echo 'not found'; exit 1)
  return $?
}

# Truncate the current configuration
: > configure.mk

# Parse command line options
for arg in "$@"; do
  case "$arg" in
    -h|--help) show_help; exit 0 ;;
    --prefix=*)
      PREFIX="${arg#*=}"
      printf 'install prefix set to %s\n' "$PREFIX"
      ;;
    --with-compiler=*) FC="${arg#*=}" ;;
    --enable-static) printf 'STATIC=1\n' >> configure.mk ;;
    --disable-static) ;;
    --enable-deterministic) printf 'DETERMINISTIC=1\n' >> configure.mk ;;
    --with-math-font=*) printf 'MATHFONT=%s\n' "${arg#*=}" >> configure.mk ;;
    *=*)
      printf '%s\n' "${arg?}" >> configure.mk
      printf 'set %s\n' "$arg"
      ;;
    *) show_help; exit 1 ;;
  esac
done

# Platform information
printf 'Running on '
case $(uname -s) in
  Linux*) echo 'Linux' ;;
  Darwin*)
    echo 'macOS'
    # static libc is not available on macOS
    printf 'SEMISTATIC=1\n' >> configure.mk ;;
  CYGWIN*|MSYS*|MINGW*) echo 'Windows' ;;
  *) echo 'unknown OS' ;;
esac

os=$(uname -r)
printf 'OS version %s\n' "$os"

# Architecture information
arch=$(uname -m)
printf 'Processor architecture %s\n' "$arch"

# Variables with a default
printf '%s=%s\n' PREFIX "${PREFIX:-/usr/local}" >> configure.mk

# Detect the Fortran compiler
for FC in "$FC" ifx ifort gfortran f77; do
  check "$FC" && break
done
# shellcheck disable=SC2181
if [ $? -ne 0 ]; then
  printf 'Fortran compiler not found: cannot proceed\n'
  exit 1
fi
printf 'using %s as Fortran compiler\n' "$FC"
printf '%s=%s\n' FC "$FC" >> configure.mk

case $FC in
  ifx|ifort)    echo 'INTEL=1' >> configure.mk ;;
  gfortran|f77) echo 'GNU=1' >> configure.mk ;;
esac

# Check whether ar is deterministic by default
if ar h | grep -q '\[D\].*(default)' 2>/dev/null; then
  printf 'AR_DEFAULT_DETERMINISTIC=1\n' >> configure.mk
fi