#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
# 
#      http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
#
# $Log$
# Revision 1.8  2005/04/05 09:21:57  gareth
# Fix for jira 1397. *Much* nicer make output. Thanks to Axel Weib.
#
# Revision 1.7  2004/09/08 13:56:50  peiyongz
# Apache License Version 2.0
#
# Revision 1.6  2004/07/09 16:31:45  peiyongz
# Build on HP-Itanium, aCC A.05.52
#
# Revision 1.5  2003/10/10 16:24:51  peiyongz
# Implementation of Serialization/Deserialization
#
# Revision 1.4  2003/06/20 19:00:00  peiyongz
# Stateless Grammar Pool :: Part I
#
# Revision 1.3  2002/09/17 21:24:31  peiyongz
# RPM for Xerces2.1.0, patch from Thomas Woerner (thomas@linux.de)
#
# Revision 1.2  2002/07/26 16:49:29  tng
# [Bug 2681] Can't build with gcc/g++ not named 'gcc'/'g++'.  Patch from Jonathan Lennox.
#
# Revision 1.1.1.1  2002/02/01 22:22:45  peiyongz
# sane_include
#
# Revision 1.11  2001/07/06 17:12:10  tng
# Automatic build of single-threaded library.  By Martin Kalen.
#
# Revision 1.10  2001/06/27 17:09:47  tng
# [Bug 1147] Headers install in wrong directory.  By Murray Cumming.
#
# Revision 1.9  2001/05/11 13:27:11  tng
# Copyright update.
#
# Revision 1.8  2001/03/21 21:56:22  tng
# Schema: Add Schema Grammar, Schema Validator, and split the DTDValidator into DTDValidator, DTDScanner, and DTDGrammar.
#
# Revision 1.7  2001/02/16 14:58:56  tng
# Schema: Update Makefile, configure files, project files, and include path in
# certain cpp files because of the move of the common Content Model files.  By Pei Yong Zhang.
#
# Revision 1.6  2000/03/01 22:30:04  abagchi
# Object files are now created directly under obj directory
#
# Revision 1.5  2000/02/04 23:48:54  abagchi
# Made sure all targets are appended with :: not single :
#
# Revision 1.4  2000/02/01 23:44:01  abagchi
# AS/400 related change
#
# Revision 1.3  1999/12/14 23:53:36  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 02:01:05  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:03:42  twl
# Initial checkin
#
# Revision 1.3  1999/11/08 20:45:43  rahul
# Swat for adding in Product name and CVS comment log variable.
#:
#

PLATFORM = @platform@
CC  = @cc@
CXX = @cxx@
CXXVER = @cxxver@
GCC = @GCC@
GXX = @GXX@
CXXFLAGS = @cxxflags@
CFLAGS = @cflags@
PREFIX = @prefix@
PREFIX_INCLUDE = @prefix_include@
LDFLAGS = @ldflags@
LIBS = @libs@
OSVER = @osver@
USELIBWWW = @uselibwww@
MESSAGELOADER = @messageloader@
TRANSCODER = @transcoder@
THREADS = @threads@
LIBTYPE = @libtype@
ARCH = @host_cpu@

include ../../Makefile.incl

MODULE = validators
SUBMODULE = DTD

VALIDATORS_DTD_CPP_PUBHEADERS = \
	DTDAttDef.hpp \
	DTDAttDefList.hpp \
	DTDElementDecl.hpp \
	DTDEntityDecl.hpp \
	DTDGrammar.hpp \
	DTDScanner.hpp \
	DTDValidator.hpp \
	DocTypeHandler.hpp \
	XMLDTDDescriptionImpl.hpp

VALIDATORS_DTD_CPP_PRIVHEADERS =

VALIDATORS_DTD_C_FILES =

VALIDATORS_DTD_CPP_OBJECTS = \
	DTDAttDef.$(TO) \
	DTDAttDefList.$(TO) \
	DTDElementDecl.$(TO) \
	DTDEntityDecl.$(TO) \
	DTDGrammar.$(TO) \
	DTDScanner.$(TO) \
	DTDValidator.$(TO) \
	XMLDTDDescriptionImpl.$(TO)	

all::	includes $(VALIDATORS_DTD_CPP_OBJECTS)

includes::	pubheaders $(VALIDATORS_DTD_C_FILES)

pubheaders::
	$Qmkdir -p $(XML_INC_DIR)/$(MODULE)/$(SUBMODULE)
	@echo "  (CP)  $(XML_INC_DIR)/$(MODULE)/$(SUBMODULE)"
	$Q$(CP) $(VALIDATORS_DTD_CPP_PUBHEADERS) $(VALIDATORS_DTD_C_FILES) $(XML_INC_DIR)/$(MODULE)/$(SUBMODULE)

# this may generate unnecessary dependencies, but it makes life easier
depend:: includes
	@echo "  (DEP)"
	$Q$(MAKE_DEPEND) $(XML_INCL)  *.cpp > $(DEPFILE)

clean::
	@echo "Making clean in $(MODULE)/$(SUBMODULE) ..."
	$(RM2) $(addprefix $(XML_OBJ_DIR)/,$(VALIDATORS_DTD_CPP_OBJECTS))

distclean::	clean
	$(RM) Makefile $(DEPFILE)
	@echo "Removing all $(MODULE)/$(SUBMODULE) header files ..."
	$(RM2) $(addprefix $(XML_INC_DIR)/$(MODULE)/$(SUBMODULE)/,$(VALIDATORS_DTD_CPP_PUBHEADERS))

install::
	-mkdir -p $(DESTDIR)$(PREFIX_INCLUDE)/$(MODULE)/$(SUBMODULE)
	$(CP) $(VALIDATORS_DTD_CPP_PUBHEADERS) $(VALIDATORS_DTD_C_FILES) $(DESTDIR)$(PREFIX_INCLUDE)/$(MODULE)/$(SUBMODULE)
