#
# Copyright 1998-2005 Sun Microsystems, Inc.  All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  Sun designates this
# particular file as subject to the "Classpath" exception as provided
# by Sun in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#

#
# Makefile for linking with mapfiles.
#
# NOTE: Not using a mapfile will expose all your extern functions and
#	extern data symbols as part of your interface, so unless your
#	extern names are safe from being mistaken as names from other
#	libraries, you better use a mapfile, or use a unique naming
#	convention on all your extern symbols.
#
# The mapfile will establish versioning by defining the exported interface.
#
# The mapfile can also force certain .o files or elf sections into the 
#   the different segments of the resulting library/program image.
#
# The macro FILES_m can contain any number of mapfiles.
#

# Always make sure 'all' is the default rule
mapfile_default_rule: all

ifeq ($(PLATFORM), solaris)

ifeq ($(VARIANT), OPT)
  # OPT build MUST have a mapfile?
  ifndef FILES_m
    FILES_m =        mapfile-vers
  endif
  
  # If we are re-ordering functions in this solaris library, we need to make
  #   sure that -xF is added to the compile lines. This option is critical and
  #   enables the functions to be reordered.
  ifdef FILES_reorder
    CFLAGS_OPT   += -xF
    CXXFLAGS_OPT += -xF
  endif

INIT += $(TEMPDIR)/mapfile-vers

$(TEMPDIR)/mapfile-vers : $(FILES_m) $(FILES_reorder)
	$(prep-target)
	$(CAT) $(FILES_m) > $@
  ifdef FILES_reorder
	$(SED) -e 's=OUTPUTDIR=$(OUTPUTDIR)=' $(FILES_reorder) >> $@
  endif
endif # VARIANT

ifndef LDNOMAP
  LDMAPFLAGS_OPT =  -M$(TEMPDIR)/mapfile-vers
  LDMAPFLAGS_DBG =  $(FILES_m:%=-M%)
endif

endif # PLATFORM


ifeq ($(PLATFORM), linux)

ifeq ($(VARIANT), OPT)
  # OPT build MUST have a mapfile?
  ifndef FILES_m
    FILES_m =        mapfile-vers
  endif
endif # VARIANT

ifndef LDNOMAP
  LDMAPFLAGS_OPT =  $(FILES_m:%=-Xlinker -version-script=%)
  LDMAPFLAGS_DBG =  $(FILES_m:%=-Xlinker -version-script=%)
endif

endif # PLATFORM
  
LDFLAGS_OPT +=  $(LDMAPFLAGS_OPT)
LDFLAGS_DBG +=  $(LDMAPFLAGS_DBG)

