#
# 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.1  1999/11/09 01:09:11  twl
# Initial revision
#
# Revision 1.4  1999/11/08 20:44:28  rahul
# Swat for adding in Product name and CVS comment log variable.
#:
#

PLATFORM = @platform@
COMPILER = @compiler@
CXXFLAGS = @cxxflags@
CFLAGS = @cflags@
PREFIX = @prefix@
LDFLAGS = @ldflags@
LIBS = @libs@
OSVER = @osver@
USELIBWWW = @uselibwww@
MESSAGELOADER = @messageloader@
TRANSCODER = @transcoder@

MODULE = dom

include ../Makefile.incl

DOM_CPP_PUBHEADERS = \
	DOM.hpp \
	DOMString.hpp \
	DOM_Attr.hpp \
	DOM_CDATASection.hpp \
	DOM_CharacterData.hpp \
	DOM_Comment.hpp \
	DOM_DOMException.hpp \
	DOM_DOMImplementation.hpp \
	DOM_Document.hpp \
	DOM_DocumentFragment.hpp \
	DOM_DocumentType.hpp \
	DOM_Element.hpp \
	DOM_Entity.hpp \
	DOM_EntityReference.hpp \
	DOM_NamedNodeMap.hpp \
	DOM_Node.hpp \
	DOM_NodeFilter.hpp \
	DOM_NodeIterator.hpp \
	DOM_NodeList.hpp \
	DOM_Notation.hpp \
	DOM_ProcessingInstruction.hpp \
	DOM_Text.hpp \
	DOM_TreeWalker.hpp

DOM_CPP_PRIVHEADERS =  \
	AttrImpl.hpp \
	CDATASectionImpl.hpp \
	CharacterDataImpl.hpp \
	CommentImpl.hpp \
	DStringPool.hpp \
	DeepNodeListImpl.hpp \
	DocumentFragmentImpl.hpp \
	DocumentImpl.hpp \
	DocumentTypeImpl.hpp \
	DomMemDebug.hpp \
	ElementDefinitionImpl.hpp \
	ElementImpl.hpp \
	EntityImpl.hpp \
	EntityReferenceImpl.hpp \
	MemDebug.hpp \
	NameNodeFilter.hpp \
	NamedNodeMapImpl.hpp \
	NodeImpl.hpp \
	NodeIteratorImpl.hpp \
	NodeFilterImpl.hpp \
	NodeListImpl.hpp \
	NodeVector.hpp \
	NotationImpl.hpp \
	ProcessingInstructionImpl.hpp \
	RefCountedImpl.hpp \
	TextImpl.hpp \
	TreeWalkerImpl.hpp

DOM_C_FILES = 

DOM_CPP_OBJECTS = \
	AttrImpl.o \
	CDATASectionImpl.o \
	CharacterDataImpl.o \
	CommentImpl.o \
	DOMString.o \
	DOM_Attr.o \
	DOM_CDATASection.o \
	DOM_CharacterData.o \
	DOM_Comment.o \
	DOM_DOMException.o \
	DOM_DOMImplementation.o \
	DOM_Document.o \
	DOM_DocumentFragment.o \
	DOM_DocumentType.o \
	DOM_Element.o \
	DOM_Entity.o \
	DOM_EntityReference.o \
	DOM_NamedNodeMap.o \
	DOM_Node.o \
	DOM_NodeList.o \
	DOM_NodeFilter.o \
	DOM_NodeIterator.o \
	DOM_TreeWalker.o \
	DOM_Notation.o \
	DOM_ProcessingInstruction.o \
	DOM_Text.o \
	DStringPool.o \
	DeepNodeListImpl.o \
	DocumentFragmentImpl.o \
	DocumentImpl.o \
	DocumentTypeImpl.o \
	DomMemDebug.o \
	ElementDefinitionImpl.o \
	ElementImpl.o \
	EntityImpl.o \
	EntityReferenceImpl.o \
	NamedNodeMapImpl.o \
	NodeImpl.o \
	NodeIteratorImpl.o \
	NodeFilterImpl.o \
	NodeListImpl.o \
	NodeVector.o \
	NotationImpl.o \
	ProcessingInstructionImpl.o \
	RefCountedImpl.o \
	TextImpl.o \
	TreeWalkerImpl.o


all:	includes $(DOM_CPP_OBJECTS) publish

includes:	pubheaders $(DOM_C_FILES)

pubheaders:
	-mkdir -p $(XML_INC_DIR)/$(MODULE)
	$(CP) $(DOM_CPP_PUBHEADERS) $(DOM_C_FILES) $(XML_INC_DIR)/$(MODULE)

publish:
	-mkdir -p ${ALL_OBJECTS_DIR}
	$(CP) $(DOM_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) $(DOM_CPP_OBJECTS)

distclean:	clean
	$(RM) Makefile $(DEPFILE)
	@echo "Removing all $(MODULE) header files ..."
	@for file in $(DOM_CPP_PUBHEADERS); do \
	rm -f $(XML_INC_DIR)/$(MODULE)/$$file; \
	done
	@for file in $(DOM_C_FILES); do \
	rm -f $(XML_INC_DIR)/$(MODULE)/$$file; \
	done
	@echo "Removing all $(MODULE) object files ..."
	@for file in $(DOM_CPP_OBJECTS); do \
	rm -f $(ALL_OBJECTS_DIR)/$$file; \
	done

install:
	-mkdir -p $(PREFIX)/$(MODULE)
	$(CP) $(DOM_CPP_PUBHEADERS) $(DOM_C_FILES) $(PREFIX)/$(MODULE)
