# -*- 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 (,$(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. 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 \ jsxml.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 \ jsstddef.h \ jsstr.h \ jstypes.h \ jsutil.h \ jsxdrapi.h \ jsxml.h \ $(NULL) ifeq (,$(filter-out WINNT WINCE,$(OS_ARCH))) 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 WINCE,$(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 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 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 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_CC := $(HOST_CC) -DMDCPUCFG=$(TARGET_NSPR_MDCPUCFG) HOST_CFLAGS := $(patsubst -DXP_%,,$(HOST_CFLAGS)) 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.c Makefile.in $(HOST_CC) $(HOST_CFLAGS) -c $(JSCPUCFG_DEFINES) $(DEFINES) $(NSPR_CFLAGS) -o $@ $< jscpucfg: jscpucfg.o $(HOST_CC) $(HOST_CFLAGS) $(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.c Makefile.in $(HOST_CC) $(HOST_CFLAGS) $(JSCPUCFG_DEFINES) $(DEFINES) $(NSPR_CFLAGS) $(OUTOPTION)$@ $< endif endif