#
# The Apache Software License, Version 1.1
# 
# Copyright (c) 1999 The Apache Software Foundation.  All rights 
# reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer. 
# 
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in
#    the documentation and/or other materials provided with the
#    distribution.
# 
# 3. The end-user documentation included with the redistribution,
#    if any, must include the following acknowledgment:  
#       "This product includes software developed by the
#        Apache Software Foundation (http://www.apache.org/)."
#    Alternately, this acknowledgment may appear in the software itself,
#    if and wherever such third-party acknowledgments normally appear.
# 
# 4. The names "Xerces" and "Apache Software Foundation" must
#    not be used to endorse or promote products derived from this
#    software without prior written permission. For written 
#    permission, please contact apache\@apache.org.
# 
# 5. Products derived from this software may not be called "Apache",
#    nor may "Apache" appear in their name, without prior written
#    permission of the Apache Software Foundation.
# 
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
# ====================================================================
# 
# This software consists of voluntary contributions made by many
# individuals on behalf of the Apache Software Foundation, and was
# originally based on software copyright (c) 1999, International
# Business Machines, Inc., http://www.ibm.com .  For more information
# on the Apache Software Foundation, please see
# <http://www.apache.org/>.
# 
#
# $Log$
# Revision 1.4  1999/11/24 23:21:42  rahulj
# Now works under HPUX 10.20 with CC and aCC, with ICU and native
distclean target now remove and remaining Makefile(s)
clean target now removes the template repository directory
#
# Revision 1.3  1999/11/23 01:59:16  rahulj
# Code now works under HPUX 11. Tested inmemory message loader.
Revamped makefiles. Builds with both DCE threads as well as pthread libraries.
#
# Revision 1.2  1999/11/12 20:38:43  rahulj
# Replaced XML4CROOT with XERCESCROOT.
#
# Revision 1.1.1.1  1999/11/09 01:10:49  twl
# Initial checkin
#
# Revision 1.2  1999/11/08 20:43:14  rahul
# Swat for adding in Product name and CVS comment log variable.
#
#

###################################################################
#                    IMPORTANT NOTE                               #
###################################################################
# If you are going to do the OS390BATCH build, make sure you have #
# the OS390BATCH environment variable set.                        #
#                                                                 #
#   export OS390BATCH=1                                           #
#                                                                 #
###################################################################

PLATFORM = @platform@
CC  = @cc@
CXX = @cxx@
PREFIX = @prefix@
LDFLAGS = @ldflags@
LIBS = @libs@
OSVER = @osver@

include ../src/Makefile.incl

LIB=${XERCESCROOT}/lib
## OS390BATCH
ifeq (${OS390BATCH},1)
BATCH_TARGET = "//'${LOADMOD}(XML4C30)'"
endif
LIBNAME=libxerces-c
THISLIB=${LIB}/${LIBNAME}
VER=1_0

ALL_OBJECTS_DIR=${XERCESCROOT}/obj
ALL_OBJECTS=$(wildcard $(ALL_OBJECTS_DIR)/*.o)

#######################################################
#  HP-UX with CC compiler is awkward since it does    #
#  not instantiate templates automatically. To do so  #
#  you need to invoke the linker. So, just for this   #
#  compiler, we try to create a dummy executable      #
#  before we create the shared library.  This will    #
#  force all templates to be instantiated and the     #
#  shared library is created with all template        #
#  instantiations in place.                           #
#######################################################

ifeq (${PLATFORM},HPUX)
  ifeq (${CXX},CC)
    ######  Start HP-UX  CC compiler specific stuff #######
    DUMMYEXE=$(XML_LIB_DIR)/dummyExe
    TEMPLATESOBJS=$(wildcard $(TEMPLATESREPOSITORY)/*.o)

    all: $(DUMMYEXE) ${THISLIB}${VER}${SHLIBSUFFIX}
	\rm -f $(DUMMYEXE)

    $(DUMMYEXE): $(ALL_OBJECTS)
	${MAKE_SHARED} -o ${@} $^ $(PLATFORM_LIBRARIES) $(ALLLIBS)

    ######  End HP-UX  CC compiler specific stuff #######
  else
    all: ${THISLIB}${VER}${SHLIBSUFFIX}
  endif
else
## OS390BATCH
  ifeq (${OS390BATCH},1)
all: ${BATCH_TARGET}
  else
all: ${THISLIB}${VER}${SHLIBSUFFIX}
  endif
endif

########################################################
#                                                      #
# OS/390 works pretty much the same way as Windows NT  #
# as far as linking goes. The runtime library is       #
# called .dll, and the link-time libraries have a .x   #
# extension. You need the .x files to link             #
# your application at build time and need the .dll     #
# file to run it. So, we need to copy over the .x      #
# file to the lib directory as well, so that you can   #
# link your application.                               #
########################################################

${THISLIB}${VER}${SHLIBSUFFIX}:	$(ALL_OBJECTS)
	@echo Building ${THISLIB}${VER}${SHLIBSUFFIX}
	${MAKE_SHARED} -o ${@} $^ $(TEMPLATESOBJS) $(PLATFORM_LIBRARIES) $(EXTRA_LINK_OPTIONS) $(ALLLIBS)
## OS390
ifeq (${PLATFORM},OS390)
## OS390BATCH
ifeq (${OS390BATCH},1)
${BATCH_TARGET}:        $(ALL_OBJECTS)
	@echo Building ${BATCH_TARGET}
	${MAKE_SHARED} -o ${@} $^ $(TEMPLATESOBJS) $(PLATFORM_LIBRARIES) $(EXTRA_LINK_OPTIONS) $(ALLLIBS)
else
	$(CP) ${LIBNAME}${VER}${OS390SIDEDECK} ${LIB}
endif
endif


clean:
	@echo "Making clean in obj ..."
	-rm -f $(ALL_OBJECTS) ${THISLIB}${VER}${SHLIBSUFFIX}
ifneq ($strip $(TEMPLATESREPOSITORY)),)
	-rm -f $(TEMPLATESREPOSITORY)/*.o
	-rm -f $(TEMPLATESREPOSITORY)/*.c
	-rm -f $(TEMPLATESREPOSITORY)/*.cs
	-rm -f $(TEMPLATESREPOSITORY)/*.he
endif


distclean:	clean
	rm -f Makefile
ifneq ($strip $(TEMPLATESREPOSITORY)),)
	-rm -rf $(TEMPLATESREPOSITORY)
endif


install:
ifeq (${OS390BATCH},1)
	@echo "Nothing to do for OS390BATCH ..."
else
	-mkdir -p ${PREFIX}/lib
	$(CP) ${THISLIB}${VER}${SHLIBSUFFIX} $(PREFIX)/lib
ifeq (${PLATFORM},OS390)
	$(CP) ${LIBNAME}${VER}${OS390SIDEDECK} $(PREFIX)/lib
endif
endif

