#
# 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.3  1999/12/14 23:53:20  rahulj
# Removed the offending Ctrl-M's from the commit message
# logs which was giving packaging problems.
#
# PR:
# Obtained from:
# Submitted by:
# Reviewed by:
#
# Revision 1.2  1999/11/23 01:59:43  rahulj
# Code now works under HPUX 11. Tested inmemory message loader.
# Revamped makefiles. Builds with both DCE threads as well as pthread libraries.
#
# Revision 1.1.1.1  1999/11/09 01:09:11  twl
# Initial checkin
#
# Revision 1.4  1999/11/08 20:44:28  rahul
# Swat for adding in Product name and CVS comment log variable.
#
#

PLATFORM = @platform@
CC  = @cc@
CXX = @cxx@
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
	@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)
