# Generated automatically from Makefile.in by configure.
#
# Copyright 1999-2004 The Apache Software Foundation.
#
# Licensed 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.3  2004/02/26 23:10:06  mhoyt
# Update to Apache 2.0 License
#
# Revision 1.2  2004/01/06 02:41:25  dbertoni
# Changes for Bugzilla 25914.
#
# Revision 1.1  2003/11/12 20:42:18  dbertoni
# Patches for bug 13238.
#
# Revision 1.2  2003/09/19 20:33:03  dbertoni
# Massive copyright update.
#
# Revision 1.1  2003/06/29 03:57:53  blautenb
# Moved source for sane includes
#
# Revision 1.1  2000/02/10 13:09:19  jdonohue
# Make dependencies file
#
#

#=============== LINUX SPECIFIC OPTIONS =========================
# This makefile only supported with gcc on linux
PLATFORM =LINUX
CC  = gcc
CXX = g++
PLATFORM_COMPILE_OPTIONS = -fpic -D${PLATFORM} -D_REENTRANT
CC1 = $(CXX) $(CXXFLAGS) $(PLATFORM_COMPILE_OPTIONS)


# We have to use the includes from the source distribution, since we use
# headers that others normally wouldn't
XSL_INCL = -I . -I $(XERCESCROOT)/src/

###################################################################
#                    IMPORTANT NOTE                               #
###################################################################
# Before you try to run the Makefile, make sure you have two      #
# environment variables set.                                      #
#                                                                 #
# export XALANCROOT=<the directory where you installed XALAN-C>   #
# export XERCESCROOT=<the directory where you installed XERCES-C> #
#                                                                 #
###################################################################


ifndef XALANCROOT 
noxalanroot:
	@echo XALANCROOT must be defined
endif

ifndef XERCESCROOT 
noxercesroot:
	@echo XERCESCROOT must be defined
endif

DOMSUPPORT_DIR = DOMSupport
INCLUDE_DIR = Include
PLATFORMSUPPORT_DIR = PlatformSupport
TESTXPATH_DIR = TestXPath
TESTXSLT_DIR = TestXSLT
XMLSUPPORT_DIR = XMLSupport
XPATH_DIR = XPath
XSLT_DIR = XSLT
XERCESINIT_DIR = XercesInit
XERCESPARSERLIAISON_DIR = XercesParserLiaison
XERCESPLATFORMSUPPORT_DIR = XercesPlatformSupport
ALL_OBJECTS_DIR = ${XALANCROOT}/obj


vpath %.cpp \
$(DOMSUPPORT_DIR):$(PLATFORMSUPPORT_DIR):$(TESTXPATH_DIR):$(TESTXSLT_DIR):\
$(XMLSUPPORT_DIR):$(XPATH_DIR):$(XSLT_DIR):$(XERCESINIT_DIR):\
$(XERCESPARSERLIAISON_DIR):$(XERCESPLATFORMSUPPORT_DIR)

${ALL_OBJECTS_DIR}/%.o:%.cpp
	$(CC1) -M $(XSL_INCL)  $< >> xxxdepends
	echo "$< " | sed 's/\.cpp/\\.o/' | sed 's/^.*\///'  >xxx1
	echo "$@" | sed 's/\.cpp/\\.o/'  >xxx2
	paste xxx1 xxx2 | awk '{print "s#" $$1 "#" $$2 "#"}' >> xxxscr 
	 
ALLSOURCE = \
	$(wildcard $(DOMSUPPORT_DIR)/*.cpp) \
	$(wildcard $(PLATFORMSUPPORT_DIR)/*.cpp) \
	$(wildcard $(XMLSUPPORT_DIR)/*.cpp) \
	$(wildcard $(XPATH_DIR)/*.cpp) \
	$(wildcard $(XSLT_DIR)/*.cpp) \
	$(wildcard $(XERCESINIT_DIR)/*.cpp) \
	$(wildcard $(XERCESPARSERLIAISON_DIR)/*.cpp) \
	$(wildcard $(XERCESPLATFORMSUPPORT_DIR)/*.cpp) 

ALL_OBJECTS = $(addprefix $(ALL_OBJECTS_DIR)/,$(addsuffix .o,$(basename $(notdir $(ALLSOURCE)))))

all:	 prepare compile finish

prepare:
	-rm xxx*
	-rm $(DEPENDSFILE)

compile: $(ALL_OBJECTS)

finish:
	sed -f xxxscr xxxdepends > $(DEPFILE)
	rm xxx*

