#
# 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.6  2004/09/08 13:56:50  peiyongz
# Apache License Version 2.0
#
# Revision 1.5  2004/07/09 16:30:42  peiyongz
# Build on HP-Itanium, aCC A.05.52
#
# Revision 1.4  2002/09/17 21:24:07  peiyongz
# RPM for Xerces2.1.0, patch from Thomas Woerner (thomas@linux.de)
#
# Revision 1.3  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.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:37  peiyongz
# sane_include
#
# Revision 1.6  2001/07/08 20:13:04  jberry
# Simplify file existance checks
#
# Revision 1.5  2001/07/08 19:54:35  jberry
# Fix clean and distclean targets; broken because rm fails if passed no files
#
# Revision 1.4  2001/07/06 17:12:09  tng
# Automatic build of single-threaded library.  By Martin Kalen.
#
# Revision 1.3  2001/06/27 17:09:45  tng
# [Bug 1147] Headers install in wrong directory.  By Murray Cumming.
#
# Revision 1.2  2001/05/11 13:27:06  tng
# Copyright update.
#
# 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@
NETACCESSOR = @netaccessor@
THREADS = @threads@
LIBTYPE = @libtype@
ARCH = @host_cpu@

MODULE = validators

include ../Makefile.incl

VALIDATORS_CPP_PUBHEADERS =

VALIDATORS_CPP_PRIVHEADERS =

VALIDATORS_C_FILES =

VALIDATORS_CPP_OBJECTS =

all:: includes $(VALIDATORS_CPP_OBJECTS) common datatype DTD schema

includes:: pubheaders $(VALIDATORS_C_FILES)
	${MAKE} -C common $@
	${MAKE} -C datatype $@
	${MAKE} -C DTD $@
	${MAKE} -C schema $@


common::
	${MAKE} -C common


datatype::
	${MAKE} -C datatype


DTD::
	${MAKE} -C DTD


schema::
	${MAKE} -C schema


pubheaders::
	-mkdir -p $(XML_INC_DIR)/$(MODULE)


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


clean::
	@echo "Making clean in $(MODULE) ..."
ifneq ($(strip $(VALIDATORS_CPP_OBJECTS)),)
	$(RM2) $(addprefix $(XML_OBJ_DIR)/,$(VALIDATORS_CPP_OBJECTS))
endif
	${MAKE} -C common $@
	${MAKE} -C datatype $@
	${MAKE} -C DTD $@
	${MAKE} -C schema $@



distclean:: clean
	$(RM) Makefile $(DEPFILE)
	@echo "Removing all $(MODULE) header files ..."
ifneq ($(strip $(VALIDATORS_CPP_PUBHEADERS)),)
	$(RM2) $(addprefix $(XML_INC_DIR)/$(MODULE)/,$(VALIDATORS_CPP_PUBHEADERS))
endif
ifneq ($(strip $(VALIDATORS_C_FILES)),)
	$(RM2) $(addprefix $(XML_INC_DIR)/$(MODULE)/,$(VALIDATORS_C_FILES))
endif
	${MAKE} -C common $@
	${MAKE} -C datatype $@
	${MAKE} -C DTD $@
	${MAKE} -C schema $@


install::
	-mkdir -p $(DESTDIR)$(PREFIX_INCLUDE)/$(MODULE)
	${MAKE} -C common $@
	${MAKE} -C datatype $@
	${MAKE} -C DTD $@
	${MAKE} -C schema $@
