#!/bin/sh
#//////////////////////////////////////////////////////////////////////////////
#
# Copyright (c) 2007,2009 Daniel Adler <dadler@uni-goettingen.de>, 
#                         Tassilo Philipp <tphilipp@potion-studios.com>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
#//////////////////////////////////////////////////////////////////////////////

# --- configure settings ------------------------------------------------------

PACKAGE=dyncall
CONFIG_PREFIX=/usr/local

# --- output error message ----------------------------------------------------

error() 
{
  echo "error: $*"
  exit 1
}

# --- output warning message --------------------------------------------------

warning()
{
  echo "warning: $*"
}

# --- output info message -----------------------------------------------------

info()
{
  echo "$*"
}

# --- print usage -------------------------------------------------------------

usage()
{
  echo "$PACKAGE configuration shell-script"
  echo "Usage:"
  echo "  configure [ options ]"
  echo
  echo "Options:"
  echo "  --help"
  echo "   -h                print this page"
  echo
  echo "  --prefix=<path>    set installation prefix (GNU make only)"
  echo "  --prefix-bd=<path> set build directory prefix (GNU make only)"
  echo
  echo "  --target-x86       build for x86 architecture platform"
  echo "  --target-x64       build for x64 architecture platform"
  echo "  --target-ppc32     build for ppc32 architecture platform"
  echo "  --target-ppc64     build for ppc64 architecture platform"
  echo "  --target-psp       build for Playstation Portable platform (PSPSDK)"
#  echo "  --target-arm       build for ARM architecture platform (ARM mode)"
  echo "  --target-nds-arm   build for Nintendo DS platform (devkitPro, ARM mode)"
  echo "  --target-nds-thumb build for Nintendo DS platform (devkitPro, THUMB mode)"
  echo "  --target-cygwin    build for cygwin platform"
  echo "  --target-windows   build for windows platform (useful for cygwin)"
  echo "  --target-universal build universal binaries (for Mac OS X/Darwin)"
  echo
  echo "  --tool-gcc         use GNU Compiler Collection"
  echo "  --tool-msvc        use Microsoft Visual C++"
  echo "  --tool-pspsdk      use PSP SDK tool-chain"
  echo 
  echo "  --asm-as           use GNU Assembler"
  echo "  --asm-nasm         use NASM Assembler"
  echo "  --asm-ml           use Microsoft Macro Assembler"
  echo
  echo "  --config-release   build release version (default)"
  echo "  --config-debug     build debug version"
  echo
  exit 0
}

# --- guess operating system -------------------------------------------------

CONFIG_OS=""
guess_os()
{
  OS=`uname -s`
  if [ "$OS" = "WindowsNT" ]; then
    CONFIG_OS="windows"
  elif [ "$OS" = "Darwin" ]; then
    CONFIG_OS="darwin"
  elif [ "$OS" = "CYGWIN_NT-5.1" ]; then
    CONFIG_OS="cygwin"
  elif [ "$OS" = "Linux" ]; then
    CONFIG_OS="linux"
  elif [ "$OS" = "SunOS" ]; then
    CONFIG_OS="sunos"
  elif [ "$OS" = "OpenBSD" ]; then
    CONFIG_OS="openbsd"
  elif [ "$OS" = "FreeBSD" ]; then
    CONFIG_OS="freebsd"
  elif [ "$OS" = "NetBSD" ]; then
    CONFIG_OS="netbsd"
  elif [ "$OS" = "DragonFly" ]; then
    CONFIG_OS="dragonfly"
  fi
  info "guess operating system $CONFIG_OS"
}

# --- guess architecture -----------------------------------------------------

guess_arch()
{
  ARCH=`uname -m`
  if [ "$OS" = "SunOS" ]; then
    if [ "$ARCH" = "i86pc" ] && [ "`isainfo -n`" = "amd64" ]; then
      CONFIG_ARCH="x64"
    else
      CONFIG_ARCH="x86"
    fi
  elif [ "$ARCH" = "Power Macintosh" ] || [ "$ARCH" = "ppc" ] || [ "$ARCH" = "macppc" ]; then
    CONFIG_ARCH="ppc32"
  elif [ "$ARCH" = "x86" ] || [ "$ARCH" = "i386" ] || [ "$ARCH" = "i486" ] || [ "$ARCH" = "i586" ] || [ "$ARCH" = "i686" ] || [ "$ARCH" = "i86pc" ]; then
    CONFIG_ARCH="x86"
  elif [ "$ARCH" = "amd64" ] || [ "$ARCH" = "x86_64" ] || [ "$ARCH" = "x64" ]; then
    CONFIG_ARCH="x64"
#  elif [ "$ARCH" = "cats" ]; then
#    CONFIG_ARCH="arm9e_arm"
  fi
  info "guess arch $CONFIG_ARCH"
}

# --- guess tool chain -------------------------------------------------------

CONFIG_TOOL=""
guess_tool()
{
  CONFIG_TOOL="gcc"
  info "guess tool $CONFIG_TOOL"
}

# --- guess assembler --------------------------------------------------------

CONFIG_ASM=""
guess_asm()
{
  if [ "$CONFIG_TOOL" = "gcc" ]; then
    CONFIG_ASM="as"
  elif [ "$CONFIG_TOOL" = "msvc" ]; then
    CONFIG_ASM="ml"
  fi
  info "guess assembler $CONFIG_ASM"
}

# --- process arguments ------------------------------------------------------

args()
{
  while [ 0 -lt $# ]; do
    OPT=$1
    shift 1
    case $OPT in
      --help|-h)
        usage
        ;;
      --prefix=*)
        CONFIG_PREFIX=`echo $OPT | cut -c 10-` 
        ;;
      --target-universal)
        CONFIG_ARCH=universal
        ;;
      --target-x86)
        CONFIG_ARCH=x86
        ;;
      --target-x64)
        CONFIG_ARCH=x64
        ;;
      --target-ppc32)
        CONFIG_ARCH=ppc32
        ;;
      --target-psp) 
        CONFIG_OS=psp
        CONFIG_ARCH=mips32
        CONFIG_TOOL=gcc
        ;;
#      --target-arm)
#        CONFIG_ARCH=arm9e_arm
#        ;;
      --target-nds-arm)
        CONFIG_OS=nds
        CONFIG_ARCH=arm9e_arm
        CONFIG_TOOL=gcc
        ;;
      --target-nds-thumb)
        CONFIG_OS=nds
        CONFIG_ARCH=arm9e_thumb
        CONFIG_TOOL=gcc
        ;;
      --target-cygwin)
        CONFIG_OS=cygwin
        ;;
      --target-windows)
        CONFIG_OS=windows
        ;;
      --tool-gcc)
        CONFIG_TOOL=gcc
        CONFIG_ASM=gcc
        ;;
      --tool-msvc)
        CONFIG_TOOL=msvc
        CONFIG_ASM=ml
        CONFIG_OS=windows
        ;;
      --tool-pspsdk)
        CONFIG_OS=psp
        CONFIG_ARCH=mips32
        CONFIG_TOOL=pspsdk
        CONFIG_ASM=as
        CONFIG_PREFIX=`psp-config -P`
        ;;
      --asm-as)
        CONFIG_ASM=as
        ;;
      --asm-nasm)
        CONFIG_ASM=nasm
        ;;
      --asm-ml)
        CONFIG_ASM=ml
        ;;
      --config-release)
        CONFIG_CONFIG=release
        ;;
      --config-debug)
        CONFIG_CONFIG=debug
        ;;
      *)
        warning "unknown option $OPT"
        ;;
    esac
  done
}

# --- guess variables --------------------------------------------------------

guess()
{
  if [ -z "$CONFIG_OS" ]; then 
    guess_os
    if [ -z "$CONFIG_OS" ]; then
      error "unsupported operating system $OS"
    fi
  fi

  if [ -z "$CONFIG_ARCH" ]; then
    guess_arch 
    if [ -z "$CONFIG_ARCH" ]; then
      error "unsupported architecture $ARCH"
    fi
  fi

  if [ -z "$CONFIG_TOOL" ]; then
    guess_tool
    if [ -z "$CONFIG_TOOL" ]; then
      error "no tool"
    fi
  fi

  if [ -z "$CONFIG_ASM" ]; then
    guess_asm
    if [ -z "$CONFIG_ASM" ]; then
      error " no assembler tool"
    fi
  fi

  if [ -z "$CONFIG_CONFIG" ]; then
    CONFIG_CONFIG=release
  fi
  
}
  
# --- set default variables --------------------------------------------------

set_defaults()
{
  CONFIG_HOST="$CONFIG_OS"
}

# --- derive variables -------------------------------------------------------

derive_vars()
{
  BUILD_HOST="$CONFIG_HOST"
  if [ "$CONFIG_HOST" != "$CONFIG_OS" ]; then
    BUILD_HOST="${CONFIG_HOST}_${CONFIG_OS}"
  fi
}

# --- write ConfigVars files ------------------------------------------------

output()
{
  echo "#auto-generated by $PACKAGE/configure" >$1
  echo "CONFIG_PACKAGE=$PACKAGE" >>$1
  echo "CONFIG_HOST=$CONFIG_HOST" >>$1
  echo "CONFIG_OS=$CONFIG_OS" >>$1
  echo "CONFIG_ARCH=$CONFIG_ARCH" >>$1
  echo "CONFIG_TOOL=$CONFIG_TOOL" >>$1
  echo "CONFIG_ASM=$CONFIG_ASM" >>$1
  echo "CONFIG_CONFIG=$CONFIG_CONFIG" >>$1
  echo "CONFIG_PREFIX=$CONFIG_PREFIX" >>$1
  echo "" >>$1
}

# --- configure --------------------------------------------------------------

run_configure()
{
  OLD=$PWD
  DIR=$1
  shift 1
  cd $DIR
  sh configure $*
  cd $OLD
}

# --- main -------------------------------------------------------------------

main()
{
  args $*
  info "* configure package $PACKAGE"
  guess
  set_defaults
  derive_vars
  output ConfigVars 
}

main $*

