#!/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.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', '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

# 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 $*`
else
set -- `getopts C:p:P:c:x:dm:n:t:m:M:r:b:l:z:h $*`
fi

if [ $? != 0 ]
   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
locale=en_US		 # by default use US locale

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

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 | 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 = "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 | 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";
	    transcodingLibs="-L${ICUROOT} -L${ICUROOT}/lib -L${ICUROOT}/data";
	    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=""
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;
