# -*- Mode: makefile -*-
#
# ***** 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 Mozilla Communicator client code, released
# March 31, 1998.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#
# Alternatively, the contents of this file may be used under the terms of
# either of 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 *****

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

include $(DEPTH)/config/autoconf.mk

MODULE		= js
LIBRARY_NAME	= mozjs
LIB_IS_C_ONLY	= 1
GRE_MODULE	= 1

ifeq ($(OS_ARCH),WINNT)
LIBRARY_NAME	= js$(MOZ_BITS)$(VERSION_NUMBER)
RESFILE		= js$(MOZ_BITS)40.res
endif

PACKAGE_FILE = js.pkg

# JavaScript must be built shared, even for static builds, as it is used by
# other modules which are always built shared. Failure to do so results in
# the js code getting copied into xpinstall and jsd as well as mozilla-bin,
# and then the static data cells used for locking no longer work.
FORCE_SHARED_LIB = 1

CSRCS		= \
		jsapi.c \
		jsarena.c \
		jsarray.c \
		jsatom.c \
		jsbool.c \
		jscntxt.c \
		jsdate.c \
		jsdbgapi.c \
		jsdhash.c \
		jsdtoa.c \
		jsemit.c \
		jsexn.c \
		jsfun.c \
		jsgc.c \
		jshash.c \
		jsinterp.c \
		jslock.c \
		jslog2.c \
		jslong.c \
		jsmath.c \
		jsnum.c \
		jsobj.c \
		jsopcode.c \
		jsparse.c \
		jsprf.c \
		jsregexp.c \
		jsscan.c \
		jsscope.c \
		jsscript.c \
		jsstr.c \
		jsutil.c \
		jsxdrapi.c \
		prmjtime.c \
		$(NULL)

EXPORTS		= \
		jsautocfg.h \
		js.msg \
		jsapi.h \
		jsarray.h \
		jsarena.h \
		jsatom.h \
		jsbit.h \
		jsbool.h \
		jsclist.h \
		jscntxt.h \
		jscompat.h \
		jsconfig.h \
		jsdate.h \
		jsdbgapi.h \
		jsdhash.h \
		jsemit.h \
		jsfun.h \
		jsgc.h \
		jshash.h \
		jsinterp.h \
		jslock.h \
		jslong.h \
		jsmath.h \
		jsnum.h \
		jsobj.h \
		jsopcode.tbl \
		jsopcode.h \
		jsosdep.h \
		jsotypes.h \
		jsparse.h \
		jsprf.h \
		jsprvtd.h \
		jspubtd.h \
		jsregexp.h \
		jsscan.h \
		jsscope.h \
		jsscript.h \
		jsstr.h \
		jstypes.h \
		jsutil.h \
		jsxdrapi.h \
		jsstddef.h \
		$(NULL)

ifeq ($(OS_ARCH),WINNT)
EXPORTS		+= jscpucfg.h
endif

FDLIBM_LIBRARY	= fdlibm/$(LIB_PREFIX)fdm.$(LIB_SUFFIX)
JSMATH_PRELINK	= jsmathtemp.o
JS_SAFE_ARENA	= 1

DASH_R		= -r

include $(topsrcdir)/config/config.mk

EXTRA_DSO_LDOPTS += $(NSPR_LIBS)

ifeq (,$(filter-out OS2 WINNT,$(OS_ARCH)))
SHARED_LIBRARY_LIBS += $(FDLIBM_LIBRARY)
endif

# When using gcc the assembly is inlined in the C-file (see jslock.c)
ifeq ($(OS_ARCH),SunOS)
ifneq ($(OS_TEST),i86pc)
ifndef GNU_CC
ASFILES		= lock_$(OS_ARCH).s
endif
endif
endif

ifndef BUILD_OPT
MOCHAFILE	= 1
endif

ifndef NSBUILDROOT
JSJAVA_STUBHEADERS = \
		-I$(topsrcdir)/sun-java/include/_gen \
		-I$(topsrcdir)/sun-java/netscape/javascript/_jri \
		-I$(topsrcdir)/sun-java/netscape/security/_jri
else
JSJAVA_STUBHEADERS = -I$(JRI_GEN_DIR) -I$(JDK_GEN_DIR)
endif

JSJAVA_CFLAGS	= \
		-I$(topsrcdir)/sun-java/md-include \
		-I$(topsrcdir)/sun-java/include \
		$(JSJAVA_STUBHEADERS)

include $(topsrcdir)/config/rules.mk

DEFINES		+= -DEXPORT_JS_API 

INCLUDES	+= -I$(srcdir)

# MSVC '-Gy' cc flag and '/OPT:REF' linker flag cause JS_GetArgument and
# JS_GetLocalVariable to be folded to the same address by the linker, 
# leading to a crash on startup. See bug 151066. So, in optimized builds,
# add the /OPT:NOICF flag, which turns off 'identical COMDAT folding'.
#
# N.B.: 'identical COMDAT folding' that folds functions whose addresses
# are taken violates the ISO C and C++ standards.
ifndef MOZ_DEBUG
ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
LDFLAGS         += /OPT:NOICF
endif
endif

GARBAGE		+= $(JSMATH_PRELINK) jscpucfg.o jsautocfg.h jsautocfg.tmp jscpucfg

ifneq (,$(CROSS_COMPILE)$(filter-out WINNT,$(OS_ARCH)))
TARGETS		+= jscpucfg$(HOST_BIN_SUFFIX)
endif

ifdef JS_SAFE_ARENA
DEFINES		+= -DJS_USE_SAFE_ARENA
endif

ifdef JS_THREADSAFE
DEFINES		+= -DJS_THREADSAFE
endif

ifdef JS_NO_THIN_LOCKS
DEFINES		+= -DJS_USE_ONLY_NSPR_LOCKS
endif

ifdef JS_VERSION
DEFINES		+= -DJS_VERSION=$(JS_VERSION)
endif

ifneq ($(findstring -L,$(NSPR_LIBS)),)
NSPR_STATIC_PATH = $(subst -L,,$(findstring -L,$(NSPR_LIBS)))
else
NSPR_STATIC_PATH = $(DIST)/lib
endif

LDFLAGS		+= $(pathsubst -l%,$(NSPR_STATIC_PATH)/%.a,$(NSPR_LIBS))

# BeOS and HP-UX do not require the extra linking of "-lm"
ifeq (,$(filter BeOS HP-UX WINNT OpenVMS,$(OS_ARCH)))
LDFLAGS		+= -lm
endif

# Prevent floating point errors caused by VC++ optimizations
ifeq ($(OS_ARCH)_$(GNU_CC),WINNT_)
CFLAGS += /Op
endif # WINNT

ifeq ($(OS_ARCH),FreeBSD)
LDFLAGS		+= -pthread
endif
ifeq ($(OS_ARCH),IRIX)
ifdef USE_N32
DASH_R		+= -n32
endif
endif
ifeq ($(OS_ARCH),Linux)
LDFLAGS		+= -ldl
endif
ifeq ($(OS_ARCH),OSF1)
LDFLAGS		+= -lc_r
endif
ifeq ($(OS_ARCH),SunOS)
ifeq ($(TARGET_CPU),sparc)

ifdef JS_ULTRASPARC_OPTS
DEFINES += -DULTRA_SPARC
ifdef GNU_CC
CFLAGS   += -Wa,-xarch=v8plus,-DULTRA_SPARC,-P,-L,-D_ASM,-D__STDC__=0
CXXFLAGS += -Wa,-xarch=v8plus,-DULTRA_SPARC,-P,-L,-D_ASM,-D__STDC__=0,-K,PIC
else
ASFLAGS  += -xarch=v8plus -DULTRA_SPARC -P -L -D_ASM -D__STDC__=0 -K PIC
endif # GNU_CC
endif # JS_ULTRASPARC_OPTS

endif
ifeq ($(OS_RELEASE),4.1)
LDFLAGS		+= -ldl -lnsl
else
LDFLAGS		+= -lposix4 -ldl -lnsl -lsocket
endif
endif

ifeq ($(OS_ARCH),QNX)
ifneq ($(OS_TARGET),NTO)
# Don't use wildcard here, because we only want this resolved at link time.
OBJS		+= fdlibm/*.o
endif
endif

ifeq ($(OS_ARCH),IRIX)
ifndef GNU_CC
_COMPILE_CFLAGS  = $(patsubst -O%,-O1,$(COMPILE_CFLAGS))
jsapi.o jsarena.o jsarray.o jsatom.o jsemit.o jsfun.o jsinterp.o jsregexp.o jsparse.o jsopcode.o jsscript.o: %.o: %.c Makefile.in
	$(REPORT_BUILD)
	@$(MAKE_DEPS_AUTO)
	$(CC) -o $@ -c $(_COMPILE_CFLAGS) $<
endif
endif

# On OS/2 & win32 we are already linking against fdlibm, so don't bother
# creating jsmathtemp
ifeq (,$(filter OS2 WINNT OpenVMS,$(OS_ARCH)))
# special rule for jsmath.o since we want to incrementally link
# against fdlibm to pull in only what is needed
# Do this in a single step to avoid dependency problems
jsmath.o: jsmath.c $(FDLIBM_LIBRARY) Makefile.in
	$(REPORT_BUILD)
	@$(MAKE_DEPS_AUTO)
	$(ELOG) $(CC) $(OUTOPTION)$(JSMATH_PRELINK) -c $(COMPILE_CFLAGS) $<
ifeq ($(OS_ARCH),QNX)
ifneq ($(OS_TARGET),NTO)
	@cp $(JSMATH_PRELINK) $@
else
	$(LD) $(DASH_R) -o $@ $(JSMATH_PRELINK) $(FDLIBM_LIBRARY)
endif
else
	$(LD) $(DASH_R) -o $@ $(JSMATH_PRELINK) $(FDLIBM_LIBRARY)
endif
	@$(RM) -f $(JSMATH_PRELINK)
else
# Create dependency so we build fdlibm
jsmath.o: $(FDLIBM_LIBRARY) Makefile.in
endif

# An AIX Optimization bug causes PR_dtoa() & JS_dtoa to produce wrong result.
# This suppresses optimization for this single compilation unit.
ifeq ($(OS_ARCH),AIX)
jsatom.o: jsatom.c Makefile.in
	$(REPORT_BUILD)
	@$(MAKE_DEPS_AUTO)
	$(CC) -o $@ -c $(filter-out $(MOZ_OPTIMIZE_FLAGS), $(COMPILE_CFLAGS)) $<
jsdtoa.o: jsdtoa.c Makefile.in
	$(REPORT_BUILD)
	@$(MAKE_DEPS_AUTO)
	$(CC) -o $@ -c $(filter-out $(MOZ_OPTIMIZE_FLAGS), $(COMPILE_CFLAGS)) $<
endif

$(FDLIBM_LIBRARY):
	$(MAKE) -C $(@D) $(@F)

jsopcode.h jsopcode.c: jsopcode.tbl

ifeq (,$(CROSS_COMPILE)$(filter-out WINNT,$(OS_ARCH)))
jsautocfg.h:
	touch $@
else
jsautocfg.h: jscpucfg$(HOST_BIN_SUFFIX)
	@rm -f $@ jsautocfg.tmp
	./jscpucfg > jsautocfg.tmp
	mv jsautocfg.tmp $@
endif

# jscpucfg is a strange target
# Needs to be built with the host compiler but needs to include
# the mdcpucfg for the target so it needs the appropriate target defines
ifdef HOST_NSPR_MDCPUCFG
HOST_CC := $(HOST_CC) -DMDCPUCFG=$(TARGET_NSPR_MDCPUCFG)
endif

ifeq ($(OS_ARCH),QNX)
ifneq ($(OS_TARGET),NTO)
# QNX's compiler apparently can't build a binary directly from a source file.
jscpucfg.o: jscpucfg.c Makefile.in
	$(HOST_CC) $(HOST_CFLAGS) -c $(DEFINES) $(NSPR_CFLAGS) -o $@ $<

jscpucfg: jscpucfg.o
	$(HOST_CC) $(HOST_CFLAGS) $(DEFINES) -o $@ $<
endif
else
jscpucfg$(HOST_BIN_SUFFIX): jscpucfg.c Makefile.in
	$(HOST_CC) $(HOST_CFLAGS) $(DEFINES) $(NSPR_CFLAGS) $(OUTOPTION)$@ $<
endif

