#
# 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.2  1999/11/23 02:00:05  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.1.1.1  1999/11/09 01:04:40  twl
# Initial checkin
#
# Revision 1.4  1999/11/08 20:45:09  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

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 ..

