# -*- Makefile -*-
#
# $Id$
#
# makefile to build the C++ Standard library
#
########################################################################
#
# 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.
#
# Copyright 1999-2007 Rogue Wave Software, Inc.
#
########################################################################

include ../makefile.in


# catalog to build and source files to build it from
CATFILE  := rwstderr.cat
MSGFILES := rwstderr.msg

# the name of the library to build (and in shared builds,
# the name of the symbolic link pointing to it, for library
# versioning)
LIBLINK := $(LIBNAME)

ifeq ($(findstring shared,$(BUILDMODE)),shared)
  ifneq ($(LIBSUFFIX),.dll)
    LIB  := $(LIBLINK).$(LIBVER)
  else
    # on Cygwin use name libstd${BUILDTYPE}-X.Y.Z.dll
    LIB  := $(basename $(LIBLINK))-$(LIBVER)$(LIBSUFFIX)
  endif
  TARGET := $(LIB) $(LIBLINK)
else
  LIB    := $(LIBLINK)
  TARGET := $(LIB)
endif

TARGET += $(CATFILE)


SRCDIRS      = $(TOPDIR)/src

# do not compile these sources...
OMIT_SRCS   += rwstderr.cpp

# include common variables setting for all makefiles
ONE_REPOSITORY = 1
include ../makefile.common

CXXFLAGS    += $(PICFLAGS)
LDFLAGS     += $(LDSOFLAGS) $(MAPFLAGS) $(MAPFILE)

# For AIX 5.1 xlC 5.0.2.0
ifneq ($(DEFAULT_SHROBJ),)
  SOBJS=$(DEFAULT_SHROBJ)
else
  SOBJS=$(OBJS)
endif

# CXXPRELINK - command for compilers that use template
#              instantiation models that require a prelink stage
ifneq ($(PRELINKFLAGS),)
CXXPRELINK   = $(CXX) $(CPPFLAGS) $(LDFLAGS) $(PRELINKFLAGS) $(OBJS)
endif   # ($(PRELINKFLAGS),)

########################################################################
#  TARGETS
########################################################################

# Cancel implicit rules
.SUFFIXES:

all: $(TARGET)

# do any directory specific cleanup using the realclean target
realclean: dependclean clean

# build an archive or shared library (repository included for DEC cxx 6.2)
ifeq ($(findstring shared,$(BUILDMODE)),shared)

  ifeq ($(findstring archive,$(BUILDMODE)),archive)
  # shared archives are unique to IBM AIX
  # IBM VisualAge/XLC++ on AIX first "preprocesses" object files
  # with -qmkshrobj and then uses `ar' to create a shared archive
$(LIB): $(OBJS)
	@echo "$(CXXPRELINK) -o $(LIBBASE).o" >> $(LOGFILE)
	$(CXXPRELINK) -o $(LIBBASE).o $(TEEOPTS)
	@echo "$(AR) $(ARFLAGS) $@ $(LIBBASE).o" >> $(LOGFILE)
	$(AR) $(ARFLAGS) $@ $(LIBBASE).o $(TEEOPTS)
  else
$(LIB): $(OBJS) $(MAPFILE)
	@echo "$(LD) $(LDFLAGS) $< $(LDLIBS) -o $@" >> $(LOGFILE)
	$(LD) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $@ $(TEEOPTS)
  endif   # shared archive

$(LIBLINK): $(LIB)
	@echo "ln -sf $< $@" >> $(LOGFILE)
	ln -sf $< $@

else

# Compaq C++ needs all files from the repository
SOBJS += $(shell [ -d repository.ti ] && echo repository.ti/*.o)

$(LIB): $(OBJS)
	@echo "$(CXXPRELINK)" >> $(LOGFILE)
	$(CXXPRELINK) $(TEEOPTS)
	@echo "$(AR) $(ARFLAGS) $(LIBNAME) $(SOBJS)" >> $(LOGFILE)
	$(AR) $(ARFLAGS) $(LIBNAME) $(SOBJS) $(TEEOPTS)

endif   # ($(findstring shared,$(BUILDMODE)),shared)


# Common rules used by all Makefiles
include ../makefile.rules

# create the $(PREFIX)/etc/ and $(PREFIX)/lib/ directories
# and install the library binary and the message catalog(s)
install: $(TARGET)
	mkdir -p $(PREFIX)/lib
	cp $(LIB) $(PREFIX)/lib
	if [ $(LIBLINK) != $(LIB) ]; then          \
            rm $(PREFIX)/lib/$(LIBLINK);           \
            ln -s $(LIB) $(PREFIX)/lib/$(LIBLINK); \
        fi
	mkdir -p $(PREFIX)/etc
	cp $(CATFILE) $(PREFIX)/etc
