#!/bin/sh


#
# The Apache Software License, Version 1.1
# 
# Copyright (c) 1999 The Apache Software Foundation.  All rights 
# reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer. 
# 
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in
#    the documentation and/or other materials provided with the
#    distribution.
# 
# 3. The end-user documentation included with the redistribution,
#    if any, must include the following acknowledgment:  
#       "This product includes software developed by the
#        Apache Software Foundation (http://www.apache.org/)."
#    Alternately, this acknowledgment may appear in the software itself,
#    if and wherever such third-party acknowledgments normally appear.
# 
# 4. The names "Xerces" and "Apache Software Foundation" must
#    not be used to endorse or promote products derived from this
#    software without prior written permission. For written 
#    permission, please contact apache\@apache.org.
# 
# 5. Products derived from this software may not be called "Apache",
#    nor may "Apache" appear in their name, without prior written
#    permission of the Apache Software Foundation.
# 
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
# ====================================================================
# 
# This software consists of voluntary contributions made by many
# individuals on behalf of the Apache Software Foundation, and was
# originally based on software copyright (c) 1999, International
# Business Machines, Inc., http://www.ibm.com .  For more information
# on the Apache Software Foundation, please see
# <http://www.apache.org/>.
# 
#
# $Log$
# Revision 1.9  1999/12/03 01:19:11  rahulj
# Split export statements into two. assignment and then export. Solaris is happy now
#
# Revision 1.8  1999/12/02 18:10:51  dirkx
# Changed exit codes from -1 to '1'. Added indirection.
#
# Date: Thu, 2 Dec 1999 17:47:39 +0000
# From: Jonathan McDowell <noodles@earth.li>
# Reply-To: xerces-dev@xml.apache.org
# To: xerces-dev@xml.apache.org, rahulj@apache.org
# Subject: Re: runConfigure script & bash
#
#
# On Mon, Nov 29, 1999 at 10:29:13AM -0800, Rahul Jain wrote:
#
# > > I'm quite happy to produce a patch that makes it work under both
# > > FreeBSD's sh and bash - I would assume this would work under most sh
# > > like shells.
# > Please post the changes for FreeBSD and I will test the changes on
# > other unix's and do the integration.
#
# I sat down to do this today and found that it can be trivially fixed by
# changing all the "exit -1" instances to "exit 1" - it seems the /bin/sh
# with FreeBSD doesn't like negative result codes. It seems a bit
# pointless to submit a patch for this, so can someone with CVS access
# change this please?
#
# J.
#
# --
#
# PR:
# Obtained from:
# Submitted by:
# Reviewed by:
#
# Revision 1.7  1999/12/01 17:16:16  rahulj
# Added support for IRIX 6.5.5 using SGI MIPSpro C++ 7.3 and 7.21 generating 32 bit objects. Changes submitted by Marc Stuessel
#
# Revision 1.6  1999/11/24 23:21:42  rahulj
# Now works under HPUX 10.20 with CC and aCC, with ICU and native
distclean target now remove and remaining Makefile(s)
clean target now removes the template repository directory
#
# Revision 1.5  1999/11/23 01:59:33  rahulj
# Code now works under HPUX 11. Tested inmemory message loader.
Revamped makefiles. Builds with both DCE threads as well as pthread libraries.
#
# Revision 1.4  1999/11/17 22:36:33  rahulj
# Code works with ICU transcoding service
#
# Revision 1.3  1999/11/12 20:38:50  rahulj
# Replaced XML4CROOT with XERCESCROOT.
#
# Revision 1.1.1.1  1999/11/09 01:02:57  twl
# Initial checkin
#
# Revision 1.4  1999/11/08 20:44:09  rahul
# Swat for adding in Product name and CVS comment log variable.
#
#

#
# 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
# TRANSCODER
#

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', 'solaris', 'hp-10', 'hp-11', 'irix')"
    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 "       -m <message loader> can be 'inmem', 'icu', 'iconv'"
    echo "       -n <net accessor> can be 'fileonly', 'libwww'"
    echo "       -t <transcoder> can be 'icu' or 'native'"
    echo "       -r <thread option> can be 'pthread' or 'dce' (only used on HP-11)"
    echo "       -l <extra linker options>"
    echo "       -z <extra compiler 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 ${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.
   exit ${ERROR_EXIT_CODE}
fi

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

# Get the command line parameters
set -- `getopt p:c:x:dm:n:t:r:l:z:h $*`
if [ $? != 0 ]
   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
msgloader=inmem          # by default use native transcoder
netaccessor=fileonly     # by default use fileonly

for i in $*
   do
   case $i in
   -p) 
        platform=$2; shift 2;;
   
   -c) 
        ccompiler=$2; shift 2;;
   
   -x) 
        cppcompiler=$2; shift 2;;
   
   -d) 
        debug=on; shift;;
   
   -m) 
        msgloader=$2; shift 2;;
   
   -n) 
        netaccessor=$2; shift 2;;
   
   -t) 
        transcoder=$2; shift 2;;
   
   -r) 
        thread=$2; shift 2;;
   
   -l) 
        linkeroption=$2; shift 2;;
   
   -z) 
        compileroption=$2; shift 2;;
   
   -h) 
        usage
        exit ${ERROR_EXIT_CODE};; 
   
   --) 
        shift; break;; 
   esac
done

echo "Generating makefiles with the following options ..."
echo "Platform: $platform"
echo "C Compiler: $ccompiler"
echo "C++ Compiler: $cppcompiler"
echo "Extra compile options: $compileroption"
echo "Extra link options: $linkeroption"
echo "Message Loader: $msgloader"
echo "Net Accessor: $netaccessor"
echo "Transcoder: $transcoder"
echo "Thread option: $thread"


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

case $platform in
   aix | linux | solaris | hp-10 | hp-11 | irix)
       # 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"
    debugflag="-O";
else
    echo "Debug is ON"
    debugflag="-g";
fi



#
# Check for the threading option only for hp-11
#

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 = "hp-10"; then
    threadingLibs="-lcma"
    threadingDefines="-DXML_USE_DCE"
fi


#
# Now check for what kind of transcoding service is desired.
#

transcodingDefines="-DXML_USE_NATIVE_TRANSCODER"
TRANSCODER=NATIVE

if test $transcoder; then
case $transcoder in
   icu)
       if test -z $ICUROOT; then
           echo '***Error*** ICUROOT environment variable not defined. Exiting...';
           exit ${ERROR_EXIT_CODE};
       fi
       transcodingDefines="-DXML_USE_ICU_TRANSCODER -I${ICUROOT}/include";
       transcodingLibs="-L${ICUROOT}/lib -licu-uc";
       TRANSCODER=ICU;;

   native)
       ;;

   *)
      echo "I do not recognize the transcoder option '$transcoder'. Please type '${0} -h' for help."
      exit ${ERROR_EXIT_CODE};;
esac
fi

export TRANSCODER


#
# Now check for the message loader
#

MESSAGELOADER=INMEM         # By default use in-memory
msgloaderDefines="-DXML_USE_INMEM_MESSAGELOADER"

if test $msgloader ; then
case $msgloader in
   icu)
       if test -z $ICUROOT ; then
           echo '***Error*** ICUROOT environment variable not defined. Exiting...';
           exit ${ERROR_EXIT_CODE};
       fi
       MESSAGELOADER=ICU;
       msgloaderDefines="-DXML_USE_ICU_MESSAGELOADER" ;;

   inmem)
       ;;

   iconv)
       MESSAGELOADER=ICONV;
       msgloaderDefines="-DXML_USE_ICONV_MESSAGELOADER" ;;

   *)
      echo "I do not recognize the message loader option '$msgloader'. Please type '${0} -h' for help.";
      exit ${ERROR_EXIT_CODE};;
esac
fi

export MESSAGELOADER




#
# Check for the type of net accessor
#

USELIBWWW=0;                   # By default use file-only
if test $netaccessor ; then
case $netaccessor in
   fileonly)
       netaccessorDefines="" ;;

   libwww)
       if test -z ${LIBWWWROOT} ; then
           echo "You have not defined your LIBWWWROOT environment variable. Cannot proceed further ..."
           exit ${ERROR_EXIT_CODE};
       fi
       netaccessorDefines="-DXML_USE_NETACCESSOR_LIBWWW -I${LIBWWWROOT}/include" ;
       netaccessorLibs="-L${LIBWWWROOT}/lib -lwww";
       USELIBWWW=1;; 

   *)
      echo "I do not recognize the netaccessor option '$netaccessor'. Please type '${0} -h' for help."
      exit ${ERROR_EXIT_CODE};;
esac
fi

export USELIBWWW



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

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

   *)
      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="$debugflag $transcodingDefines $msgloaderDefines $threadingDefines $netaccessorDefines"
export CXXFLAGS

CFLAGS="$debugflag $transcodingDefines $msgloaderDefines $threadingDefines $netaccessorDefines"
export CFLAGS

LIBS="$transcodingLibs $threadingLibs $netaccessorLibs"
export LIBS


echo
rm -f config.cache
rm -f config.log
rm -f config.status
./configure

echo
echo If the result of the above commands look OK to you, go to the directory
echo ${XERECSCROOT}/src and type \"make\" to make the XERECS-C system.

exit  0;

