#! /bin/sh
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
# 
#      http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#

#
# $Id: runConfigure 570389 2007-08-28 11:52:07Z cargilld $
#

#
# runConfigure:
#    This script will run the "configure" script for the appropriate
#    platform. Only supported platforms are recognized.
#
# The following variables are defined and exported at the end of this
# script.
#
# THREADS
# BITSTOBUILD
# CC
# CXX
# CXXFLAGS
# CFLAGS
# LDFLAGS
# EXTRA_LIBS
#

usage()
{
    echo "runConfigure: Helper script to run \"configure\" for one of the supported
platforms"
    echo "Usage: runConfigure \"options\""
    echo "       where options may be any of the following:"
    echo "       -p <platform> (accepts 'aix', 'beos', 'linux', 'freebsd', 'netbsd',
            'solaris', 'hp-10', 'hp-11', 'openserver', 'unixware',
            'os400', 'os390', 'irix', 'ptx', 'tru64', 'macosx', 'cygwin', 'qnx',
            'interix', 'mingw-msys')
            [required: no default]"
    echo "       -c <C compiler name> (e.g. gcc, cc, xlc_r, icc, icpc or ecc)"
    echo "            [default is make default; cc for gnu make]"
    echo "       -x <C++ compiler name> (e.g. g++, CC, aCC, xlC_r, xlC_rv5compat, icc, icpc or ecc)"
    echo "            [default is make default; g++ for gnu make]"
    echo "       -d (specifies that you want to build debug version) [default: not debug]"
    echo "       -r <thread option> can be 'pthread' or 'dce'
            (AIX, HP-11, and Solaris) or 'sproc' (IRIX) or 'none'
            [default: pthread]"
    echo "       -b <bitsToBuild> (accepts '64', '32') [default: 32]"
    echo "       -l <extra linker options>"
    echo "       -z <extra compiler options>"
    echo "       -h (get help on the above commands)"
}

ERROR_EXIT_CODE=1

if test ${1}o = "o"; then
   usage
   exit ${ERROR_EXIT_CODE}
fi

if test ${XERCESCROOT}o = "o"; then
   echo ERROR : You have not set your XERCESCROOT environment variable
   echo Though this environment variable has nothing to do with creating makefiles,
   echo this is just a general warning to prevent you from pitfalls in future. Please
   echo set an environment variable called XERCESCROOT to indicate where you installed
   echo the XERCES-C files, and run this command again to proceed. See the documentation
   echo for an example if you are still confused.
   if test $1 != "-h"; then
     exit ${ERROR_EXIT_CODE}
   fi
   echo
fi

if test $1 = "-h"; then
   usage
   exit ${ERROR_EXIT_CODE}
fi

# Set up the default values for each parameter
debug=off                # by default debug is off
transcoder=native        # by default use native transcoder
thread=pthread           # by default use pthread
bitsToBuild=32           # by default 32 bit build assumed

# Check the command line parameters
if test -x /usr/bin/getopt; then
   getoptErr=`getopt p:c:x:dr:b:l:z:h $*`
   if [ $? != 0 ]
      then
      usage
      exit ${ERROR_EXIT_CODE}
   fi
   # Now get the command line parameters
   set -- `getopt p:c:x:dr:b:l:z:h $*`
   while [ $# -gt 0 ]
      do
      case $1 in
      -p)
         platform=$2; shift 2;;

      -c)
         ccompiler=$2; shift 2;;

      -x)
         cppcompiler=$2; shift 2;;

      -d)
         debug=on; shift;;

      -r)
         thread=$2; shift 2;;

      -b)
         bitsToBuild=$2; shift 2;;

      -z)
         compileroptions="$compileroptions $2"; shift 2;;

      -l)
         linkeroptions="$linkeroptions $2"; shift 2;;

      -h)
         usage
         exit ${ERROR_EXIT_CODE};;

      --)
         shift; break;;

      *)
         echo "unknown option $1"
         usage
         exit ${ERROR_EXIT_CODE};;
      esac
   done
else
   while getopts "p:c:x:dr:b:l:z:h" switch; do
      case $switch in
      p)
         platform=$OPTARG;;

      c)
         ccompiler=$OPTARG;;

      x)
         cppcompiler=$OPTARG;;

      d)
         debug=on;;

      r)
         thread=$OPTARG;;

      b)
         bitsToBuild=$OPTARG;;

      z)
         compileroptions="$compileroptions $OPTARG";;

      l)
         linkeroptions="$linkeroptions $OPTARG";;

      h)
         usage
         exit ${ERROR_EXIT_CODE};;

      *)
         echo "unknown option -$switch $OPTARG"
         usage
         exit ${ERROR_EXIT_CODE};;
      esac
   done
fi

echo "Generating makefiles with the following options ..."
echo "Platform: $platform"
echo "C Compiler: $ccompiler"
echo "C++ Compiler: $cppcompiler"
echo "Thread option: $thread"
echo "bitsToBuild option: $bitsToBuild"
echo "Extra compile options: $compileroptions"
echo "Extra link options: $linkeroptions"

#
# Now check if the options are correct or not, bail out if incorrect
#
case $platform in
   aix | openserver | unixware | beos | linux | freebsd | netbsd | solaris | hp-10 | hp-11 | os400 | os390 | irix | ptx | tru64 | macosx | cygwin | qnx | interix | mingw-msys)
       # platform has been recognized
       ;;
   *)
      echo "I do not recognize the platform '$platform'. Please type '${0} -h' for help."
      exit ${ERROR_EXIT_CODE};;
esac

#
# Enable debugging or not...
#
if test $debug = "off"; then
    echo "Debug is OFF"
    if test $platform = "os400"; then
       debugflag="-O -DNDEBUG";
    elif test $platform = "irix"; then
       debugflag="-w -O2 -DNDEBUG";
    elif test $platform = "aix"; then
       debugflag="-w -O2 -DNDEBUG";
	elif test $platform = "os390"; then
       debugflag="-DNDEBUG";       
    elif test $platform = "linux"; then
       debugflag="-w -O2 -DNDEBUG";
    else
       debugflag="-w -O -DNDEBUG";
    fi
else
    echo "Debug is ON"
    debugflag="-g";
fi

#
# Check for the threading option
#
if test $thread = "none"; then
    THREADS=none
    threadingDefines="-DAPP_NO_THREADS -DXML_USE_NO_THREADS"
    threadingLibs=""
else
    THREADS=pthread
    threadingDefines="-DXML_USE_PTHREADS"
    threadingLibs="-lpthread"
    if test $platform = "hp-11"; then
        if test $thread; then
        case $thread in
           pthread)
               ;;
           dce)
               THREADS=dce ;
               threadingLibs="-lcma" ;
               threadingDefines="-D_PTHREADS_DRAFT4 -D_THREAD_SAFE -DXML_USE_DCE" ;;
           *)
               echo "I do not recognize the thread option '$thread'. Please type '${0} -h' for help." ;
               exit ${ERROR_EXIT_CODE};;
        esac
        fi
    elif test $platform = "openserver"; then
        case $thread in
           pthread)
               if test $cppcompiler = "g++"; then
                  threadingLibs="-Wl,-B,static,-l,pthread,-B,dynamic"
               fi
               ;;
           *)
               echo "I do not recognize the thread option '$thread'."
               echo "Please type '${0} -h' for help."
               exit ${ERROR_EXIT_CODE}
               ;;
        esac
    elif test $platform = "freebsd"; then
        threadingLibs="-pthread -lc_r"
        threadingDefines="-D_THREAD_SAFE -DXML_USE_PTHREADS"
    elif test $platform = "netbsd"; then
        threadingLibs="-pthread"
        threadingDefines="-D_THREAD_SAFE -DXML_USE_PTHREADS"
    elif test $platform = "aix"; then
        aix_version=`./config.guess`;
        echo Found host system to be $aix_version
        case $aix_version in
           *4.3*)
              ## Linkflags control the use of libpthreads on AIX
              threadingLibs="-lpthreads_compat";;
           *)
              threadingLibs="-lpthreads";;
        esac
        if test $thread; then
        case $thread in
           pthread)
               ;;
           dce)
               THREADS=dce ;
               threadingDefines="-DXML_USE_DCE"
               case $aix_version in
                  *4.3*)
                     ## Linkflags control the use of libpthreads on AIX
                     threadingLibs="-ldcelibc_r -ldcepthreads -lpthreads_compat";;
                  *)
                     threadingLibs="-lC_r -lC -ldcelibc_r -ldcepthreads";;
               esac
               ;;
           *)
               echo "I do not recognize the thread option '$thread'. Please type '${0} -h' for help." ;
               exit ${ERROR_EXIT_CODE};;
        esac
        fi
    elif test $platform = "ptx"; then
        threadingLibs=" "
        if test -z $XMLINSTALL; then
            XMLINSTALL=$ICUROOT         ## use either the -C or the -P option now.
        fi
    elif test $platform = "hp-10"; then
        THREADS=dce
        threadingLibs="-lcma"
        threadingDefines="-DXML_USE_DCE"
	elif test $platform = "os390"; then
        threadingDefines="-D_OPEN_THREADS"
        threadingLibs=""        
    elif test $platform = "unixware"; then
        threadingLibs=""         ## Linkflags control the use of threads on UnixWare
    elif test $platform = "solaris"; then
        if test $thread; then
        case $thread in
           pthread)
               ;;
           dce)
               THREADS=dce ;
               threadingLibs="-ldce";
               threadingDefines="-DXML_USE_DCE";;
           *)
               echo "I do not recognize the thread option '$thread'. Please type '${0} -h' for help." ;
               exit ${ERROR_EXIT_CODE};;
        esac
        fi
    elif test $platform = "irix"; then
        if test $thread; then
        case $thread in
        pthread)
            ;;
        sproc)
            threadingLibs=" ";
            threadingDefines="-DXML_USE_SPROC" ;;
        *)
            echo "I do not recognize the thread option '$thread'. Please type '${0} -h' for help." ;
            exit ${ERROR_EXIT_CODE};;
        esac
        fi
    elif test $platform = "mingw-msys"; then
        threadingLibs=""
        threadingDefines=""
    fi
fi

export THREADS

#
# Check for the bitsToBuild option
#

#
#  aix | beos | linux | hp-11 | solaris |
#  hp-10 | freebsd | netbsd | irix | openserver | unixware | os400 | ptx | tru64 | macosx
#
if test $bitsToBuild = 64; then
    bitstobuildDefines=" -DXML_BITSTOBUILD_64 "
    bitstobuildLink=" "
    if test $platform; then
        case $platform in
           solaris)
	      if test $cppcompiler; then
                  case $cppcompiler in
                     CC)
                         solaris_version=`./config.guess`
                         case $solaris_version in
			   sparc*)
              bitstobuildDefines=" $bitstobuildDefines -xarch=v9 "
              bitstobuildLink=" -xarch=v9 " ;;
			        *)
			     bitstobuildDefines=" $bitstobuildDefines -xarch=amd64 "
			     bitstobuildLink=" -xarch=amd64 " ;;
			 esac
                         ;;
                      *)
                       ;;
                  esac
              fi ;;
           aix)
              if test $cppcompiler; then
                  case $cppcompiler in
                     xlC*)
              bitstobuildDefines=" $bitstobuildDefines -q64 -qwarn64 "
			 bitstobuildLink=" -q64 ";;
                       *)
                       ;;
                  esac
              fi ;;
           irix)
              bitstobuildDefines=" $bitstobuildDefines -64 "
              bitstobuildLink=" -64 " ;;              
           hp-11)
               if test $cppcompiler; then
                   case $cppcompiler in
                       aCC)
                          bitstobuildDefines=" $bitstobuildDefines +DD64 "
                          bitstobuildLink=" +DD64 " ;;     
                       *)
                       ;;
                   esac
               fi ;;           
           linux)
               if test $cppcompiler; then
                   case $cppcompiler in
                       xlC*)
                          bitstobuildDefines=" $bitstobuildDefines -q64 -qwarn64 "
                          bitstobuildLink=" -q64 " ;;                       
                       *)
                          # following doesn't work for all versions of gcc                                              
                          #linux_version=`./config.guess`
                          #case $linux_version in
			              #  powerpc*)
              			  #		bitstobuildDefines=" $bitstobuildDefines -m64 "
              			  #		bitstobuildLink=" -m64 " ;;
			        	  #	*)
			        	  #	    ;;
			 			  #esac
                          ;;                                                                                              
                   esac
               fi ;;           
           *)
            ;;
        esac
    fi
elif test $bitsToBuild = 32; then
    bitstobuildDefines=" "
    bitstobuildLink=" "
# following doesn't work for all versions of gcc    
#    if test $platform; then
#        case $platform in
#            linux)                                         
#                linux_version=`./config.guess`
#                 case $linux_version in
#			          powerpc*)
#              			bitstobuildDefines=" $bitstobuildDefines -m32 "
#              			bitstobuildLink=" -m32 " ;;
#			     *)
#			        ;;
#			 	esac ;;	                                   
#        *)
#            ;;
#        esac    
#    fi        
else
    echo "I do not recognize the bitsToBuild '$bitsToBuild'. Please type '${0} -h' for help."
    exit ${ERROR_EXIT_CODE};
fi

#
# to export in case it is needed in Makefile.in/Makefine.incl
#
BITSTOBUILD=$bitsToBuild
export BITSTOBUILD

#
# Special test for libiconv necessity under FreeBSD
#
transcodingLibs=""       # by default don't suppose the libiconv is necessary
transcodingDefines=""
if test $platform = "freebsd"; then
    if test -n "${XERCESCROOT}"; then
       # try lookup the configuration results
       . "${XERCESCROOT}/version.incl"
       SOLIBNAME=libxerces-c.so.${SO_TARGET_VERSION}.${SO_TARGET_VERSION_MAJOR}
       if test -f "${XERCESCROOT}/src/xercesc/config.log" ; then
           if grep XML_USE_LIBICONV "${XERCESCROOT}/src/xercesc/config.log" \
              > /dev/null 2>&1 ; then
               transcodingLibs=" -L/usr/local/lib -liconv "
               transcodingDefines=" -DXML_USE_LIBICONV -I/usr/local/include "
           fi
       elif test -f "${XERCESCROOT}/obj/FREEBSD/IconvFBSDTransService.o" ; then
           if nm "${XERCESCROOT}/obj/FREEBSD/IconvFBSDTransService.o" | \
              grep iconv_open > /dev/null 2>&1 ; then
               transcodingLibs=" -L/usr/local/lib -liconv "
               transcodingDefines=" -DXML_USE_LIBICONV -I/usr/local/include "
           fi
       elif test -f "${XERCESCROOT}/lib/${SOLIBNAME}" ; then
           if nm "${XERCESCROOT}/lib/${SOLIBNAME}" | \
              grep iconv_open > /dev/null 2>&1 ; then
               transcodingLibs=" -L/usr/local/lib -liconv "
               transcodingDefines=" -DXML_USE_LIBICONV -I/usr/local/include "
           fi
       fi
    fi
fi

#
# Set the C compiler and C++ compiler environment variables
#
case $cppcompiler in
   xlC_rv5compat)
      CXX="xlC_r"
      CXXVER="v5compat"
      ;;
      
   xlC* | xlc* | g++* | c++ | cc | CC | icc | icpc | ICC | cxx | ecc)
      CXX="$cppcompiler"      
      ;;

   aCC)
      CXX="aCC"
      if test "`$CXX -V 2>&1 | sed -e 's/^aCC: .* A\.03\..*$/3/'`" != "3"; then
      CXXVER="aCC05"
      fi
      ;;
   '')
   	  echo "C++ compiler not specified...we'll assume that configure will find it..."
   	  ;;

   *)
      echo "I do not recognize the C++ compiler '$cppcompiler'. Continuing anyway ..."
      CXX="$cppcompiler"
      ;;
esac

CC="$ccompiler"
export CC

export CXX

export CXXVER

#
# Set the extra C and C++ compiler flags
#
# include the user defined CXXFLAGS/CFLAGS first in case they have
# set an platform spefic flags
#
CXXFLAGS="$CXXFLAGS $compileroptions $debugflag $transcodingDefines $threadingDefines $bitstobuildDefines"
export CXXFLAGS

CFLAGS="$CFLAGS $compileroptions $debugflag $transcodingDefines $threadingDefines $bitstobuildDefines"
export CFLAGS

# gcc crashes if optimisation is turned on in a Tru64 environment
if test "$platform" = "tru64" -a "$CXX" = "g++"; then
    CXXFLAGS=`echo $CXXFLAGS | sed -e 's/-O[0-9]*//g'`
    CFLAGS=`echo $CFLAGS | sed -e 's/-O[0-9]*//g'`
    export CXXFLAGS CFLAGS
fi

LDFLAGS="$LDFLAGS $linkeroptions $bitstobuildLink"
export LDFLAGS

EXTRA_LIBS="$transcodingLibs $threadingLibs"
export EXTRA_LIBS

echo
rm -f config.cache
rm -f config.log
rm -f config.status
if test $platform = "os400"; then
./configure --host AS400-OS400
elif test $platform = "ptx"; then
./configure --prefix=$XMLINSTALL
else
./configure
fi
# exit if configure failed
if test $? != 0; then
  exit 1
fi

echo
echo In future, you may also directly type the following commands to create
echo the Makefiles.
echo
echo export THREADS=\"$THREADS\"
echo export BITSTOBUILD=\"$BITSTOBUILD\"
echo export CC=\"$CC\"
echo export CXX=\"$CXX\"
if test "$CXXVER"; then
  echo export CXXVER=\"$CXXVER\"
fi
echo export CXXFLAGS=\"$CXXFLAGS\"
echo export CFLAGS=\"$CFLAGS\"
echo export LDFLAGS=\"$LDFLAGS\"
echo export EXTRA_LIBS=\"$EXTRA_LIBS\"
echo configure

echo
echo "If the result of the above commands look OK to you, go to the directory"
echo "${XERCESCROOT}/samples and type \"make\" (or \"gmake\")"
echo "to make the examples."

exit 0;
