#!/bin/sh

#
# Copyright 1999-2004 The Apache Software Foundation.
#
# Licensed 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.
#
#
# $Log$
# Revision 1.14  2005/08/16 23:48:26  dmitryh
# Addional fix for XALANC-541
#
# Revision 1.13  2005/08/16 01:06:47  dmitryh
# Fix for XALANC-541
#
# Revision 1.12  2005/07/08 17:30:49  dmitryh
# Fix for XALANC-526
#
# Revision 1.11  2004/04/19 14:54:08  dmitryh
# Fix for Bugzilla Bug 28452
#
# Revision 1.10  2004/04/06 15:08:44  dmitryh
# Changes for a cygwin build
#
# Revision 1.9  2004/03/03 15:06:39  mhoyt
# Patch for Bugzilla 27406 from Bjoern A. Zeeb: FreeBSD threading configuration
#
# Revision 1.8  2004/02/26 23:10:06  mhoyt
# Update to Apache 2.0 License
#
# Revision 1.7  2004/02/06 08:49:09  dbertoni
# Initial changes for HP-UX IA64 port.
#
# Revision 1.6  2004/02/06 08:39:35  dbertoni
# Initial changes for HP-UX IA64 port.
#
# Revision 1.5  2004/01/06 02:41:25  dbertoni
# Changes for Bugzilla 25914.
#
# Revision 1.4  2003/12/29 00:26:53  dbertoni
# Patches for Bugzilla 25361.
#
# Revision 1.3  2003/12/03 21:52:57  dbertoni
# Patch 25180 for iSeries support.
#
# Revision 1.2  2003/12/02 19:58:50  dbertoni
# Patch for Bugzilla 24567.
#
# Revision 1.1  2003/11/12 20:42:18  dbertoni
# Patches for bug 13238.
#
# Revision 1.4  2003/11/06 01:28:34  dbertoni
# Patch for bugzilla 13238.
#
# Revision 1.3  2003/09/19 20:33:04  dbertoni
# Massive copyright update.
#
# Revision 1.2  2003/07/22 10:59:40  blautenb
# FreeBSD and Install patch from Bjoern Zeeb - Bugzilla 13238
#
# Revision 1.1  2003/06/29 03:57:53  blautenb
# Moved source for sane includes
#
# Revision 1.19  2003/04/05 05:21:56  blautenb
# Fix for bug 18675
#
# Revision 1.18  2003/03/20 16:38:32  dbertoni
# Updates for Intel compiler on Linux.
#
# Revision 1.17  2003/02/08 01:39:33  dbertoni
# Don't add bitstobuildLink on AIX.
#
# Revision 1.16  2003/01/05 18:29:54  dbertoni
# Bump optimization level on Linux.
#
# Revision 1.15  2002/12/12 20:58:06  dbertoni
# Changes to build outside of the source tree.  Fixes Bugzilla 4627.
#
# Revision 1.14  2002/11/05 05:15:59  dbertoni
# Add extra hint about using GNU make.
#
# Revision 1.13  2002/10/04 23:42:48  dbertoni
# Fixed getop problem.
#
# Revision 1.12  2002/08/05 21:21:02  dbertoni
# Fixed statement termination problem.
#
# Revision 1.11  2002/08/05 20:41:24  dbertoni
# Merge in HP changes.
#
# Revision 1.10  2002/08/05 20:33:54  dbertoni
# Changes to implement 32 and 64-bit builds.
#
# Revision 1.9  2002/08/01 18:36:38  dbertoni
# Added support for Intel compiler.
#
# Revision 1.8  2002/05/06 05:34:06  dbertoni
# Implemented multiple compiler options.
#
# Revision 1.7  2001/11/27 14:29:43  dbertoni
# Reverted previous changes.
#
# Revision 1.5  2001/08/14 16:10:18  dbertoni
# Changes from James Berry <jberry@criticalpath.com> for Mac OS X support.
#
# Revision 1.4  2001/05/18 18:24:12  dbertoni
# Added $compileroption to CXXFLAGS and CFLAGS.  Bug 1810
#
# Revision 1.3  2001/04/13 02:53:20  dbertoni
# Changes for the TRU64 port.
#
# Revision 1.2  2001/03/15 15:56:36  dbertoni
# Add -D NDEBUG to release builds to disable assertions.
#
# Revision 1.1  2000/01/27 19:57:43  jdonohue
# Preliminary based on Xerces
#
# Revision 1.1  1999/12/21 01:13:53  jdonohue
# Make for linux, etc
#

#
#

#
# 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.
#
# LIBS
# LDFLAGS
# CXXFLAGS
#

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', 'linux', 'freebsd', 'netbsd', 'solaris',
            'hp-10', 'hp-11', 'hp-11-ia64', 'irix', 'tru64', 'macosx', 'os390', 'os400', 'cygwin')"
    echo "       -c <C compiler name> (e.g. gcc, cc, xlc)"
    echo "       -x <C++ compiler name> (e.g. g++, CC, xlC)"
    echo "       -d (specifies that you want to build debug version)"
    echo "       -t <transcoder> can be 'icu' (everything else means default)"
    echo "       -m <msg locale system> (accepts 'inmem', 'icu','nls')" 
    echo "       -M <locale> (example: 'fr_FR'. Default: 'en_US')"     
    echo "       -r <thread option> can be 'pthread' or 'dce' (only used on HP-11)"
    echo "       -b <bitsToBuild> (accepts '64', '32')"
    echo "       -P <install-prefix>"
    echo "       -l <extra linker options>"
    echo "       -z <extra compiler options>"
    echo "       -C <any one extra configure options>"
    echo "       -h (to get help on the above commands)"
}

ERROR_EXIT_CODE=1

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

if test ${XALANCROOT}o = "o"; then
   echo ERROR : You have not set your XALANCROOT 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 XALANCROOT to indicate where you installed
   echo the XALAN-C files, and run this command again to proceed. See the documentation
   echo for an example if you are still confused.
   exit ${ERROR_EXIT_CODE}
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
bitsToBuild=32           # by default 32 bit build assumed
transcoder=default       # by default use default transcoder
localSys=inmem 	         # by default use inmem locale system
locale=en_US             # by default use US locale

# Get the command line parameters
if test -x /bin/getopt -o -x /usr/bin/getopt; then
    set -- `getopt C:p:P:c:x:dm:n:t:m:M:r:b:l:z:h $*`

    if [ $? != 0 ]
        then
        usage
        exit ${ERROR_EXIT_CODE}
    fi

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;;

   -t)
        transcoder=$2; shift 2;;
        
   -m)

 	localSys=$2; shift 2;;
 	

   -M)

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

   -b)
        bitsToBuild=$2; shift 2;;
  
   -P)
        configureoptions="$configureoptions --prefix=$2"; shift 2;;

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

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

   -C)
        configureoptions="$configureoptions $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 "C:p:P:c:x:dm:n:t:m:M:r:b:l:z:h" switch;
   do
   case $switch in
   p)
	platform=$OPTARG;;

   c)
        ccompiler=$OPTARG;;

   x)
        cppcompiler=$OPTARG;;

   d)
        debug=on;;

   t)
        transcoder=$OPTARG;;

   r)
        thread=$OPTARG;;

   b)
        bitsToBuild=$OPTARG;;

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

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

   m)
        localSys=$OPTARG;;

   M)
        locale=$OPTARG;;

   P)
        configureoptions="$configureoptions --prefix=$OPTARG";;

   C)
        configureoptions="$configureoptions $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 "Extra compile options: $compileroptions"
echo "Extra link options: $linkeroptions"
echo "Transcoder: $transcoder"
echo "Localization system: $localSys"
echo "Locale: $locale"
echo "Thread option: $thread"
echo "bitsToBuild option: $bitsToBuild"
echo "Extra configure options: $configureoptions"


#
# Now check if the options are correct or not, bail out if incorrect
#

case $platform in
   aix | linux | freebsd | netbsd | solaris | hp-11 | hp-11-ia64 | irix | tru64 | macosx | os390 | os400 | cygwin)
       # 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="";
    elif test $platform = "os390"; then
        debugflag="-DNDEBUG";
    elif test $platform = "linux"; then
		if test $cppcompiler = "icpc"; then
			debugflag="-O3 -DNDEBUG";
		else
			debugflag="-O2 -DNDEBUG";
		fi
    else
        debugflag="-O -DNDEBUG";
    fi
else
    echo "Debug is ON"
    debugflag="-g";
fi



#
# Check for the bitsToBuild option
#

#
#  aix | linux | hp-11 | hp-11-ia64 | solaris |
#  freebsd | netbsd | irix | openserver | unixware | os390 | os400 | ptx | tru64 | macosx
#
if test $bitsToBuild = 64; then
    bitstobuildDefines=" -DXML_BITSTOBUILD_64 "
    bitstobuildLink=" "
    if test $platform; then
        case $platform in
           solaris)
              bitstobuildDefines=" $bitstobuildDefines -xarch=v9 "
              bitstobuildLink=" -xarch=v9 " ;;
           aix)
              bitstobuildDefines=" $bitstobuildDefines -q64 -qwarn64 " ;;
           hp-11)
              bitstobuildDefines=" $bitstobuildDefines +DA2.0W "
              bitstobuildLink=" +DA2.0W " ;;
           hp-11-ia64)
	          bitstobuildDefines=" $bitstobuildDefines +DD64 "
              bitstobuildLink=" +DD64 " ;;
           linux)
              bitstobuildDefines=" $bitstobuildDefines " ;;
           *)
            ;;
        esac
    fi
elif test $bitsToBuild = 32; then
    bitstobuildDefines=""
    bitstobuildLink=""
    if test $platform; then
        case $platform in
           solaris)
		      ;;
           aix)
		      ;;
           hp-11)
              bitstobuildDefines="+DAportable "
			  ;;
           hp-11-ia64)
              bitstobuildDefines="+DD32 "
			  ;;
           hp-11-ia64)
              bitstobuildDefines=" $bitstobuildDefines +DD32 "
                        ;;
           linux)
              ;;
           *)
            ;;
        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

#
# Now check whether to use 'icu' as transcoder
#
TRANSCODER=
if test $transcoder; then
    case $transcoder in
        icu)
	    if test ${ICUROOT}o = "o"; then
		    echo '***Error*** ICUROOT environment variable not defined. Exiting...';
		    exit ${ERROR_EXIT_CODE};
            fi
	    transcodingDefines="-I${ICUROOT}/include";
            if test $platform != "os390"; then
	            transcodingLibs="-L${ICUROOT} -L${ICUROOT}/lib -L${ICUROOT}/data";
            fi
	    TRANSCODER=ICU;;

	default)
	    ;;
	*)
	    echo "Unknown transcoder '$transcoder'. Using default."
	    ;;
    esac
fi

export TRANSCODER


XALAN_LOCALE_SYSTEM=

if test $localSys; then
	case $localSys in
		icu)
			if test ${ICUROOT}o = "o"; then
			      echo '***Error*** ICUROOT environment variable not defined. Exiting...'
	              exit ${ERROR_EXIT_CODE};
	        fi
			XALAN_LOCALE_SYSTEM=icu;;

		inmem)
			XALAN_LOCALE_SYSTEM=inmem;;

		nls)
			XALAN_LOCALE_SYSTEM=nls;;

		default)
			XALAN_LOCALE_SYSTEM=inmem;;

		*)
			echo "Unknown locale '$localSys'. Using default."
	esac
fi

export XALAN_LOCALE_SYSTEM

XALAN_LOCALE=$locale

export XALAN_LOCALE 

#
# Check for the threading option
#

threadingLibs="-lpthread"
if test $platform = "hp-11"; then
    if test $thread; then
    case $thread in
       pthread)
           ;;
    
       dce)
           threadingLibs="-lcma";
           threadingDefines="-D_PTHREADS_DRAFT4 -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 = "aix"; then
    threadingLibs="-lpthreads"
elif test $platform = "freebsd"; then
    if test -n "${PTHREAD_LIBS}" ; then
      threadingLibs="${PTHREAD_LIBS}"
      threadingDefines="${PTHREAD_CFLAGS}"
    else
      threadingLibs="-lpthread"
      threadingDefines=""
    fi
elif test $platform = "netbsd"; then
    threadingLibs="-pthread -lpthread"
elif test $platform = "os400"; then
    threadingLibs=""
elif test $platform = "os390"; then
     threadingLibs=""
     threadingDefines="-D_OPEN_THREADS"
fi




#
# Set the C compiler and C++ compiler environment variables
#

case $cppcompiler in
   xlC | xlc | xlC_r | xlc_r | g++ | c++ | cc | CC | aCC | cxx | icpc | icc)
      ;;

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

CC="$ccompiler"
export CC

CXX="$cppcompiler"
export CXX


#
# Set the extra C and C++ compiler flags
#

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

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

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

LIBS="$transcodingLibs $threadingLibs "
export LIBS


echo
rm -f config.cache
rm -f config.log
rm -f config.status
`dirname $0`/configure $configureoptions

echo
echo If the result of the above commands look OK to you, go to the directory
echo ${XALANCROOT} and type \"gmake\" or \"make\" to make the XALAN-C system.
echo
echo Note: You must use GNU make to use the Xalan Makefile.

exit  0;
