#
# 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.1  1999/11/09 01:04:40  twl
# Initial revision
#
# Revision 1.4  1999/11/08 20:45:09  rahul
# Swat for adding in Product name and CVS comment log variable.
#
#

PLATFORM = @platform@
COMPILER = @compiler@
CXXFLAGS = @cxxflags@
CFLAGS = @cflags@
PREFIX = @prefix@
LDFLAGS = @ldflags@
LIBS = @libs@
OSVER = @osver@
USELIBWWW = @uselibwww@
MESSAGELOADER = @messageloader@
TRANSCODER = @transcoder@

MODULE = util

ifeq (${TRANSCODER},ICU)
   TRANSCODERMODULE=ICU
else
   TRANSCODERMODULE=Iconv
endif

ifeq (${MESSAGELOADER},ICU)
   MESSAGELOADERMODULE=ICU
else
   ifeq (${MESSAGELOADER},ICONV)
      MESSAGELOADERMODULE=MsgCatalog
   else
      MESSAGELOADERMODULE=InMemory
   endif
endif

include ../Makefile.incl

UTIL_CPP_PUBHEADERS = \
	ArrayIndexOutOfBoundsException.hpp \
	AutoSense.hpp \
	BinFileInputStream.hpp \
	BinInputStream.hpp \
	BinMemInputStream.hpp \
	BitOps.hpp \
	BitSet.hpp \
	CountedPointer.hpp \
	EmptyStackException.hpp \
	FlagJanitor.hpp \
	IOException.hpp \
	IllegalArgumentException.hpp \
	InvalidCastException.hpp \
	Janitor.hpp \
	KVStringPair.hpp \
	KeyValuePair.hpp \
	Mutexes.hpp \
	NameIdPool.hpp \
	NoDefTranscoderException.hpp \
	NoSuchElementException.hpp \
	NullPointerException.hpp \
	PlatformUtils.hpp \
	RefArrayOf.hpp \
	RefHashTableOf.hpp \
	RefStackOf.hpp \
	RefVectorOf.hpp \
	RuntimeException.hpp \
	StdOut.hpp \
	StringPool.hpp \
	TextOutputStream.hpp \
	TransService.hpp \
	TranscodingException.hpp \
	URL.hpp \
	UTFDataFormatException.hpp \
	UnexpectedEOFException.hpp \
	UnsupportedEncodingException.hpp \
	ValueArrayOf.hpp \
	ValueStackOf.hpp \
	ValueVectorOf.hpp \
	XML4CDefs.hpp \
	XMLEnumerator.hpp \
	XMLExceptMsgs.hpp \
	XMLException.hpp \
	XMLMsgLoader.hpp \
	XMLString.hpp \
	XMLUni.hpp

UTIL_CPP_PRIVHEADERS = 

C_FILES = \
	CountedPointer.c \
	FlagJanitor.c \
	Janitor.c \
	KeyValuePair.c \
	NameIdPool.c \
	RefArrayOf.c \
	RefHashTableOf.c \
	RefStackOf.c \
	RefVectorOf.c \
	ValueArrayOf.c \
	ValueStackOf.c \
	ValueVectorOf.c

UTIL_CPP_OBJECTS = \
	BinFileInputStream.o \
	BinInputStream.o \
	BinMemInputStream.o \
	BitSet.o \
	HeaderDummy.o \
	KVStringPair.o \
	Mutexes.o \
	PlatformUtils.o \
	StdOut.o \
	StringPool.o \
	TextOutputStream.o \
	URL.o \
	XMLException.o \
	XMLString.o \
	XMLUni.o


all:	includes $(UTIL_CPP_OBJECTS) platforms transcoders messageloaders compilers publish

includes:	pubheaders $(C_FILES)
	cd Platforms ; $(MAKE) $@ ; cd ..
	cd Transcoders/$(TRANSCODERMODULE) ; $(MAKE) $@ ; cd ../..
	cd MsgLoaders/$(MESSAGELOADERMODULE) ; $(MAKE) $@ ; cd ../..
	cd Compilers ; $(MAKE) $@ ; cd ..

platforms:
	cd Platforms ; $(MAKE) ; cd ..

transcoders:
	cd Transcoders/$(TRANSCODERMODULE) ; $(MAKE) ; cd ../..

messageloaders:
	cd MsgLoaders/$(MESSAGELOADERMODULE) ; $(MAKE) ; cd ../..

compilers:
	cd Compilers ; $(MAKE) ; cd ..

pubheaders:
	-mkdir -p $(XML_INC_DIR)/$(MODULE)
	$(CP) $(UTIL_CPP_PUBHEADERS) $(C_FILES) $(XML_INC_DIR)/$(MODULE)

publish:
	-mkdir -p ${ALL_OBJECTS_DIR}
	$(CP) $(UTIL_CPP_OBJECTS) $(ALL_OBJECTS_DIR)

# this may generate unnecessary dependencies, but it makes life easier
depend: includes
	$(MAKE_DEPEND) $(XML_INCL)  *.cpp > $(DEPFILE)

clean:
	@echo "Making clean in $(MODULE) ..."
	$(RM) $(UTIL_CPP_OBJECTS)
	cd Platforms ; $(MAKE) $@ ; cd ..
	cd Transcoders/$(TRANSCODERMODULE) ; $(MAKE) $@ ; cd ../..
	cd MsgLoaders/$(MESSAGELOADERMODULE) ; $(MAKE) $@ ; cd ../..
	cd Compilers ; $(MAKE) $@ ; cd ..



distclean:	clean
	$(RM) Makefile $(DEPFILE)
	@echo "Removing all $(MODULE) header files ..."
	@for file in $(UTIL_CPP_PUBHEADERS); do \
	rm -f $(XML_INC_DIR)/$(MODULE)/$$file; \
	done
	@for file in $(C_FILES); do \
	rm -f $(XML_INC_DIR)/$(MODULE)/$$file; \
	done
	@echo "Removing all $(MODULE) object files ..."
	@for file in $(UTIL_CPP_OBJECTS); do \
	rm -f $(ALL_OBJECTS_DIR)/$$file; \
	done
	cd Platforms ; $(MAKE) $@ ; cd ..
	cd Transcoders/$(TRANSCODERMODULE) ; $(MAKE) $@ ; cd ../..
	cd MsgLoaders/$(MESSAGELOADERMODULE) ; $(MAKE) $@ ; cd ../..
	cd Compilers ; $(MAKE) $@ ; cd ..


install:
	-mkdir -p $(PREFIX)/$(MODULE)
	$(CP) $(UTIL_CPP_PUBHEADERS) $(C_FILES) $(PREFIX)/$(MODULE)
	cd Platforms ; $(MAKE) $@ ; cd ..
	cd Transcoders/$(TRANSCODERMODULE) ; $(MAKE) $@ ; cd ../..
	cd MsgLoaders/$(MESSAGELOADERMODULE) ; $(MAKE) $@ ; cd ../..
	cd Compilers ; $(MAKE) $@ ; cd ..

