# -*- 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 GRE_MODULE = 1 ifdef GNU_CC ifdef INTEL_CC # icc gets special optimize flags ifdef MOZ_PROFILE_GENERATE MODULE_OPTIMIZE_FLAGS = -O0 else MODULE_OPTIMIZE_FLAGS = -O2 -ip #XXX: do we want different INTERP_OPTIMIZER flags here? endif else MODULE_OPTIMIZE_FLAGS = -Os -fstrict-aliasing $(MOZ_OPTIMIZE_SIZE_TWEAK) # Special optimization flags for jsinterp.c INTERP_OPTIMIZER = -O3 -fstrict-aliasing endif else ifeq ($(OS_ARCH),SunOS) MODULE_OPTIMIZE_FLAGS = -xO4 endif ifeq ($(OS_ARCH),WINNT) MODULE_OPTIMIZE_FLAGS = -O2 -GL endif endif ifeq (,$(filter-out WINNT WINCE,$(OS_ARCH))) 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. ifndef JS_STATIC_BUILD FORCE_SHARED_LIB = 1 endif CPPSRCS = \ jsapi.cpp \ jsarena.cpp \ jsarray.cpp \ jsatom.cpp \ jsbool.cpp \ jscntxt.cpp \ jsdate.cpp \ jsdbgapi.cpp \ jsdhash.cpp \ jsdtoa.cpp \ jsemit.cpp \ jsexn.cpp \ jsfun.cpp \ jsgc.cpp \ jshash.cpp \ jsinterp.cpp \ jsinvoke.cpp \ jsiter.cpp \ jslock.cpp \ jslog2.cpp \ jslong.cpp \ jsmath.cpp \ jsnum.cpp \ jsobj.cpp \ jsopcode.cpp \ jsparse.cpp \ jsprf.cpp \ jsregexp.cpp \ jsscan.cpp \ jsscope.cpp \ jsscript.cpp \ jsstr.cpp \ jstracer.cpp \ jsutil.cpp \ jsxdrapi.cpp \ jsxml.cpp \ prmjtime.cpp \ nanojit/Assembler.cpp \ nanojit/Fragmento.cpp \ nanojit/LIR.cpp \ nanojit/RegAlloc.cpp \ nanojit/avmplus.cpp \ jsbuiltins.cpp \ $(NULL) ifdef HAVE_DTRACE CSRCS += \ jsdtracef.c endif EXPORTS = \ jsautocfg.h \ jsautokw.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 \ jsdtoa.h \ jsemit.h \ jsfun.h \ jsgc.h \ jshash.h \ jsinterp.h \ jsinterpinlines.h \ jsiter.h \ jslock.h \ jslong.h \ jsmath.h \ jsnum.h \ jsobj.h \ jsopcode.tbl \ jsopcode.h \ jsotypes.h \ jsparse.h \ jsprf.h \ jsproto.tbl \ jsprvtd.h \ jspubtd.h \ jsregexp.h \ jsscan.h \ jsscope.h \ jsscript.h \ jsstddef.h \ jsstr.h \ jstracer.h \ jstracerinlines.h \ jstypes.h \ jsutil.h \ jsxdrapi.h \ jsxml.h \ nanojit/Assembler.h \ nanojit/LIR.h \ nanojit/avmplus.h \ nanojit/vm_fops.h \ nanojit/Fragmento.h \ nanojit/Native.h \ nanojit/RegAlloc.h \ nanojit/nanojit.h \ builtins.tbl \ $(NULL) ifdef DEBUG EXPORTS += nanojit/TraceTreeDrawer.h CPPSRCS += nanojit/TraceTreeDrawer.cpp nanojit/Tests.cpp endif DEFINES += -DFEATURE_NANOJIT ifeq (86,$(findstring 86,$(OS_TEST))) DEFINES += -DAVMPLUS_IA32 CPPSRCS += nanojit/Nativei386.cpp EXPORTS += nanojit/Nativei386.h endif ifdef HAVE_DTRACE EXPORTS += \ jsdtracef.h \ javascript-trace.h \ $(NULL) endif ifeq (,$(filter-out WINNT WINCE,$(OS_ARCH))) EXPORTS += jscpucfg.h endif JS_SAFE_ARENA = 1 DASH_R = -r ifneq (,$(filter OS2 WINCE WINNT,$(OS_ARCH))) SDK_LIBRARY = $(IMPORT_LIBRARY) else SDK_LIBRARY = $(SHARED_LIBRARY) endif include $(topsrcdir)/config/config.mk EXTRA_DSO_LDOPTS += $(NSPR_LIBS) ifdef MOZ_MEMORY ifeq ($(OS_ARCH),SunOS) EXTRA_DSO_LDOPTS += $(call EXPAND_LIBNAME_PATH,jemalloc,$(DIST)/lib) endif endif # When using gcc the assembly is inlined in the C-file (see jslock.cpp) ifeq ($(OS_ARCH),SunOS) ifneq (86,$(findstring 86,$(OS_TEST))) 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) # Define keyword generator before rules.mk, see bug 323979 comment 50 HOST_SIMPLE_PROGRAMS += host_jskwgen$(HOST_BIN_SUFFIX) GARBAGE += jsautokw.h host_jskwgen$(HOST_BIN_SUFFIX) HOST_SIMPLE_PROGRAMS += host_jsoplengen$(HOST_BIN_SUFFIX) GARBAGE += jsautooplen.h host_jsoplengen$(HOST_BIN_SUFFIX) USE_HOST_CXX = 1 HOST_SIMPLE_PROGRAMS += host_jsoplengen$(HOST_BIN_SUFFIX) GARBAGE += jsautooplen.h host_jsoplengen$(HOST_BIN_SUFFIX) ifdef HAVE_DTRACE ifneq ($(OS_ARCH),Darwin) DTRACE_PROBE_OBJ = $(LIBRARY_NAME)-dtrace.$(OBJ_SUFFIX) endif MOZILLA_DTRACE_SRC = $(srcdir)/javascript-trace.d endif include $(topsrcdir)/config/rules.mk # our build system doesn't handle subdir srcs very gracefully today export:: mkdir -p nanojit 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 += 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 ifdef MOZ_SHARK CFLAGS += -F/System/Library/PrivateFrameworks CXXFLAGS += -F/System/Library/PrivateFrameworks LDFLAGS += -F/System/Library/PrivateFrameworks -framework CHUD 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 WINCE OpenVMS,$(OS_ARCH))) LDFLAGS += -lm endif # Prevent floating point errors caused by VC++ optimizations ifeq ($(OS_ARCH)_$(GNU_CC),WINNT_) ifeq (,$(filter-out 1200 1300 1310,$(_MSC_VER))) CFLAGS += -Op else CFLAGS += -fp:precise endif 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 ifdef MOZ_MEMORY ifeq ($(OS_ARCH),Darwin) LDFLAGS += -ljemalloc endif endif # Allow building jsinterp.c with special optimization flags ifdef INTERP_OPTIMIZER jsinterp.$(OBJ_SUFFIX): MODULE_OPTIMIZE_FLAGS=$(INTERP_OPTIMIZER) endif ifeq ($(OS_ARCH),IRIX) ifndef GNU_CC _COMPILE_CFLAGS = $(patsubst -O%,-O1,$(COMPILE_CFLAGS)) jsapi.o jsxdrapi.o jsarena.o jsarray.o jsatom.o jsemit.o jsfun.o jsinterp.o jsregexp.o jsparse.o jsopcode.o jsscript.o: %.o: %.cpp Makefile.in $(REPORT_BUILD) @$(MAKE_DEPS_AUTO_CXX) $(CXX) -o $@ -c $(_COMPILE_CFLAGS) $< endif 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.cpp Makefile.in $(REPORT_BUILD) @$(MAKE_DEPS_AUTO_CXX) $(CXX) -o $@ -c $(filter-out $(MOZ_OPTIMIZE_FLAGS), $(COMPILE_CFLAGS)) $< jsdtoa.o: jsdtoa.cpp Makefile.in $(REPORT_BUILD) @$(MAKE_DEPS_AUTO_CXX) $(CXX) -o $@ -c $(filter-out $(MOZ_OPTIMIZE_FLAGS), $(COMPILE_CFLAGS)) $< endif jsopcode.h jsopcode.cpp: jsopcode.tbl ifeq (,$(CROSS_COMPILE)$(filter-out WINNT,$(OS_ARCH))) jsautocfg.h: touch $@ else ifeq ($(OS_ARCH),WINCE) jsautocfg.h: touch $@ else jsautocfg.h: jscpucfg$(HOST_BIN_SUFFIX) @rm -f $@ jsautocfg.tmp ./jscpucfg > jsautocfg.tmp mv jsautocfg.tmp $@ endif 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_CXX := $(HOST_CXX) -DMDCPUCFG=$(TARGET_NSPR_MDCPUCFG) HOST_CXXFLAGS := $(patsubst -DXP_%,,$(HOST_CXXFLAGS)) endif ifdef CROSS_COMPILE # jscpucfg needs to know when it's supposed to produce a config for the target JSCPUCFG_DEFINES = $(ACDEFINES) # This is incredibly hacky. Darwin NSPR uses the same MDCPUCFG for multiple # processors, and determines which processor to configure for based on # #ifdef i386. This macro is among the NSPR defines, but is also automatically # defined by the compiler when building for i386. It therefore needs to be # defined here if targeting i386, and explicitly undefined otherwise. ifeq ($(OS_ARCH),Darwin) ifeq ($(TARGET_CPU),powerpc) JSCPUCFG_DEFINES += -Ui386 else JSCPUCFG_DEFINES += -Di386=1 endif endif 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.cpp Makefile.in $(HOST_CXX) $(HOST_CXXFLAGS) -c $(JSCPUCFG_DEFINES) $(DEFINES) $(NSPR_CFLAGS) -o $@ $< jscpucfg: jscpucfg.o $(HOST_CXX) $(HOST_CXXFLAGS) $(JSCPUCFG_DEFINES) $(DEFINES) -o $@ $< endif else ifeq ($(OS_ARCH),WINCE) jscpucfg$(HOST_BIN_SUFFIX): echo no need to build jscpucfg $< else jscpucfg$(HOST_BIN_SUFFIX): jscpucfg.cpp Makefile.in $(HOST_CXX) $(HOST_CXXFLAGS) $(JSCPUCFG_DEFINES) $(DEFINES) $(NSPR_CFLAGS) $(OUTOPTION)$@ $< endif endif # Extra dependancies and rules for auto-generated headers host_jskwgen.$(OBJ_SUFFIX): jsconfig.h jskeyword.tbl jsautokw.h: host_jskwgen$(HOST_BIN_SUFFIX) ./host_jskwgen$(HOST_BIN_SUFFIX) $@ host_jsoplengen.$(OBJ_SUFFIX): jsopcode.tbl jsautooplen.h: host_jsoplengen$(HOST_BIN_SUFFIX) ./host_jsoplengen$(HOST_BIN_SUFFIX) $@ # Force auto-header generation before compiling any source that may use them $(CPPSRCS:%.cpp=%.$(OBJ_SUFFIX)): jsautokw.h jsautooplen.h ifdef HAVE_DTRACE javascript-trace.h: $(srcdir)/javascript-trace.d dtrace -h -s $(srcdir)/javascript-trace.d -o javascript-trace.h.in sed 's/if _DTRACE_VERSION/ifdef INCLUDE_MOZILLA_DTRACE/' \ javascript-trace.h.in > javascript-trace.h endif