# 
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (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.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is the Netscape Portable Runtime (NSPR).
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998-2000
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****

#! gmake

MOD_DEPTH	= ../..
topsrcdir	= @top_srcdir@
srcdir		= @srcdir@
VPATH		= @srcdir@

include $(MOD_DEPTH)/config/autoconf.mk

include $(topsrcdir)/config/config.mk

# Disable optimization of the nspr on SunOS4.1.3
ifeq ($(OS_ARCH),SunOS)
    ifeq ($(OS_RELEASE),4.1.3_U1)
        OPTIMIZER =
    else
        # The C++ compiler in Workshop 5.0 uses standard
        # iostreams as default.  -library=iostream will
        # allow Workshop 5.0 to work with classic iostreams.
        ifndef NS_USE_GCC
        CCC_VERSION := $(shell $(CCC) -V 2>&1)
        ifneq (,$(findstring 5.0,$(CCC_VERSION)))
        CCC_ONLY_FLAGS += -library=iostream
        endif
        endif
    endif
endif

ifeq ($(OS_ARCH), IRIX)
    ifneq ($(OS_RELEASE),5.3)
        CCC_ONLY_FLAGS += -exceptions
    endif
endif

ifeq ($(OS_ARCH), BeOS)
    CFLAGS += -frtti -fexceptions
endif

INCLUDES = -I$(dist_includedir)

HEADERS = $(wildcard $(srcdir)/*.h)

CSRCS = \
	plvrsion.c \
	$(NULL)

CXXSRCS = \
	prstrms.cpp \
	$(NULL)

OBJS = $(addprefix $(OBJDIR)/,$(CSRCS:.c=.$(OBJ_SUFFIX)) $(CXXSRCS:.cpp=.$(OBJ_SUFFIX)))

ifeq ($(OS_ARCH), WINNT)
        RES=$(OBJDIR)/prstrms.res
        RESNAME=prstrms.rc
        OS_LIBS = user32.lib
else
    ifeq ($(OS_ARCH),OS2)
        OS_LIBS = -lstdcpp
    else
    ifeq ($(OS_ARCH), AIX)
      ifeq ($(OS_RELEASE), 4.1)
        ifeq ($(CLASSIC_NSPR),1)
            OS_LIBS += -lC -lc
        else
            OS_LIBS += -lC_r -lc_r
        endif
      else
        # makeC++SharedLib(_r) is in either /usr/lpp/xlC/bin
        # or /usr/ibmcxx/bin.
        ifeq ($(CLASSIC_NSPR),1)
            MKSHLIB = makeC++SharedLib -p 0
        else
            MKSHLIB = makeC++SharedLib_r -p 0
        endif
        OS_LIBS += -ldl
      endif
    endif
    endif
endif

ifeq ($(OS_ARCH),BeOS)
    OS_LIBS = -lstdc++.r4
endif

ifeq ($(OS_ARCH), UNIXWARE)
    OS_LIBS += -lC
endif

EXTRA_LIBS = $(LIBNSPR)

# On NCR and SCOOS, we can't link with extra libraries when
# we build a shared library.  If we do so, the linker doesn't
# complain, but we would run into weird problems at run-time.
# Therefore on these platforms, we link just the object files.
ifeq ($(OS_ARCH),NCR)
    EXTRA_LIBS =
endif
ifeq ($(OS_ARCH),SCOOS)
    EXTRA_LIBS =
endif

ifdef RESOLVE_LINK_SYMBOLS
EXTRA_LIBS += $(OS_LIBS)
endif

LIBRARY_NAME    = prstrms
LIBRARY_VERSION = $(MOD_MAJOR_VERSION)

RELEASE_HEADERS = $(HEADERS)
RELEASE_HEADERS_DEST = $(RELEASE_INCLUDE_DIR)
RELEASE_LIBS    = $(TARGETS)

include $(topsrcdir)/config/rules.mk

#
# Version information generation (begin)
#
ECHO = echo
TINC = $(OBJDIR)/_pl_bld.h
PROD = $(notdir $(SHARED_LIBRARY))
NOW = $(MOD_DEPTH)/config/$(OBJDIR)/now
SH_DATE = $(shell date "+%Y-%m-%d %T")
SH_NOW = $(shell $(NOW))

ifeq ($(OS_ARCH), WINNT)
	SUF = i64
else
	SUF = LL
endif

$(TINC):
	@$(MAKE_OBJDIR)
	@$(ECHO) '#define _BUILD_STRING "$(SH_DATE)"' > $(TINC)
	@if test ! -z "$(SH_NOW)"; then \
	    $(ECHO) '#define _BUILD_TIME $(SH_NOW)$(SUF)' >> $(TINC); \
	else \
	    true; \
	fi
	@$(ECHO) '#define _PRODUCTION "$(PROD)"' >> $(TINC)


$(OBJDIR)/plvrsion.$(OBJ_SUFFIX): plvrsion.c $(TINC)
ifeq ($(OS_ARCH), WINNT)
	$(CC) -o $@ -c $(CFLAGS) -I$(OBJDIR) $<
else
	$(CC) -o $@ -c $(CFLAGS) -I$(OBJDIR) $<
endif
#
# Version information generation (end)
#

export:: $(TARGETS) $(HEADERS)
	$(INSTALL) -m 444 $(HEADERS) $(dist_includedir)
	$(INSTALL) -m 444 $(TARGETS) $(dist_libdir)
ifeq ($(OS_ARCH),OS2)
	$(INSTALL) -m 444 $(TARGETS) $(dist_bindir)
endif
ifeq ($(OS_ARCH),HP-UX)
ifdef SHARED_LIBRARY
	$(INSTALL) -m 755 $(SHARED_LIBRARY) $(dist_libdir)
endif
endif
