#!/bin/sh
#
# configure script for ghdl (c) 2014 Tristan Gingold
#

backend=mcode
CC=${CC:-gcc}
CFLAGS=${CFLAGS:--g}
GNATMAKE=${GNATMAKE:-gnatmake}
prefix=/usr/local
libdirsuffix=lib/ghdl
libdirreverse=../..
gcc_src_dir=
gcc_version=unknown
llvm_prefix=
build=

show_help=no
progname=$0

subst_vars="CC GNATMAKE CFLAGS build srcdir prefix backend libdirsuffix libdirreverse gcc_src_dir llvm_prefix"

# Find srcdir
srcdir=`dirname $progname`
if test x$srcdir = x; then
    srcdir=.
fi

# Check echo -n / echo \c
if test x`echo -n` = x"-n" ; then
  echon=
  echoc="\c"
else
  echon="-n"
  echoc=
fi

# Read gcc version from README file
gcc_version=`grep '^gcc version' $srcdir/README |
 sed -e 's/gcc version \([0-9.]*\) \[.*\]\.$/\1/'`

# Decode options
for opt do
  optarg=`expr x$opt : 'x[^=]*=\(.*\)'`
  case "$opt" in
      CC=*|CFLAGS=*|GNATMAKE=*)
        optvar=`expr x$opt : 'x\([^=]*\)=.*'`
	eval $optvar="$optarg"
	;;
      --prefix=*) prefix="$optarg";;
      --srcdir=*) srcdir="$optarg";;
      --with-gcc=*) gcc_src_dir="$optarg"; backend=gcc;;
      --with-llvm=*) llvm_prefix="$optarg"; backend=llvm;;
      -h|-help|--help) show_help=yes;;
      *) echo "$0: unknown option $opt; try $0 --help"
	  exit 1
	  ;;
  esac
done

# Help
if test $show_help != no; then
cat <<EOF
Usage: configure [options]

Options [defaults in brackets]:
  --prefix=PREFIX   install in PREFIX [$prefix]
  --srcdir=SRCDIR   source code path [$srcdir]
  --with-gcc=DIR    use gcc backend from DIR (needs gcc $gcc_version)
  --with-llvm=DIR   use llvm installed in DIR
EOF
exit 0
fi

# Sanity checks
# Check that gnatmake exists
if ! $GNATMAKE 2> /dev/null; then
    echo "Sorry, you need GNAT to build GHDL.  See the README"
    echo "(gnatmake executable is: $GNATMAKE)"
    exit 1
fi

# Check that compiler exists
if ! $CC -v 2> /dev/null; then
    echo "Sorry, you need a C compiler to build GHDL.  See the README"
    exit 1
fi

# For mcode, check that gcc emits i386
if test $backend = mcode; then
    if ! $CC $CFLAGS -dumpmachine | grep -q "[3-6]86"; then
	echo "WARNING: GHDL for mcode is supported only on x86 (32 bits)"
	echo "continuing, but build failure expected (See the README)"
    fi
fi

# For gcc backend, check version
if test $backend = gcc; then
    if ! test -f $gcc_src_dir/gcc/BASE-VER; then
	echo "cannot found gcc/BASE-VER in $gcc_src_dir"
	exit 1
    fi
    base_ver=`cat $gcc_src_dir/gcc/BASE-VER`
    if test x$base_ver != x$gcc_version; then
	echo "Mismatch gcc version from $gcc_src_dir"
	echo "Need gcc version $gcc_version"
	exit 1
    fi
fi

# For llvm backend, check llvm-config
if test $backend = llvm; then
    llvm_cmd="$llvm_prefix/bin/llvm-config --version"
    if ! $llvm_cmd 2> /dev/null; then
	echo "cannot run $llvm_cmd"
	exit 1
    fi
fi

# Compute build machine
if test x$build = x; then
    build=`$CC $CFLAGS -dumpmachine`
fi
echo "Build machine is: $build"

# Generate config.status
rm -f config.status
{
echo "#! /bin/sh"
echo "# Generated by configure."
echo "# Run this file to recreate the current configuration."
echo
echo "# Generated by:"
echo $echon "# $progname"$echoc
for opt do
  echo $echon " $opt"$echoc
done
echo
echo
echo subst_vars=\"$subst_vars\"
for v in $subst_vars; do
    eval vval=\$$v
    echo $v="$vval"
done
echo
echo 'sed_opts=""'
echo 'for v in $subst_vars; do'
echo '  eval vval=\$$v'
echo '  sed_opts="$sed_opts -e s%@${v}@%$vval%g"'
echo 'done'
echo
echo 'echo "Creating ghdl.gpr"'
echo 'sed $sed_opts < $srcdir/ghdl.gpr.in > ghdl.gpr'
echo 'echo "Creating Makefile"'
echo 'sed $sed_opts < $srcdir/Makefile.in > Makefile'
} > config.status || \
{
  echo "$progname: cannot create config.status"
  exit 1
}

chmod +x ./config.status

# Run config.status to generate files
if ! sh ./config.status; then
    echo "$progname: cannot execute config.status"
    exit 1
fi

# Generate ortho_code-x86-flags
if test $backend = mcode; then
    case "$build" in
	*darwin*) ortho_flags="Flags_Macosx" ;;
	*mingw32*) ortho_flags="Flags_Windows" ;;
	*linux*) ortho_flags="Flags_Linux" ;;
	*) echo "Unsupported $build build for mcode"; exit 1;;
    esac
    echo "Generate ortho_code-x86-flags.ads"
    {
     echo "with Ortho_Code.X86.$ortho_flags;"
     echo "package Ortho_Code.X86.Flags renames Ortho_Code.X86.$ortho_flags;"
    } > ortho_code-x86-flags.ads
fi

# Generate default_pathes.ads
echo "Generate default_pathes.ads"
curdir=`pwd`
sed -e "s%@COMPILER_GCC@%ghdl1-gcc%" \
    -e "s%@COMPILER_DEBUG@%ghdl1-debug%" \
    -e "s%@COMPILER_MCODE@%ghdl1-mcode%" \
    -e "s%@COMPILER_LLVM@%ghdl1-llvm%" \
    -e "s%@POST_PROCESSOR@%oread-gcc%" \
    -e "s%@INSTALL_PREFIX@%$prefix%" \
    -e "s%@LIB_PREFIX@%$libdirsuffix%" \
    < $srcdir/src/ghdldrv/default_pathes.ads.in > default_pathes.ads

exit 0