#
# 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/>.
# 
#
# $Log$
# Revision 1.7  2000/05/15 20:46:10  aruna1
# Unix related changes in for NodeIDMap
#
# Revision 1.6  2000/02/29 02:19:11  rahulj
# No more compilation errors under HPUX 11.0. We do not build
# DOMMemTest as it crashes the aCC compiler.
#
# Revision 1.5  2000/02/26 07:20:17  rahulj
#  - The threading tests now work on HPUX.
#  - Under HPUX 10.20 we do no build DOMMemTest and DOMTest.
#    It crashes the compiler.
#  - One could not write more worse makefiles than what exists for the
#    tests. Hopefully, I will get bugged enough to fix them oneday.
#
# Revision 1.4  2000/02/18 22:51:39  abagchi
# Added Traversal
#
# Revision 1.3  2000/02/17 20:18:20  abagchi
# Added Encoding Test
#
# Revision 1.2  2000/02/06 07:48:34  rahulj
# Year 2K copyright swat.
#
# Revision 1.1  2000/01/31 22:21:53  aruna1
# initial checkin
#
#
#

DOMIDTest_DIR=DOM/DOMIDTest
DOMMemTest_DIR=DOM/DOMMemTest
DOMTest_DIR=DOM/DOMTest
Traversal_DIR=DOM/Traversal
ThreadTest_DIR=ThreadTest
EncodingTest_DIR=EncodingTest

LIB_DIR=${XERCESCROOT}/lib

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

ifeq (${PLATFORM},HPUX)
  ifeq (${OSVER}, HPUX10)
      all:	threadtest encodingtest traversal
  else
      all:	domtest threadtest encodingtest traversal
  endif
else
    all:	domidtest dommemtest domtest threadtest encodingtest traversal
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 ..

threadtest:
	@echo Building "ThreadTest"
	cd $(ThreadTest_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 ..

clean:
	cd $(DOMIDTest_DIR) && $(MAKE) $@ && cd ..
	cd $(DOMMemTest_DIR) && $(MAKE) $@ && cd ..
	cd $(DOMTest_DIR) && $(MAKE) $@ && cd ..
	cd $(ThreadTest_DIR) && $(MAKE) $@ && cd ..
	cd $(EncodingTest_DIR) && $(MAKE) $@ && cd ..
	cd $(Traversal_DIR) && $(MAKE) $@ && cd ..

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

