#
# 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.12  2005/04/05 09:21:57  gareth
# Fix for jira 1397. *Much* nicer make output. Thanks to Axel Weib.
#
# Revision 1.11  2004/09/08 13:56:56  peiyongz
# Apache License Version 2.0
#
# Revision 1.10  2004/07/09 16:32:08  peiyongz
# Build on HP-Itanium, aCC A.05.52
#
# Revision 1.9  2003/06/20 21:56:07  peiyongz
# Stateless Grammar Pool :: Part I
#
# Revision 1.8  2003/06/20 19:03:03  peiyongz
# Stateless Grammar Pool :: Part I
#
# Revision 1.7  2003/01/29 19:48:06  gareth
# updated for PSVIDefs.hpp
#
# Revision 1.6  2002/09/17 21:24:39  peiyongz
# RPM for Xerces2.1.0, patch from Thomas Woerner (thomas@linux.de)
#
# Revision 1.5  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.4  2002/05/21 19:33:44  tng
# DOM Reorganization: rename XSDIDOMParser to XSDDOMParser
#
# Revision 1.3  2002/03/21 15:34:40  knoaman
# Add support for reporting line/column numbers of schema errors.
#
# Revision 1.2  2002/02/11 18:19:19  tng
# [Bug 2715] Build recursion suppresses make failures.
#
# Revision 1.1.1.1  2002/02/01 22:22:45  peiyongz
# sane_include
#
# Revision 1.18  2001/11/02 14:13:45  knoaman
# Add support for identity constraints.
#
# Revision 1.17  2001/08/22 11:33:43  tng
# typo: XercesElementWildcard
#
# Revision 1.16  2001/08/21 15:58:42  tng
# Schema: New files XercesElementWildCard.
#
# Revision 1.15  2001/07/31 15:26:54  knoaman
# Added support for <attributeGroup>.
#
# Revision 1.14  2001/07/24 20:13:30  knoaman
# Added support for <group> + extra constraint checking for complexType
#
# Revision 1.13  2001/07/06 17:12:13  tng
# Automatic build of single-threaded library.  By Martin Kalen.
#
# Revision 1.12  2001/06/27 17:09:56  tng
# [Bug 1147] Headers install in wrong directory.  By Murray Cumming.
#
# Revision 1.11  2001/05/15 21:59:32  knoaman
# TraverseSchema: add attribute checking + some fixes + more error messages.
# More attribute cheking to come.
#
# Revision 1.10  2001/05/11 13:27:32  tng
# Copyright update.
#
# Revision 1.9  2001/05/10 16:33:15  knoaman
# Traverse Schema Part III + error messages.
#
# Revision 1.8  2001/05/03 20:34:42  tng
# Schema: SchemaValidator update
#
# Revision 1.7  2001/05/03 19:17:57  knoaman
# TraverseSchema Part II.
#
# Revision 1.6  2001/04/19 17:43:14  knoaman
# More schema implementation classes.
#
# Revision 1.5  2001/04/04 18:02:04  tng
# Schema: include failure on Unix for XUtil.cpp.  Fixed by Pei Yong Zhang.
#
# Revision 1.4  2001/03/30 16:06:00  tng
# Schema: XUtil, added by Pei Yong Zhang
#
# Revision 1.3  2001/03/21 21:56:33  tng
# Schema: Add Schema Grammar, Schema Validator, and split the DTDValidator into DTDValidator, DTDScanner, and DTDGrammar.
#
# Revision 1.2  2001/03/21 21:39:19  knoaman
# Schema symbols and Datatype validator part I
#
# Revision 1.1  2001/02/27 18:48:22  tng
# Schema: Add SchemaAttDef, SchemaElementDecl, SchemaAttDefList.
#
#

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 = schema
XML_INCL := $(XML_INCL) -I$(XERCESCROOT)/src

VALIDATORS_SCHEMA_CPP_PUBHEADERS = \
	ComplexTypeInfo.hpp \
	GeneralAttributeCheck.hpp \
	NamespaceScope.hpp \
	PSVIDefs.hpp \
	SchemaAttDef.hpp \
	SchemaAttDefList.hpp \
	SchemaElementDecl.hpp \
	SchemaGrammar.hpp \
	SchemaInfo.hpp \
	SchemaSymbols.hpp \
	SchemaValidator.hpp \
	SubstitutionGroupComparator.hpp \
	TraverseSchema.hpp \
	XercesAttGroupInfo.hpp \
	XercesElementWildcard.hpp \
	XercesGroupInfo.hpp \
	XMLSchemaDescriptionImpl.hpp \
	XUtil.hpp \
	XSDDOMParser.hpp \
	XSDLocator.hpp \
	XSDErrorReporter.hpp

VALIDATORS_SCHEMA_CPP_PRIVHEADERS =

VALIDATORS_SCHEMA_C_FILES =

VALIDATORS_SCHEMA_CPP_OBJECTS = \
	ComplexTypeInfo.$(TO) \
	GeneralAttributeCheck.$(TO) \
	NamespaceScope.$(TO) \
	SchemaAttDef.$(TO) \
	SchemaAttDefList.$(TO) \
	SchemaElementDecl.$(TO) \
	SchemaGrammar.$(TO) \
	SchemaInfo.$(TO) \
	SchemaSymbols.$(TO) \
	SchemaValidator.$(TO) \
	SubstitutionGroupComparator.$(TO) \
	TraverseSchema.$(TO) \
	XercesAttGroupInfo.$(TO) \
	XercesElementWildcard.$(TO) \
	XercesGroupInfo.$(TO) \
	XMLSchemaDescriptionImpl.$(TO) \
	XUtil.$(TO) \
	XSDDOMParser.$(TO) \
	XSDLocator.$(TO) \
	XSDErrorReporter.$(TO)

all::	includes $(VALIDATORS_SCHEMA_CPP_OBJECTS) identity

includes::	pubheaders $(VALIDATORS_SCHEMA_C_FILES)
	${MAKE} -C identity $@

identity::
	${MAKE} -C identity

pubheaders::
	$Qmkdir -p $(XML_INC_DIR)/$(MODULE)/$(SUBMODULE)
	@echo "  (CP)  $(XML_INC_DIR)/$(MODULE)/$(SUBMODULE)"
	$Q$(CP) $(VALIDATORS_SCHEMA_CPP_PUBHEADERS) $(VALIDATORS_SCHEMA_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_SCHEMA_CPP_OBJECTS))
	${MAKE} -C identity $@

distclean::	clean
	$(RM) Makefile $(DEPFILE)
	@echo "Removing all $(MODULE)/$(SUBMODULE) header files ..."
	$(RM2) $(addprefix $(XML_INC_DIR)/$(MODULE)/$(SUBMODULE)/,$(VALIDATORS_SCHEMA_CPP_PUBHEADERS))
	${MAKE} -C identity $@

install::
	-mkdir -p $(DESTDIR)$(PREFIX_INCLUDE)/$(MODULE)/$(SUBMODULE)
	$(CP) $(VALIDATORS_SCHEMA_CPP_PUBHEADERS) $(VALIDATORS_SCHEMA_C_FILES) $(DESTDIR)$(PREFIX_INCLUDE)/$(MODULE)/$(SUBMODULE)
	${MAKE} -C identity $@
