#
# 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.5  2005/04/05 09:21:56  gareth
# Fix for jira 1397. *Much* nicer make output. Thanks to Axel Weib.
#
# Revision 1.4  2004/09/08 13:56:07  peiyongz
# Apache License Version 2.0
#
# Revision 1.3  2004/08/11 18:40:04  peiyongz
# XSValue
#
# Revision 1.2  2004/07/09 16:11:32  peiyongz
# Build on HP-Itanium, aCC A.05.52
#
# Revision 1.1  2003/09/16 14:33:36  neilg
# PSVI/schema component model classes, with Makefile/configuration changes necessary to build them
#

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 = framework
SUBMODULE = psvi

PSVI_CPP_PUBHEADERS = \
	PSVIAttribute.hpp \
	PSVIAttributeList.hpp \
	PSVIElement.hpp \
	PSVIHandler.hpp \
	PSVIItem.hpp \
	XSAnnotation.hpp \
	XSAttributeDeclaration.hpp \
	XSAttributeGroupDefinition.hpp \
	XSAttributeUse.hpp \
	XSComplexTypeDefinition.hpp \
	XSConstants.hpp \
	XSElementDeclaration.hpp \
	XSFacet.hpp \
	XSIDCDefinition.hpp \
	XSModel.hpp \
	XSModelGroup.hpp \
	XSModelGroupDefinition.hpp \
	XSMultiValueFacet.hpp \
	XSNamedMap.hpp \
	XSNamespaceItem.hpp \
	XSNotationDeclaration.hpp \
	XSObject.hpp \
	XSParticle.hpp \
	XSSimpleTypeDefinition.hpp \
	XSTypeDefinition.hpp \
	XSValue.hpp \
	XSWildcard.hpp 

PSVI_C_FILES = \
	XSNamedMap.c

PSVI_CPP_OBJECTS = \
	PSVIAttribute.$(TO) \
	PSVIAttributeList.$(TO) \
	PSVIElement.$(TO) \
	PSVIItem.$(TO) \
	XSAnnotation.$(TO) \
	XSAttributeDeclaration.$(TO) \
	XSAttributeGroupDefinition.$(TO) \
	XSAttributeUse.$(TO) \
	XSComplexTypeDefinition.$(TO) \
	XSIDCDefinition.$(TO) \
	XSElementDeclaration.$(TO) \
	XSFacet.$(TO) \
	XSModel.$(TO) \
	XSModelGroup.$(TO) \
	XSModelGroupDefinition.$(TO) \
	XSMultiValueFacet.$(TO) \
	XSNamespaceItem.$(TO) \
	XSNotationDeclaration.$(TO) \
	XSObject.$(TO) \
	XSParticle.$(TO) \
	XSSimpleTypeDefinition.$(TO) \
	XSTypeDefinition.$(TO) \
	XSValue.$(TO) \
	XSWildcard.$(TO) 

all::	includes $(PSVI_CPP_OBJECTS)

includes::	pubheaders $(PSVI_C_FILES)

pubheaders::
	$Qmkdir -p $(XML_INC_DIR)/$(MODULE)/$(SUBMODULE)
	@echo "  (CP)  $(XML_INC_DIR)/$(MODULE)/$(SUBMODULE)"
	$Q$(CP) $(PSVI_CPP_PUBHEADERS) $(PSVI_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)/,$(PSVI_CPP_OBJECTS))

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

install::
	-mkdir -p $(DESTDIR)$(PREFIX_INCLUDE)/$(MODULE)/$(SUBMODULE)
	$(CP) $(PSVI_CPP_PUBHEADERS) $(PSVI_C_FILES) $(DESTDIR)$(PREFIX_INCLUDE)/$(MODULE)/$(SUBMODULE)
