#
# The Apache Software License, Version 1.1
#
# Copyright (c) 1999-2000 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/>.
#
#
# $Id$
#

SAXPrint_DIR=SAXPrint
SAX2Print_DIR=SAX2Print
SAXCount_DIR=SAXCount
SAX2Count_DIR=SAX2Count
DOMPrint_DIR=DOMPrint
DOMCount_DIR=DOMCount
IDOMPrint_DIR=IDOMPrint
IDOMCount_DIR=IDOMCount
Redirect_DIR=Redirect
MemParse_DIR=MemParse
PParse_DIR=PParse
StdInParse_DIR=StdInParse
EnumVal_DIR=EnumVal
SEnumVal_DIR=SEnumVal
CreateDOMDocument_DIR=CreateDOMDocument

LIB_DIR=${XERCESCROOT}/lib

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

all::	saxprint sax2print saxcount sax2count domprint domcount idomprint idomcount redirect memparse pparse stdinparse enumval senumval createdomdocument

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

sax2print::
	@echo Building "SAX2Print"
	cd $(SAX2Print_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

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

sax2count::
	@echo Building "SAX2Count"
	cd $(SAX2Count_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 ..

idomprint::
	@echo Building "IDOMPrint"
	cd $(IDOMPrint_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

idomcount::
	@echo Building "IDOMCount"
	cd $(IDOMCount_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 ..

senumval::
	@echo Building "SEnumVal"
	cd $(SEnumVal_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

createdomdocument::
	@echo Building "CreateDOMDocument"
	cd $(CreateDOMDocument_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..


clean::
	cd $(SAXPrint_DIR) && $(MAKE) $@ && cd ..
	cd $(SAX2Print_DIR) && $(MAKE) $@ && cd ..
	cd $(SAXCount_DIR) && $(MAKE) $@ && cd ..
	cd $(SAX2Count_DIR) && $(MAKE) $@ && cd ..
	cd $(DOMPrint_DIR) && $(MAKE) $@ && cd ..
	cd $(DOMCount_DIR) && $(MAKE) $@ && cd ..
	cd $(IDOMPrint_DIR) && $(MAKE) $@ && cd ..
	cd $(IDOMCount_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 ..
	cd $(SEnumVal_DIR) && $(MAKE) $@ && cd ..
	cd $(CreateDOMDocument_DIR) && $(MAKE) $@ && cd ..

distclean::
	cd $(SAXPrint_DIR) && $(MAKE) $@ && cd ..
	cd $(SAX2Print_DIR) && $(MAKE) $@ && cd ..
	cd $(SAXCount_DIR) && $(MAKE) $@ && cd ..
	cd $(SAX2Count_DIR) && $(MAKE) $@ && cd ..
	cd $(DOMPrint_DIR) && $(MAKE) $@ && cd ..
	cd $(DOMCount_DIR) && $(MAKE) $@ && cd ..
	cd $(IDOMPrint_DIR) && $(MAKE) $@ && cd ..
	cd $(IDOMCount_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 ..
	cd $(SEnumVal_DIR) && $(MAKE) $@ && cd ..
	cd $(CreateDOMDocument_DIR) && $(MAKE) $@ && cd ..
	rm -f Makefile config.cache config.log config.status
	rm -f *~ core

