#
# 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$
#

DOMIDTest_DIR=DOM/DOMIDTest
DOMMemTest_DIR=DOM/DOMMemTest
DOMTest_DIR=DOM/DOMTest
IDOMTest_DIR=IDom/IDOMTest
Traversal_DIR=DOM/Traversal
ITraversal_DIR=IDom/ITraversal
ThreadTest_DIR=ThreadTest
IThreadTest_DIR=IThreadTest
EncodingTest_DIR=EncodingTest
DOMRange_DIR=DOM/RangeTest
IDOMRange_DIR=IDom/IRangeTest
InitTermTest_DIR=InitTermTest

LIB_DIR=${XERCESCROOT}/lib

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

ifeq (${PLATFORM},HPUX)
  ifeq (${OSVER}, HPUX10)
      all::	threadtest ithreadtest encodingtest traversal itraversal
  else
      all::	domidtest dommemtest domtest idomtest threadtest ithreadtest encodingtest traversal itraversal rangetest irangetest inittermtest
  endif
else
    all::	domidtest dommemtest domtest idomtest threadtest ithreadtest encodingtest traversal itraversal rangetest irangetest inittermtest
endif

domidtest::
	@echo Building "DOMIDTest"
	cd $(DOMIDTest_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

dommemtest::
	@echo Building "DOMMemTest"
	cd $(DOMMemTest_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

domtest::
	@echo Building "DOMTest"
	cd $(DOMTest_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

idomtest::
	@echo Building "IDOMTest"
	cd $(IDOMTest_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

threadtest::
	@echo Building "ThreadTest"
	cd $(ThreadTest_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

ithreadtest::
	@echo Building "IThreadTest"
	cd $(IThreadTest_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

encodingtest::
	@echo Building "EncodingTest"
	cd $(EncodingTest_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

traversal::
	@echo Building "Traversal"
	cd $(Traversal_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

itraversal::
	@echo Building "ITraversal"
	cd $(ITraversal_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

rangetest::
	@echo Building "Range"
	cd $(DOMRange_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

irangetest::
	@echo Building "Range"
	cd $(IDOMRange_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

inittermtest::
	@echo Building "InitTermTest"
	cd $(InitTermTest_DIR) ; $(MAKE) $(MAKE_FLAGS) ; cd ..

clean::
	cd $(DOMIDTest_DIR) && $(MAKE) $@ && cd ..
	cd $(DOMMemTest_DIR) && $(MAKE) $@ && cd ..
	cd $(DOMTest_DIR) && $(MAKE) $@ && cd ..
	cd $(IDOMTest_DIR) && $(MAKE) $@ && cd ..
	cd $(ThreadTest_DIR) && $(MAKE) $@ && cd ..
	cd $(IThreadTest_DIR) && $(MAKE) $@ && cd ..
	cd $(EncodingTest_DIR) && $(MAKE) $@ && cd ..
	cd $(Traversal_DIR) && $(MAKE) $@ && cd ..
	cd $(ITraversal_DIR) && $(MAKE) $@ && cd ..
	cd $(DOMRange_DIR) && $(MAKE) $@ && cd ..
	cd $(IDOMRange_DIR) && $(MAKE) $@ && cd ..
	cd $(InitTermTest_DIR) && $(MAKE) $@ && cd ..

distclean::
	cd $(DOMIDTest_DIR) && $(MAKE) $@ && cd ..
	cd $(DOMMemTest_DIR) && $(MAKE) $@ && cd ..
	cd $(DOMTest_DIR) && $(MAKE) $@ && cd ..
	cd $(IDOMTest_DIR) && $(MAKE) $@ && cd ..
	cd $(ThreadTest_DIR) && $(MAKE) $@ && cd ..
	cd $(IThreadTest_DIR) && $(MAKE) $@ && cd ..
	cd $(EncodingTest_DIR) && $(MAKE) $@ && cd ..
	cd $(Traversal_DIR) && $(MAKE) $@ && cd ..
	cd $(ITraversal_DIR) && $(MAKE) $@ && cd ..
	cd $(DOMRange_DIR) && $(MAKE) $@ && cd ..
	cd $(IDOMRange_DIR) && $(MAKE) $@ && cd ..
	cd $(InitTermTest_DIR) && $(MAKE) $@ && cd ..
	rm -f Makefile config.cache config.log config.status
	rm -f *~ core

