#
# 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.4  1999/12/01 17:16:17  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.3  1999/11/23 02:00:28  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.2  1999/11/17 22:36:37  rahulj
# Code works with ICU transcoding service
#
# Revision 1.1.1.1  1999/11/09 01:06:14  twl
# Initial checkin
#
# Revision 1.3  1999/11/08 20:45:28  rahul
# Swat for adding in Product name and CVS comment log variable.
#:
#

PLATFORM = @platform@
CC  = @cc@
CXX = @cxx@
CXXFLAGS = @cxxflags@
CFLAGS = @cflags@
PREFIX = @prefix@
LDFLAGS = @ldflags@
LIBS = @libs@
OSVER = @osver@
USELIBWWW = @uselibwww@
MESSAGELOADER = @messageloader@
TRANSCODER = @transcoder@

MODULE = util

include ../../Makefile.incl

ifeq (${PLATFORM}, SOLARIS)
    SUBMODULE = Platforms/Solaris
    CPP_PUBHEADERS = Solaris/SolarisDefs.hpp
    CPP_OBJECTS = Solaris/SolarisPlatformUtils.o
endif
ifeq (${PLATFORM}, AIX)
    SUBMODULE = Platforms/AIX
    CPP_PUBHEADERS = AIX/AIXDefs.hpp
    CPP_OBJECTS = AIX/AIXPlatformUtils.o
endif
ifeq (${PLATFORM}, LINUX)
    SUBMODULE = Platforms/Linux
    CXXFLAGS += -D__USE_UNIX98 -D__USE_GNU
    CPP_PUBHEADERS = Linux/LinuxDefs.hpp
    CPP_OBJECTS = Linux/LinuxPlatformUtils.o
endif
ifeq (${PLATFORM}, HPUX)
    SUBMODULE = Platforms/HPUX
    CPP_PUBHEADERS = HPUX/HPUXDefs.hpp
    CPP_OBJECTS = HPUX/HPPlatformUtils.o
endif
ifeq (${PLATFORM}, OS390)
    SUBMODULE = Platforms/OS390
    CPP_PUBHEADERS = OS390/OS390Defs.hpp
    CPP_OBJECTS = OS390/OS390PlatformUtils.o
endif
ifeq (${PLATFORM}, IRIX)
    SUBMODULE = Platforms/IRIX
    CPP_PUBHEADERS = IRIX/IRIXDefs.hpp
    CPP_OBJECTS = IRIX/IRIXPlatformUtils.o
endif

include ../Makefile.util.submodule

