# 
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

#! gmake

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

include $(MOD_DEPTH)/config/autoconf.mk

include $(topsrcdir)/config/config.mk

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 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),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
