#
# 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.7  2005/04/05 09:21:57  gareth
# Fix for jira 1397. *Much* nicer make output. Thanks to Axel Weib.
#
# Revision 1.6  2004/09/08 13:56:53  peiyongz
# Apache License Version 2.0
#
# Revision 1.5  2004/07/09 16:31:26  peiyongz
# Build on HP-Itanium, aCC A.05.52
#
# Revision 1.4  2003/12/11 21:57:26  peiyongz
# XMLCanRepGroup
#
# Revision 1.3  2002/09/17 21:24:25  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:42  peiyongz
# sane_include
#
# Revision 1.22  2001/11/07 19:18:52  peiyongz
# DateTime Port
#
# Revision 1.21  2001/10/01 16:14:22  peiyongz
# DTV Reorganization:new classes: AbstractNumericFactValidator/ AbstractNumericValidator
#
# Revision 1.20  2001/09/25 16:08:26  peiyongz
# DTV Reorganization: Create native NameDTV and NCNameDTV
#
# Revision 1.19  2001/09/18 16:00:54  peiyongz
# DTV reorganization: AbstractStringValidator
#
# Revision 1.18  2001/08/24 17:12:01  knoaman
# Add support for anySimpleType.
# Remove parameter 'baseValidator' from the virtual method 'newInstance'.
#
# Revision 1.17  2001/08/01 18:49:16  peiyongz
# AnyRUIDatatypeValidator
#
# Revision 1.16  2001/07/26 20:40:56  peiyongz
# FloatDatatypeValidator
#
# Revision 1.15  2001/07/24 13:59:03  peiyongz
# DoubleDTV
#
# Revision 1.14  2001/07/13 14:10:37  peiyongz
# UnionDTV
#
# Revision 1.13  2001/07/11 21:37:15  peiyongz
# ListDatatypeDTV
#
# Revision 1.12  2001/07/06 20:21:46  peiyongz
# QNameDTV & ENTITYDTV enabled
#
# Revision 1.11  2001/07/06 17:12:11  tng
# Automatic build of single-threaded library.  By Martin Kalen.
#
# Revision 1.10  2001/07/05 20:15:26  peiyongz
# NOTATIONDatatypeValidator
#
# Revision 1.9  2001/07/04 20:16:31  peiyongz
# IDREFDatatypeValidator
#
# Revision 1.8  2001/07/04 15:22:55  peiyongz
# IDDatatypeValidator
#
# Revision 1.7  2001/06/27 17:09:52  tng
# [Bug 1147] Headers install in wrong directory.  By Murray Cumming.
#
# Revision 1.6  2001/05/16 15:24:44  tng
# Schema: Add Base64 and HexBin.  By Pei Yong Zhang.
#
# Revision 1.5  2001/05/11 13:27:29  tng
# Copyright update.
#
# Revision 1.4  2001/05/10 20:51:31  tng
# Schema: Add DecimalDatatypeValidator and XMLBigDecimal, XMLBigInteger.  By Pei Yong Zhang.
#
# Revision 1.3  2001/05/09 18:43:41  tng
# Add StringDatatypeValidator and BooleanDatatypeValidator.  By Pei Yong Zhang.
#
# Revision 1.2  2001/03/21 21:39:15  knoaman
# Schema symbols and Datatype validator part I
#
# Revision 1.1  2001/02/15 18:41:50  tng
# Schema: Exception Handling added by Pei Yong Zhang.  Add NumberFormatException, ParseException,
# InvalidDatatypeFacetException, and InvalidDatatypeValueException.  The associated
# Makefile.in and configure.in are updated.
#
#

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 = datatype

VALIDATORS_DATATYPE_CPP_PUBHEADERS = \
	InvalidDatatypeFacetException.hpp \
	InvalidDatatypeValueException.hpp \
	DatatypeValidator.hpp \
	DatatypeValidatorFactory.hpp \
	Base64BinaryDatatypeValidator.hpp \
	BooleanDatatypeValidator.hpp \
	DecimalDatatypeValidator.hpp \
	HexBinaryDatatypeValidator.hpp \
	StringDatatypeValidator.hpp \
	IDDatatypeValidator.hpp \
	NOTATIONDatatypeValidator.hpp \
	ENTITYDatatypeValidator.hpp \
	QNameDatatypeValidator.hpp \
	NameDatatypeValidator.hpp \
	NCNameDatatypeValidator.hpp \
	ListDatatypeValidator.hpp \
	UnionDatatypeValidator.hpp \
	DoubleDatatypeValidator.hpp \
	FloatDatatypeValidator.hpp \
	AnyURIDatatypeValidator.hpp \
	IDREFDatatypeValidator.hpp \
	AnySimpleTypeDatatypeValidator.hpp \
	AbstractNumericFacetValidator.hpp \
	AbstractNumericValidator.hpp \
	AbstractStringValidator.hpp \
	DateTimeValidator.hpp \
	DateTimeDatatypeValidator.hpp \
	DateDatatypeValidator.hpp \
	TimeDatatypeValidator.hpp \
	DayDatatypeValidator.hpp \
	MonthDatatypeValidator.hpp \
	MonthDayDatatypeValidator.hpp \
	YearDatatypeValidator.hpp \
	YearMonthDatatypeValidator.hpp \
	XMLCanRepGroup.hpp \
	DurationDatatypeValidator.hpp

VALIDATORS_DATATYPE_CPP_PRIVHEADERS =

VALIDATORS_DATATYPE_C_FILES =

VALIDATORS_DATATYPE_CPP_OBJECTS = \
	DatatypeValidator.$(TO) \
	DatatypeValidatorFactory.$(TO) \
	Base64BinaryDatatypeValidator.$(TO) \
	BooleanDatatypeValidator.$(TO) \
	DecimalDatatypeValidator.$(TO) \
	HexBinaryDatatypeValidator.$(TO) \
	StringDatatypeValidator.$(TO) \
	IDDatatypeValidator.$(TO) \
	NOTATIONDatatypeValidator.$(TO) \
	ENTITYDatatypeValidator.$(TO) \
	QNameDatatypeValidator.$(TO) \
	NameDatatypeValidator.$(TO) \
	NCNameDatatypeValidator.$(TO) \
	ListDatatypeValidator.$(TO) \
	UnionDatatypeValidator.$(TO) \
	DoubleDatatypeValidator.$(TO) \
	FloatDatatypeValidator.$(TO) \
	AnyURIDatatypeValidator.$(TO) \
	IDREFDatatypeValidator.$(TO) \
	AnySimpleTypeDatatypeValidator.$(TO) \
	AbstractNumericFacetValidator.$(TO) \
	AbstractNumericValidator.$(TO) \
	AbstractStringValidator.$(TO) \
	DateTimeValidator.$(TO) \
	DateTimeDatatypeValidator.$(TO) \
	DateDatatypeValidator.$(TO) \
	TimeDatatypeValidator.$(TO) \
	DayDatatypeValidator.$(TO) \
	MonthDatatypeValidator.$(TO) \
	MonthDayDatatypeValidator.$(TO) \
	YearDatatypeValidator.$(TO) \
	YearMonthDatatypeValidator.$(TO) \
	XMLCanRepGroup.$(TO) \
	DurationDatatypeValidator.$(TO)

all::	includes $(VALIDATORS_DATATYPE_CPP_OBJECTS)

includes::	pubheaders $(VALIDATORS_DATATYPE_C_FILES)

pubheaders::
	$Qmkdir -p $(XML_INC_DIR)/$(MODULE)/$(SUBMODULE)
	@echo "  (CP)  $(XML_INC_DIR)/$(MODULE)/$(SUBMODULE)"
	$Q$(CP) $(VALIDATORS_DATATYPE_CPP_PUBHEADERS) $(VALIDATORS_DATATYPE_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_DATATYPE_CPP_OBJECTS))

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

install::
	-mkdir -p $(DESTDIR)$(PREFIX_INCLUDE)/$(MODULE)/$(SUBMODULE)
	$(CP) $(VALIDATORS_DATATYPE_CPP_PUBHEADERS) $(VALIDATORS_DATATYPE_C_FILES) $(DESTDIR)$(PREFIX_INCLUDE)/$(MODULE)/$(SUBMODULE)
