#!/usr/bin/bash

#
# Usage:
#       
#

usage() {
    echo "Usage:"
    echo
    echo "$0 <VEORUN_BIN> <lib1.a> [<lib2.a> ...]"
    echo
    exit 1
}

option_end=0
LIBS=()
EXTRA_LIBS=()
VEORUN=''
VELIBDIR=${VELIBDIR:-/opt/nec/ve/lib}
VELIBEXECDIR=${VELIBEXECDIR:-/opt/nec/ve/veos/libexec}
RPATH=/opt/nec/ve/lib
OPT_ARCH=${OPT_ARCH:-}
OPT_ABI=${OPT_ABI:-}
default_LDFLAGS="-pthread -Wl,-rpath,$RPATH -lveio"
default_CFLAGS="$OPT_ARCH $OPT_ABI"
is_openmp=0
VERBOSE=
while [ $# -gt 0 ]; do
  option="$1"
  if [ $option_end -eq 0 ]; then
    case "$option" in
    '--')
      option_end=1
      ;;
    '-h' | '--help')
      usage
      ;;
    '-o')
      VEORUN="$2"
      shift
      ;;
    '-v')
      VERBOSE=-v
      ;;
    '-traceback'*)
      default_CFLAGS="${default_CFLAGS} ${option}"
      ;;
    '-fopenmp')
      default_LDFLAGS="${default_LDFLAGS} ${option} $VELIBDIR/liburpcVE_omp.a"
      is_openmp=1
      ;;
    '-ftrace')
      default_CFLAGS="${default_CFLAGS} ${option}"
      ;;
    '-L'*|'-l'*|'-Wl,'*)
      default_LDFLAGS="${default_LDFLAGS} ${option}"
      ;;
    '--link-nosym='*)
      # Bash 4.2 (on RHEL/CentOS7) does not support readarray with -d.
      _extralibs=()
      while read -rd,; do _extralibs+=("$REPLY"); done \
        <<< "${option#--link-nosym=},"
      EXTRA_LIBS=("${EXTRA_LIBS[@]}" "${_extralibs[@]}")
      ;;
    '-*')
      EXTRA_LIBS=("${EXTRA_LIBS[@]}" "$option")
      ;;
    *)
      LIBS=(${LIBS[@]} "$option")
      ;;
    esac
    shift
  else
    LIBS=(${LIBS[@]} "$option")
  fi
done
if [ $is_openmp -eq 0 ]; then
    default_LDFLAGS="${default_LDFLAGS} $VELIBDIR/liburpcVE.a"
fi
default_LDFLAGS="${default_LDFLAGS} -ldl"

if [ -z "$VEORUN" ]; then
  if [ ${#LIBS[@]} -lt 2 ]; then
    usage
  fi
  VEORUN="${LIBS[0]}"
  unset LIBS[0]
else
  if [ ${#LIBS[@]} -lt 1 ]; then
    usage
  fi
fi

VECC=${VECC:-/opt/nec/ve/bin/ncc}
VECXX=${VECXX:-/opt/nec/ve/bin/nc++}
VEFC=${VEFC:-/opt/nec/ve/bin/nfort}
# find an appropriage linker
default_CCLD="$VECC"
# try Fortran compiler
VEFC=$(which $VEFC 2>/dev/null)
if [ $? -eq 0 ]; then
  default_CCLD="$VEFC"
  default_LDFLAGS="-cxxlib ${default_LDFLAGS}"
else
  # if Fortran compiler (nfort) is not found, try C++ compiler
  VECXX=$(which $VECXX 2>/dev/null)
  if [ $? -eq 0 ]; then
    default_CCLD="$VECXX"
  fi
fi

VENM=${VENM:-/opt/nec/ve/bin/nnm}
VECCLD=${VECCLD:-${default_CCLD}}
CFLAGS="${CFLAGS:-${default_CFLAGS}} ${VERBOSE}"
LDFLAGS=${LDFLAGS:-${default_LDFLAGS}}

SRC_FILE=$(mktemp /tmp/veorunXXXXXXX.c)
OBJ_FILE=${SRC_FILE/.c/.o}
trap "rm -f $SRC_FILE $OBJ_FILE" EXIT

RELINKVEO_GEN=${RELINKVEO_GEN:-$VELIBEXECDIR/gen_veorun_static_symtable}
RELINKVEO_LIB=${RELINKVEO_LIB:-$VELIBDIR/libaveoVE.a}

$RELINKVEO_GEN "${VENM}" "${LIBS[@]}" > $SRC_FILE

$VECC $CFLAGS -c $SRC_FILE -o $OBJ_FILE
$VECCLD $CFLAGS -v -o $VEORUN $OBJ_FILE "${LIBS[@]}" "${EXTRA_LIBS[@]}" \
  $RELINKVEO_LIB -L$VELIBDIR $LDFLAGS && echo "created specific $VEORUN"
