#
# 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.3  1999/12/14 23:53:24  rahulj
# Removed the offending Ctrl-M's from the commit message
# logs which was giving packaging problems.
#
# PR:
# Obtained from:
# Submitted by:
# Reviewed by:
#
# 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 ..

