#
# 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/11/30 21:35:21  abagchi
# Included EnumVal in the list of samples
#
# Revision 1.3  1999/11/12 20:31:22  rahulj
# Replaced XML4CROOT with XERCESCROOT.
#
# Revision 1.1.1.1  1999/11/09 01:09:25  twl
# Initial checkin
#
# Revision 1.4  1999/11/08 20:43:33  rahul
# Swat for adding in Product name and CVS comment log variable.
#
#

SAXPrint_DIR=SAXPrint
SAXCount_DIR=SAXCount
DOMPrint_DIR=DOMPrint
DOMCount_DIR=DOMCount
Redirect_DIR=Redirect
MemParse_DIR=MemParse
PParse_DIR=PParse
StdInParse_DIR=StdInParse
EnumVal_DIR=EnumVal
LIB_DIR=${XERCESCROOT}/lib

PLATFORM = @platform@
COMPILER = @compiler@
CXXFLAGS = @cxxflags@
CFLAGS = @cflags@
PREFIX = @prefix@

all:	saxprint saxcount domprint domcount redirect memparse pparse stdinparse enumval

saxprint:
	@echo Building "SAXPrint"
	cd $(SAXPrint_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

saxcount:
	@echo Building "SAXCount"
	cd $(SAXCount_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

domprint:
	@echo Building "DOMPrint"
	cd $(DOMPrint_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

domcount:
	@echo Building "DOMCount"
	cd $(DOMCount_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

memparse:
	@echo Building "MemParse"
	cd $(MemParse_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

redirect:
	@echo Building "Redirect"
	cd $(Redirect_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

pparse:
	@echo Building "PParse"
	cd $(PParse_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

stdinparse:
	@echo Building "StdInParse"
	cd $(StdInParse_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

enumval:
	@echo Building "EnumVal"
	cd $(EnumVal_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

clean:
	cd $(SAXPrint_DIR) && $(MAKE) $@ && cd ..
	cd $(SAXCount_DIR) && $(MAKE) $@ && cd ..
	cd $(DOMPrint_DIR) && $(MAKE) $@ && cd ..
	cd $(DOMCount_DIR) && $(MAKE) $@ && cd ..
	cd $(MemParse_DIR) && $(MAKE) $@ && cd ..
	cd $(Redirect_DIR) && $(MAKE) $@ && cd ..
	cd $(PParse_DIR) && $(MAKE) $@ && cd ..
	cd $(StdInParse_DIR) && $(MAKE) $@ && cd ..
	cd $(EnumVal_DIR) && $(MAKE) $@ && cd ..

distclean:
	cd $(SAXPrint_DIR) && $(MAKE) $@ && cd ..
	cd $(SAXCount_DIR) && $(MAKE) $@ && cd ..
	cd $(DOMPrint_DIR) && $(MAKE) $@ && cd ..
	cd $(DOMCount_DIR) && $(MAKE) $@ && cd ..
	cd $(MemParse_DIR) && $(MAKE) $@ && cd ..
	cd $(Redirect_DIR) && $(MAKE) $@ && cd ..
	cd $(PParse_DIR) && $(MAKE) $@ && cd ..
	cd $(StdInParse_DIR) && $(MAKE) $@ && cd ..
	cd $(EnumVal_DIR) && $(MAKE) $@ && cd ..
	rm -f Makefile config.cache config.log config.status
	rm -f *~ core

