#!/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.
#
#
# $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', 'openbsd', 'solaris' 'solaris-x86',
            'hp-10', 'hp-11', 'hp-11-ia64', 'irix', 'tru64', 'macosx', 'os390', 'os400', 'cygwin' 'mingw-msys')"
    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 'none' (Default: pthread)"
    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
ccompiler=gcc            # Use GCC as the default compiler
cppcompiler=g++          # Use GCC as the default compiler
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
thread=pthread           # by default, use pthread

# 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 | openbsd | solaris | solaris-x86 | hp-11 | hp-11-ia64 | irix | tru64 | macosx | os390 | os400 | cygwin | 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="";
    elif test $platform = "os390"; then
        debugflag="-DNDEBUG";
    elif test $platform = "linux"; then
        debugflag="-O3 -DNDEBUG";
    elif test $cppcompiler = "aCC"; then
        if test $platform = "hp-11-ia64"; 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 | openbsd | irix | os390 | os400 | tru64 | macosx
#
if test $bitsToBuild = 64; then
    bitstobuildDefines=""
    bitstobuildLink=""
    if test $platform; then
        case $platform in
           solaris)
              bitstobuildDefines=" -xarch=v9 "
              bitstobuildLink=" -xarch=v9 " ;;
           solaris-x86)
              bitstobuildDefines=" -m64 "
              bitstobuildLink=" -m64 " ;;
           aix)
              bitstobuildDefines=" -q64 -qwarn64 " ;;
           hp-11)
              bitstobuildDefines=" +DA2.0W "
              bitstobuildLink=" +DA2.0W " ;;
           hp-11-ia64)
              bitstobuildDefines=" +DD64 "
              bitstobuildLink=" +DD64 " ;;
           *)
            ;;
        esac
    fi
elif test $bitsToBuild = 32; then
    bitstobuildDefines=""
    bitstobuildLink=""
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 

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

case $ccompiler in
    gcc | icc)
        ;;

    cc)
        if test $platform = "aix"; then
            echo "Please use xlc instead of cc to build on AIX."
            exit ${ERROR_EXIT_CODE}
        fi
        ;;

    xlc)
        if test $cppcompiler != "xlC"; then
            echo "Please use xlC as the C++ compiler when using xlc."
            exit ${ERROR_EXIT_CODE}
        fi
        ;;

    xlc_r)
        if test $cppcompiler != "xlC_r"; then
            echo "Please use xlC_r as the C++ compiler when using xlc_r."
            exit ${ERROR_EXIT_CODE}
        fi
        ;;

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

case $cppcompiler in
    g++ | c++ | CC | aCC | cxx | icpc | icc)
        ;;

    xlC)
        if test $ccompiler != "xlc"; then
            echo "Please use xlc as the C compiler when using xlC."
            exit ${ERROR_EXIT_CODE}
        fi
        ;;

    xlC_r)
        if test $compiler != "xlc_r"; then
            echo "Please use xlc_r as the C compiler when using xlC_r."
            exit ${ERROR_EXIT_CODE}
        fi
        ;;

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

CC="$ccompiler"
export CC

CXX="$cppcompiler"
export CXX


#
# Check for the threading option
#

threadingLibs=""
threadingDefines=""
gccThreadingDefines="-pthread -D_REENTRANT"
gccThreadingLibs="-lpthread"

if test $thread = "none"; then
    case $platform in
        aix)
            if test $ccompiler = "xlc_r"; then
                echo "Please use xlc instead of xlc_r to build without threads."
                exit ${ERROR_EXIT_CODE}
            fi

            if test $cppcompiler = "xlC_r"; then
                echo "Please use xlC instead of xlC_r to build without threads."
                exit ${ERROR_EXIT_CODE}
            fi
        ;;

        *)
        ;;

    esac
elif test $thread != "pthread"; then
    echo "I do not recognize the thread option '$thread'. Please type '${0} -h' for help."
    exit ${ERROR_EXIT_CODE}
else
    case $platform in
        aix)
            if test $ccompiler = "xlc"; then
                echo "Please use xlc_r instead of xlc to build with threads."
                exit ${ERROR_EXIT_CODE}
            elif $ccompiler = "gcc"; then
                threadingDefines=$gccThreadingDefines
                threadingLibs=$gccThreadingLibs
            fi

            if test $cppcompiler = "xlC"; then
                echo "Please use xlC_r instead of xlC to build with threads."
                exit ${ERROR_EXIT_CODE}
            fi
            ;;

        freebsd)
            if test -n "${PTHREAD_LIBS}" ; then
                threadingLibs="${PTHREAD_LIBS}"
                threadingDefines="${PTHREAD_CFLAGS}"
            else
                threadingDefines=$gccThreadingDefines
                threadingLibs=$gccThreadingLibs
            fi
            ;;

        os400)
            threadingDefines="-D_MULTI_THREADED"
            ;;

        os390)
            threadingDefines="-D_OPEN_THREADS"
            ;;

        solaris*)
            if test $ccompiler = "gcc"; then
                # GCC on Solaris uses "-pthreads" instead of
                # "-pthread"
                threadingDefines="-pthreads -D_REENTRANT"
                threadingLibs=$gccThreadingLibs
            else
                threadingDefines="-mt"
            fi
            ;;

        hp-11*)
            if test $ccompiler = "gcc"; then
                threadingDefines=$gccThreadingDefines
                threadingLibs=$gccThreadingLibs
            else
                threadingDefines="-mt"   
            fi
            ;;

        cygwin)
            threadingLibs=""
            threadingDefines=""
            ;;

        mingw-msys)
            threadingLibs="-mthreads"
            threadingDefines="-mthreads"
            ;;

        *)
            threadingDefines=$gccThreadingDefines
            threadingLibs=$gccThreadingLibs
        ;;
    esac
fi

#
# 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 $threadingDefines"
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;
