#
# The Apache Software License, Version 1.1
#
# Copyright (c) 1999-2000 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/>.
#
#
# $Id$
#

###################################################################
#                    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@
TRANSCODER = @transcoder@

include ../version.incl
include ../src/Makefile.incl

LIB=${XERCESCROOT}/lib
## OS390BATCH
ifeq (${OS390BATCH},1)
BATCH_TARGET = "//'${LOADMOD}(IXM4C35)'"
endif
ifneq (${PLATFORM}, OS400)
LIBNAME=libxerces-c
else
LIBNAME=libxercesc
endif
THISLIB=${LIB}/${LIBNAME}

ALL_OBJECTS=$(wildcard $(XML_OBJ_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
   ## Start OS390BATCH ##
  ifeq (${OS390BATCH},1)
all: ${BATCH_TARGET}
   ## End OS390BATCH ##
  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)
## Start OS390 ##
ifeq (${PLATFORM},OS390)
## Start 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

## End OS390 and OS390BATCH


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
	-rm -rf $(XML_OBJ_DIR)
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

