#!/bin/sh

# Time-stamp: <08/06/07 15:22:19 yeti>

base=`cd \`dirname $0\`; echo $PWD`

configmak=$base/build/Makefiles/gmake/config.mak

write_option() {
  target=`echo $1 | sed -e 's/^[^=]*=//'`
  echo $2 := $3$target >> ${configmak}
}

write_over_option() {
  target=`echo $1 | sed -e 's/^[^=]*=//'`
  echo $2 ?= $target >> ${configmak}
}

print_help() {
  cat <<EOF
Configuration utility.

Usage:

  configure [options]

Available options:

  --prefix=<dir>        base install path (/usr/local/)
  --bindir=<dir>        install path for executables (PREFIX/bin)
  --libdir=<dir>        install path for libraries (PREFIX/lib)
  --includedir=<dir>    install path for headers (PREFIX/include)

  --target=<target>     target platform (cross-compiling)

  --help                print this help message and exit

  --with-stlport=<dir>  use STLport in catalog <dir>
  --without-stlport     compile without STLport
  --with-boost=<dir>    use boost headers in catalog <dir>
  --with-system-boost   use boost installed on this system
  --with-msvc=<dir>     use MS VC from this catalog
  --with-mssdk=<dir>    use MS SDK from this catalog
  --with-extra-cxxflags=<options>
                        pass extra options to C++ compiler
  --with-extra-cflags=<options>
                        pass extra options to C compiler
  --with-extra-ldflags=<options>
                        pass extra options to linker (via C/C++)
  --use-static-gcc      use static gcc libs instead of shared libgcc_s (useful for gcc compiler,
                        that was builded with --enable-shared [default]; if compiler was builded
                        with --disable-shared, static libraries will be used in any case)
  --clean               remove custom settings (file ${configmak})
                        and use default values
  --with-cxx=<name>     use <name> as C++ compiler (use --target= for cross-compilation)
  --with-cc=<name>      use <name> as C compiler (use --target= for cross-compilation)
  --use-compiler-family=<name> use compiler family; one of:
                        gcc      GNU compilers (default)
                        icc      Intel compilers
                        aCC      HP's aCC compilers
                        CC       SunPro's CC compilers
                        bcc      Borland's compilers
  --without-debug       don't build debug variant
  --without-stldebug    don't build STLport's STLP_DEBUG mode
  --enable-static       build static
  --disable-shared      don't build shared 
  --with-lib-motif=<motif>
                        Use this option to customize the generated library name.
                        The motif will be used in the last place before version information,
                        separated by an underscore, ex:
                        stlportd_MOTIF.5.0.lib
                        stlportstld_static_MOTIF.5.1.lib
  --without-thread      Per default STLport libraries are built in order to be usable
                        in a multithreaded context. If you don't need this you can ask
                        for a not thread safe version with this option.
  --without-rtti        Disable RTTI when building libraries.
  --with-static-rtl
  --with-dynamic-rtl
                        Enables usage of static (libc.lib family) or dynamic (msvcrt.lib family)
                        C/C++ runtime library when linking with STLport. If you want your appli/dll
                        to link statically with STLport but using the dynamic C runtime use
                        --with-dynamic-rtl; if you want to link dynamicaly with STLport but using the
                        static C runtime use --with-static-rtl. See README.options for details.
                        Don't forget to signal the link method when building your appli or dll, in
                        stlport/stl/config/host.h set the following macro depending on the configure
                        option:
                        --with-static-rtl  -> _STLP_USE_DYNAMIC_LIB"
                        --with-dynamic-rtl -> _STLP_USE_STATIC_LIB"
  --windows-platform=<name>
                        Targetted OS when building for Windows; one of:
                        win95   Windows 95
                        win98   Windows 98
                        winxp   Windows XP and later (default)

Environment variables:

  \$CXX                 C++ compiler name (use --target= for cross-compilation)
  \$CC                  C compiler name (use --target= for cross-compilation)
  \$CXXFLAGS            pass extra options to C++ compiler
  \$CFLAGS              pass extra options to C compiler
  \$LDFLAGS             pass extra options to linker (via C/C++)

  Options has preference over environment variables.

EOF
}

default_settings () {
  # if [ "$boost_set" = "" ]; then
  #   write_option "${PWD}/external/boost" BOOST_DIR
  # fi

  # if [ -z "${stlport_set}" ]; then
  #   write_over_option "$base" STLPORT_DIR
  # fi

  # Set in Makefiles/gmake/top.mak
  if [ -z "${compiler_family_set}" ]; then
  #  write_option gcc COMPILER_NAME
    echo include gcc.mak > ${base}/build/lib/Makefile
    echo include gcc.mak > ${base}/build/test/unit/Makefile
    echo include gcc.mak > ${base}/build/test/eh/Makefile
  fi

  # Set in Makefiles/gmake/targetdirs.mak
  # if [ -z "${prefix_set}" ]; then
  #   write_option "/usr/local" BASE_INSTALL_DIR '${DESTDIR}'
  # fi
}

[ $# -eq 0 ] && { >${configmak}; default_settings; exit 0; }

for a in $@ ; do
  case $a in
    --help)
      print_help
      exit 0
      ;;
    --clean)
      rm -f ${configmak}
      exit 0
      ;;
  esac
done

>${configmak}

while :
do
  case $# in
    0)
      break
      ;;
  esac
  option="$1"
  shift
  case $option in
    --target=*)
      write_option "$option" TARGET_OS
      target_set=y
      ;;
    --with-stlport=*)
      write_option "$option" STLPORT_DIR
      stlport_set=y
      ;;
    --without-stlport)
      write_option 1 WITHOUT_STLPORT
      stlport_set=y
      ;;
    --with-boost=*)
      write_option "$option" BOOST_DIR
      ;;
    --with-system-boost)
      write_option 1 USE_SYSTEM_BOOST
      ;;
    --with-msvc=*)
      write_option "$option" MSVC_DIR
      ;;
    --with-mssdk=*)
      write_option "$option" MSSDK_DIR
      ;;
    --with-extra-cxxflags=*)
      write_option "$option" EXTRA_CXXFLAGS
      cxxflags_set=y
      ;;
    --with-extra-cflags=*)
      write_option "$option" EXTRA_CFLAGS
      cflags_set=y
      ;;
    --with-extra-ldflags=*)
      write_option "$option" EXTRA_LDFLAGS
      ldflags_set=y
      ;;
    --with-lib-motif=*)
      echo "Using $option in generated library names"
      write_option "$option" LIB_MOTIF
      ;;
    --without-thread)
      write_option 1 WITHOUT_THREAD
      ;;
    --without-rtti)
      write_option 1 WITHOUT_RTTI
      ;;
    --with-dynamic-rtl)
      write_option 1 WITH_DYNAMIC_RTL
      ;;
    --with-static-rtl)
      write_option 1 WITH_STATIC_RTL
      ;;
    --use-static-gcc)
      write_option 1 USE_STATIC_LIBGCC
      ;;
    --without-debug)
      write_option 1 _NO_DBG_BUILD
      ;;
    --without-stldebug)
      write_option 1 _NO_STLDBG_BUILD
      ;;
    --enable-static)
      write_option 1 _STATIC_BUILD
      ;;
    --disable-shared)
      write_option 1 _NO_SHARED_BUILD
      ;;
    --with-cxx=*)
      write_option "$option" _FORCE_CXX
      cxx_set=y
      ;;
    --with-cc=*)
      write_option "$option" _FORCE_CC
      cc_set=y
      ;;
    --use-compiler-family=*)
      case `echo $option | sed -e 's/^[^=]*=//'` in
        gcc|icc|aCC|CC|bcc|dmc)
          target=`echo $option | sed -e 's/^[^=]*=//'`
          echo COMPILER_NAME := $target >> ${configmak}
          echo include $target.mak > ${base}/build/lib/Makefile
          echo include $target.mak > ${base}/build/test/unit/Makefile
          echo include $target.mak > ${base}/build/test/eh/Makefile
          ;;
        *)
          echo "Not supported compilers family"
          exit -1
          ;;
      esac
      compiler_family_set=y
      ;;
    --prefix=*)
      write_option "$option" BASE_INSTALL_DIR '${DESTDIR}'
      prefix_set=y
      ;;
    --bindir=*)
      write_option "$option" INSTALL_BIN_DIR '${DESTDIR}'
      ;;
    --libdir=*)
      write_option "$option" INSTALL_LIB_DIR '${DESTDIR}'
      ;;
    --includedir=*)
      write_option "$option" INSTALL_HDR_DIR '${DESTDIR}'
      ;;
    --windows-platform=*)
      case `echo $option | sed -e 's/^[^=]*=//'` in
        win95)
          write_option 0x0400 WINVER
          ;;
        win98)
          write_option 0x0410 WINVER
          ;;
        winxp)
          write_option 0x0501 WINVER
          ;;
        *)
          echo "Not supported windows platform"
          exit -1
          ;;
      esac
      ;;
    *)
      echo "Unknown configuration option '$option'"
      exit -1
      ;;
  esac
done

if [ -n "${CXX}" ]; then
  if [ -n "${cxx_set}" ]; then
    echo "Both --with-cxx and \$CXX set, using the first"
  elif [ -z "${target_set}" ]; then
    write_option "${CXX}" _FORCE_CXX
  else
    echo "For cross-compilation with gcc use --target option only"
  fi
  if [ -z "${CC}" -a -z "${cc_set}" ]; then
    echo "\$CXX set, but I don't see \$CC!"
  fi
fi

if [ -n "${CC}" ]; then
  if [ -n "${cxx_set}" ]; then
    echo "Both --with-cc and \$CC set, using the first"
  else
    write_option "${CC}" _FORCE_CC
  fi
fi

if [ -n "${CXXFLAGS}" ]; then
  if [ -z "${cxxflags_set}" ]; then
    write_option "${CXXFLAGS}" EXTRA_CXXFLAGS
  else
    echo "Both --with-extra-cxxflags and \$CXXFLAGS set, using the first"
  fi
fi

if [ -n "${CFLAGS}" ]; then
  if [ -z "${cflags_set}" ]; then
    write_option "${CFLAGS}" EXTRA_CFLAGS
  else
    echo "Both --with-extra-cflags and \$CFLAGS set, using the first"
  fi
fi

if [ -n "${LDFLAGS}" ]; then
  if [ -z "${ldflags_set}" ]; then
    write_option "${LDFLAGS}" EXTRA_LDFLAGS
  else
    echo "Both --with-extra-ldflags and \$LDFLAGS set, using the first"
  fi
fi

# default settings

default_settings