#!/usr/bin/sh
#
# configure
# Copyright (C) 2005-2006 Robin KAY. All rights reserved.
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License, Version 1.0 only
# (the "License").  You may not use this file except in compliance
# with the License.
#

# Parse command line arguments
while test $# -gt 0; do
  case "$1" in
    --prefix=*)
      PREFIX=`echo "$1" | sed 's/^--prefix=//'`
      ;;
    --bindir=*)
      BINDIR=`echo "$1" | sed 's/^--bindir=//'`
      ;;
    --libdir=*)
      LIBDIR=`echo "$1" | sed 's/^--libdir=//'`
      ;;
    --mandir=*)
      MANDIR=`echo "$1" | sed 's/^--mandir=//'`
      ;;
    --target=*)
      TARGET=`echo "$1" | sed 's/^--target=//'`
      ;;
    *)
      cat 1>&2 <<EOF
Usage: ./configure [options ...]

Options:
  --prefix=PATH    installation prefix [/opt/local]
  --bindir=PATH    user executables [PREFIX/bin]
  --libdir=PATH    object code libraries [PREFIX/lib]
  --mandir=PATH    man pages [PREFIX/man]
  --target=ARCH    build programs to run on ARCH [autodetect]

Environment varaibles:
  CC        C compiler
  CFLAGS    C compiler flags
  LDFLAGS   Linker flags
  MAKE      Make utility
  INSTALL   BSD or SYSV install(1M)
EOF
      exit 127
      ;;
  esac
  shift
done

# Initialize variables
DEFAULT_PREFIX=/opt/local
PREFIX=${PREFIX:-$DEFAULT_PREFIX}
BINDIR=${BINDIR:-$PREFIX/bin}
LIBDIR=${LIBDIR:-$PREFIX/lib}
MANDIR=${MANDIR:-$PREFIX/man}
TARGET=${TARGET:-`uname -p`}

MAKE=${MAKE:-make}
MAKEFILE_LOGIC=Makefile.logic
MAKEFILE=Makefile

# Get list of ISAs from target name
case $TARGET in
  sparc)
    TARGET_ARCH_TYPES="SPARC SPARCV9"
    ;;
  i386)
    TARGET_ARCH_TYPES="386 AMD64"
    ;;
  *)
    echo 1>&2 "$0: Target architecture unsupported ($TARGET)".
    exit 127
    ;;
esac

# Find suitable compiler and determine type
CC=${CC:-"cc gcc"}
CONFTEST_C=conftest.$$.c
CONFTEST_OUT=conftest.$$.out
if test "`(cat >$CONFTEST_C <<EOF
#include <stdlib.h>
int main(int argc, char **argv)
{return EXIT_SUCCESS;}
EOF
) 2>/dev/null || echo ERROR`" = "ERROR"; then
  echo 1>&2 $0: Unable to create temporary file.
  exit 127
fi
for CC in $CC; do
  if ($CC -v) 2>&1 | grep gcc >/dev/null; then
    CC_TYPE=GCC
  else
    CC_TYPE=CC
  fi
  
  SUPPORTED_ARCH_TYPES=
  for ARCH_TYPE in $TARGET_ARCH_TYPES; do
    if $MAKE -f $MAKEFILE_LOGIC conftest \
         CONFTEST_C=$CONFTEST_C CONFTEST_OUT=$CONFTEST_OUT \
         CC=$CC CC_TYPE=$CC_TYPE ARCH_TYPE=$ARCH_TYPE \
         >/dev/null 2>/dev/null; then
      SUPPORTED_ARCH_TYPES="$SUPPORTED_ARCH_TYPES$ARCH_TYPE "
    fi
    rm -f $CONFTEST_OUT
  done
  
  if test "$SUPPORTED_ARCH_TYPES"; then
    break
  fi
done
rm -f $CONFTEST_C
if test -z "$SUPPORTED_ARCH_TYPES"; then
  echo 1>&2 $0: Suitable compiler not found.
  exit 127
fi
FIRST_ARCH_TYPE=`echo $SUPPORTED_ARCH_TYPES | sed 's/ .*$//'`

# Find suitable installer and determine type
INSTALL=${INSTALL:-"install ginstall"}
for INSTALL in $INSTALL; do
  TEMPDIR="tempdir.$$"
  TEMPFILE="tempfile.$$"
  RESULTFILE="$TEMPDIR/`basename $TEMPFILE`"
  ERROR="`(mkdir $TEMPDIR && echo >$TEMPFILE) 2>/dev/null || echo ERROR`"
  if test "$ERROR" = "ERROR"; then
    rmdir $TEMPDIR 2>/dev/null
    rm -f $TEMPFILE 2>/dev/null
    echo 1>&2 $0: Unable to create temporary file.
    exit 127
  fi
  
  if $INSTALL -c $TEMPFILE $TEMPDIR >/dev/null 2>/dev/null && \
     test -f $TEMPDIR/`basename $TEMPFILE`; then
    INSTALL_TYPE=BSD
  elif $INSTALL -f $TEMPDIR $TEMPFILE >/dev/null 2>/dev/null && \
     test -f $TEMPDIR/`basename $TEMPFILE`; then
    INSTALL_TYPE=SYSV
  else
    INSTALL_TYPE=NONE
  fi
  
  rm -f $TEMPFILE $RESULTFILE 2>/dev/null
  rmdir $TEMPDIR 2>/dev/null
  
  if test "$INSTALL_TYPE" != NONE; then
    break
  fi
done

# Generate makefile
cat >$MAKEFILE <<EOF
# This file is generated.
CC                   = $CC
CC_TYPE              = $CC_TYPE
CFLAGS               = $CFLAGS
LDFLAGS              = $LDFLAGS
INSTALL              = $INSTALL
INSTALL_TYPE         = $INSTALL_TYPE
BINDIR               = $BINDIR
LIBDIR               = $LIBDIR
MANDIR               = $MANDIR
MAKEFILE_LOGIC       = $MAKEFILE_LOGIC
MAKEFILE             = $MAKEFILE
SUPPORTED_ARCH_TYPES = $SUPPORTED_ARCH_TYPES
FIRST_ARCH_TYPE      = $FIRST_ARCH_TYPE
include $(MAKEFILE_LOGIC)
EOF

# Print status
echo 1>&2 $0: $MAKEFILE created.
