# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- # vim: set filetype=python: # 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/. include("js-config.mozbuild") include("js-cxxflags.mozbuild") # Directory metadata component_engine = ("Core", "JavaScript Engine") component_gc = ("Core", "JavaScript: GC") component_intl = ("Core", "JavaScript: Internationalization API") component_jit = ("Core", "JavaScript Engine: JIT") component_stl = ("Core", "JavaScript: Standard Library") component_wasm = ("Core", "Javascript: Web Assembly") FILES_PER_UNIFIED_FILE = 6 # Prevent redefining FILES_PER_UNIFIED_FILE in each sub-directory of js. This # will not escape this directory. export("FILES_PER_UNIFIED_FILE") with Files("*"): BUG_COMPONENT = component_engine with Files("wasm/**"): BUG_COMPONENT = component_wasm with Files("builtin/**"): BUG_COMPONENT = component_stl with Files("ctypes/**"): BUG_COMPONENT = ("Core", "js-ctypes") with Files("gc/**"): BUG_COMPONENT = component_gc with Files("jit/**"): BUG_COMPONENT = component_jit # File-specific metadata for gcfile in ["devtools/rootAnalysis", "devtools/gc-ubench", "devtools/gctrace"]: with Files(gcfile): BUG_COMPONENT = component_gc for stlfile in ["jsdate.*", "jsnum.*"]: with Files(stlfile): BUG_COMPONENT = component_stl with Files("builtin/intl/*"): BUG_COMPONENT = component_intl if not CONFIG["JS_DISABLE_SHELL"]: DIRS += [ "rust", "shell", ] TEST_DIRS += [ "gdb", "jsapi-tests", "tests", ] if CONFIG["FUZZING_INTERFACES"]: TEST_DIRS += [ "fuzz-tests", ] if CONFIG["FUZZING_INTERFACES"] and CONFIG["LIBFUZZER"]: # In addition to regular coverage provided by trace-pc-guard, # LibFuzzer can use trace-cmp to instrument various compare instructions. # Only use this feature on source files that do a lot of constant # comparisons that would otherwise be hard to guess by LibFuzzer, # as it comes with a larger overhead (requires -use_value_profile=1). include("/tools/fuzzing/libfuzzer-flags.mozbuild") # Any files that are targeted by LibFuzzer should be added here so they can # be built with the necessary instrumentation flags, rather than just building # the whole JS engine with instrumentation, to reduce the amount of noise. SOURCES += [ "vm/StructuredClone.cpp", ] SOURCES["vm/StructuredClone.cpp"].flags += libfuzzer_flags else: UNIFIED_SOURCES += [ "vm/StructuredClone.cpp", ] if CONFIG["FUZZING_JS_FUZZILLI"]: # When building for Fuzzilli, we instrument everything with standard # trace-pc instrumentation. include("/tools/fuzzing/libfuzzer-config.mozbuild") CONFIGURE_SUBST_FILES += [ "devtools/rootAnalysis/Makefile", ] CONFIGURE_DEFINE_FILES += [ "js-confdefs.h", ] if not CONFIG["JS_STANDALONE"]: CONFIGURE_SUBST_FILES += [ "../../config/autoconf-js.mk", "../../config/emptyvars-js.mk", ] CONFIGURE_DEFINE_FILES += [ "js-config.h", ] if CONFIG["HAVE_DTRACE"]: GeneratedFile("javascript-trace.h") EXPORTS += ["!javascript-trace.h"] # Changes to internal header files, used externally, massively slow down # browser builds. Don't add new files here unless you know what you're # doing! EXPORTS += [ "!js-config.h", "jsapi.h", "jsfriendapi.h", "jspubtd.h", "jstypes.h", ] EXPORTS.js += [ "../public/AllocationLogging.h", "../public/AllocationRecording.h", "../public/AllocPolicy.h", "../public/Array.h", "../public/ArrayBuffer.h", "../public/ArrayBufferMaybeShared.h", "../public/BigInt.h", "../public/BuildId.h", "../public/CallAndConstruct.h", "../public/CallArgs.h", "../public/CallNonGenericMethod.h", "../public/CharacterEncoding.h", "../public/Class.h", "../public/ComparisonOperators.h", "../public/CompilationAndEvaluation.h", "../public/CompileOptions.h", "../public/Context.h", "../public/ContextOptions.h", "../public/Conversions.h", "../public/Date.h", "../public/Debug.h", "../public/Equality.h", "../public/ErrorInterceptor.h", "../public/ErrorReport.h", "../public/Exception.h", "../public/ForOfIterator.h", "../public/GCAnnotations.h", "../public/GCAPI.h", "../public/GCHashTable.h", "../public/GCPolicyAPI.h", "../public/GCTypeMacros.h", "../public/GCVariant.h", "../public/GCVector.h", "../public/GlobalObject.h", "../public/HashTable.h", "../public/HeapAPI.h", "../public/HelperThreadAPI.h", "../public/Id.h", "../public/Initialization.h", "../public/Interrupt.h", "../public/JitCodeAPI.h", "../public/JSON.h", "../public/LocaleSensitive.h", "../public/MapAndSet.h", "../public/MemoryCallbacks.h", "../public/MemoryFunctions.h", "../public/MemoryMetrics.h", "../public/Modules.h", "../public/Object.h", "../public/OffThreadScriptCompilation.h", "../public/Principals.h", "../public/Printf.h", "../public/ProfilingCategory.h", "../public/ProfilingFrameIterator.h", "../public/ProfilingStack.h", "../public/Promise.h", "../public/PropertyAndElement.h", "../public/PropertyDescriptor.h", "../public/PropertySpec.h", "../public/ProtoKey.h", "../public/Proxy.h", "../public/Realm.h", "../public/RealmIterators.h", "../public/RealmOptions.h", "../public/RefCounted.h", "../public/RegExp.h", "../public/RegExpFlags.h", "../public/Result.h", "../public/RootingAPI.h", "../public/SavedFrameAPI.h", "../public/ScalarType.h", "../public/ScriptPrivate.h", "../public/ShadowRealmCallbacks.h", "../public/SharedArrayBuffer.h", "../public/SliceBudget.h", "../public/SourceText.h", "../public/StableStringChars.h", "../public/Stack.h", "../public/StreamConsumer.h", "../public/String.h", "../public/StructuredClone.h", "../public/SweepingAPI.h", "../public/Symbol.h", "../public/TelemetryTimers.h", "../public/TraceKind.h", "../public/TracingAPI.h", "../public/Transcoding.h", "../public/TypeDecls.h", "../public/UbiNode.h", "../public/UbiNodeBreadthFirst.h", "../public/UbiNodeCensus.h", "../public/UbiNodeDominatorTree.h", "../public/UbiNodePostOrder.h", "../public/UbiNodeShortestPaths.h", "../public/UbiNodeUtils.h", "../public/UniquePtr.h", "../public/Utility.h", "../public/Value.h", "../public/ValueArray.h", "../public/Vector.h", "../public/WaitCallbacks.h", "../public/Warnings.h", "../public/WasmFeatures.h", "../public/WasmModule.h", "../public/WeakMap.h", "../public/WeakMapPtr.h", "../public/Wrapper.h", "../public/WrapperCallbacks.h", "../public/Zone.h", ] # This lives in mozglue/baseprofiler but we re-publish ourselves to support # standalone SpiderMonkey configurations. EXPORTS.js += [ "!/mozglue/baseprofiler/public/ProfilingCategoryList.h", ] # Public APIs that are experimental: the precise contour of the APIs may still # change, but they're at least plausible first passes at designing something. # We expose them as-is, buyer beware. EXPORTS.js.experimental += [ "../public/experimental/CodeCoverage.h", "../public/experimental/CTypes.h", "../public/experimental/Intl.h", "../public/experimental/JitInfo.h", "../public/experimental/JSStencil.h", "../public/experimental/PCCountProfiling.h", "../public/experimental/SourceHook.h", "../public/experimental/TypedData.h", ] # Friend APIs are APIs that either basically SpiderMonkey-internal, or their # contours are gross and terrible -- but the functionality is too important to # some embedder (often, Gecko) to just not expose anything or to agonize through # a clean design. Use this only if you absolutely must, and feel free to # propose clean APIs to replace what's here! EXPORTS.js.friend += [ "../public/friend/DOMProxy.h", "../public/friend/DumpFunctions.h", "../public/friend/ErrorMessages.h", "../public/friend/ErrorNumbers.msg", "../public/friend/JSMEnvironment.h", "../public/friend/PerformanceHint.h", "../public/friend/StackLimits.h", "../public/friend/UsageStatistics.h", "../public/friend/WindowProxy.h", "../public/friend/XrayJitInfo.h", ] # "Shadow" API defines the internal layout of public JSAPI types like |JSObject| # and |JSString|, so that other *inline* public functions can efficiently access # their internal fields. # # Embedders must never include these headers themselves or use their contents. # These internal layout details are publicly exposed for access *only* so that # other public API definitions may use them. # # When adding new shadow structure definitions (or new fields/static constants # to existing structures) for access by inline methods, make sure to add static # asserts to the original header file to ensure that offsets and duplicated # constants are consistent. (Long term, it might be worth figuring out some way # to back actual implementations *with* these shadow definitions to eliminate # this requirement.) EXPORTS.js.shadow += [ "../public/shadow/Function.h", "../public/shadow/Object.h", "../public/shadow/Realm.h", "../public/shadow/Shape.h", "../public/shadow/String.h", "../public/shadow/Symbol.h", "../public/shadow/Zone.h", ] UNIFIED_SOURCES += [ "builtin/Array.cpp", "builtin/AtomicsObject.cpp", "builtin/BigInt.cpp", "builtin/Boolean.cpp", "builtin/DataViewObject.cpp", "builtin/Eval.cpp", "builtin/FinalizationRegistryObject.cpp", "builtin/JSON.cpp", "builtin/MapObject.cpp", "builtin/ModuleObject.cpp", "builtin/Object.cpp", "builtin/Profilers.cpp", "builtin/Promise.cpp", "builtin/Reflect.cpp", "builtin/ReflectParse.cpp", "builtin/ShadowRealm.cpp", "builtin/String.cpp", "builtin/Symbol.cpp", "builtin/TestingFunctions.cpp", "builtin/TestingUtility.cpp", "builtin/WeakMapObject.cpp", "builtin/WeakRefObject.cpp", "builtin/WeakSetObject.cpp", "builtin/WrappedFunctionObject.cpp", "ds/Bitmap.cpp", "ds/LifoAlloc.cpp", "jsapi.cpp", "jsdate.cpp", "jsexn.cpp", "jsfriendapi.cpp", "jsnum.cpp", "proxy/BaseProxyHandler.cpp", "proxy/CrossCompartmentWrapper.cpp", "proxy/DeadObjectProxy.cpp", "proxy/DOMProxy.cpp", "proxy/OpaqueCrossCompartmentWrapper.cpp", "proxy/Proxy.cpp", "proxy/ScriptedProxyHandler.cpp", "proxy/SecurityWrapper.cpp", "proxy/Wrapper.cpp", "threading/Mutex.cpp", "threading/ProtectedData.cpp", "threading/Thread.cpp", "vm/Activation.cpp", "vm/ArgumentsObject.cpp", "vm/ArrayBufferObject.cpp", "vm/ArrayBufferObjectMaybeShared.cpp", "vm/ArrayBufferViewObject.cpp", "vm/AsyncFunction.cpp", "vm/AsyncIteration.cpp", "vm/BigIntType.cpp", "vm/BuildId.cpp", "vm/BuiltinObjectKind.cpp", "vm/BytecodeLocation.cpp", "vm/BytecodeUtil.cpp", "vm/CallAndConstruct.cpp", "vm/CallNonGenericMethod.cpp", "vm/CharacterEncoding.cpp", "vm/CodeCoverage.cpp", "vm/Compartment.cpp", "vm/CompilationAndEvaluation.cpp", "vm/Compression.cpp", "vm/DateTime.cpp", "vm/EnvironmentObject.cpp", "vm/EqualityOperations.cpp", "vm/ErrorMessages.cpp", "vm/ErrorObject.cpp", "vm/ErrorReporting.cpp", "vm/Exception.cpp", "vm/ForOfIterator.cpp", "vm/FrameIter.cpp", "vm/FunctionFlags.cpp", "vm/GeckoProfiler.cpp", "vm/GeneratorObject.cpp", "vm/GetterSetter.cpp", "vm/GlobalObject.cpp", "vm/HelperThreads.cpp", "vm/Id.cpp", "vm/Initialization.cpp", "vm/InternalThreadPool.cpp", "vm/Iteration.cpp", "vm/JitActivation.cpp", "vm/JSAtom.cpp", "vm/JSContext.cpp", "vm/JSFunction.cpp", "vm/JSObject.cpp", "vm/JSONParser.cpp", "vm/JSONPrinter.cpp", "vm/JSScript.cpp", "vm/List.cpp", "vm/MemoryMetrics.cpp", "vm/Modules.cpp", "vm/NativeObject.cpp", "vm/OffThreadPromiseRuntimeState.cpp", "vm/OffThreadScriptCompilation.cpp", "vm/PIC.cpp", "vm/PlainObject.cpp", "vm/Printer.cpp", "vm/Probes.cpp", "vm/PromiseLookup.cpp", "vm/PropertyAndElement.cpp", "vm/PropertyDescriptor.cpp", "vm/PropMap.cpp", "vm/ProxyObject.cpp", "vm/Realm.cpp", "vm/RegExpObject.cpp", "vm/RegExpStatics.cpp", "vm/Runtime.cpp", "vm/SavedStacks.cpp", "vm/Scope.cpp", "vm/SelfHosting.cpp", "vm/Shape.cpp", "vm/ShapeZone.cpp", "vm/SharedArrayObject.cpp", "vm/SharedImmutableStringsCache.cpp", "vm/SourceHook.cpp", "vm/Stack.cpp", "vm/StaticStrings.cpp", "vm/StencilCache.cpp", "vm/StencilObject.cpp", "vm/StringType.cpp", "vm/SymbolType.cpp", "vm/TaggedProto.cpp", "vm/ThrowMsgKind.cpp", "vm/Time.cpp", "vm/ToSource.cpp", "vm/TypedArrayObject.cpp", "vm/UbiNode.cpp", "vm/UbiNodeCensus.cpp", "vm/UbiNodeShortestPaths.cpp", "vm/UsageStatistics.cpp", "vm/Value.cpp", "vm/Warnings.cpp", "vm/Watchtower.cpp", "vm/WellKnownAtom.cpp", "vm/WindowProxy.cpp", "vm/Xdr.cpp", ] if CONFIG["MOZ_JS_STREAMS"]: UNIFIED_SOURCES += [ "builtin/Stream.cpp", "builtin/streams/MiscellaneousOperations.cpp", "builtin/streams/PullIntoDescriptor.cpp", "builtin/streams/QueueingStrategies.cpp", "builtin/streams/QueueWithSizes.cpp", "builtin/streams/ReadableStream.cpp", "builtin/streams/ReadableStreamBYOBReader.cpp", "builtin/streams/ReadableStreamDefaultController.cpp", "builtin/streams/ReadableStreamDefaultControllerOperations.cpp", "builtin/streams/ReadableStreamDefaultReader.cpp", "builtin/streams/ReadableStreamInternals.cpp", "builtin/streams/ReadableStreamOperations.cpp", "builtin/streams/ReadableStreamReader.cpp", "builtin/streams/StreamAPI.cpp", "builtin/streams/TeeState.cpp", ] # builtin/RegExp.cpp cannot be built in unified mode because it causes huge # win32 test slowdowns # jsmath.cpp cannot be built in unified mode because it needs to re-#define the # RtlGenRandom declaration's calling convention in on Windows. # vm/Interpreter.cpp is gigantic and destroys incremental build times for any # files unlucky enough to be unified with it. SOURCES += [ "builtin/RegExp.cpp", "jsmath.cpp", "vm/Interpreter.cpp", "vm/ProfilingStack.cpp", ] if CONFIG["ENABLE_RECORD_TUPLE"]: UNIFIED_SOURCES += [ "builtin/RecordObject.cpp", "builtin/TupleObject.cpp", "vm/RecordTupleShared.cpp", "vm/RecordType.cpp", "vm/TupleType.cpp", ] if CONFIG["JS_HAS_INTL_API"]: UNIFIED_SOURCES += [ "builtin/intl/Collator.cpp", "builtin/intl/CommonFunctions.cpp", "builtin/intl/DateTimeFormat.cpp", "builtin/intl/DecimalNumber.cpp", "builtin/intl/DisplayNames.cpp", "builtin/intl/IntlObject.cpp", "builtin/intl/LanguageTag.cpp", "builtin/intl/ListFormat.cpp", "builtin/intl/Locale.cpp", "builtin/intl/NumberFormat.cpp", "builtin/intl/PluralRules.cpp", "builtin/intl/RelativeTimeFormat.cpp", "builtin/intl/SharedIntlData.cpp", ] if CONFIG["MOZ_INSTRUMENTS"]: SOURCES += [ "devtools/Instruments.cpp", ] if CONFIG["OS_ARCH"] == "WINNT": OS_LIBS += [ "advapi32", "winmm", ] UNIFIED_SOURCES += [ "threading/windows/CpuCount.cpp", "threading/windows/WindowsThread.cpp", ] # WASI hasn't supported thread yet so noop implementation is used. elif CONFIG["OS_ARCH"] == "WASI": UNIFIED_SOURCES += [ "threading/noop/CpuCount.cpp", "threading/noop/NoopThread.cpp", ] else: UNIFIED_SOURCES += [ "threading/posix/CpuCount.cpp", "threading/posix/PosixThread.cpp", ] if CONFIG["JS_HAS_CTYPES"]: SOURCES += [ "ctypes/CTypes.cpp", "ctypes/Library.cpp", ] if not CONFIG["MOZ_SYSTEM_FFI"]: LOCAL_INCLUDES += [ "!ctypes/libffi/include", "ctypes/libffi/src/%s" % CONFIG["FFI_TARGET_DIR"], ] if CONFIG["MOZ_VTUNE"]: SOURCES += [ "vtune/ittnotify_static.c", "vtune/jitprofiling.c", "vtune/VTuneWrapper.cpp", ] SOURCES["vtune/ittnotify_static.c"].flags += [ "-Wno-varargs", "-Wno-sign-compare", "-Wno-unknown-pragmas", ] if CONFIG["CC_TYPE"] == "gcc": SOURCES["vtune/ittnotify_static.c"].flags += ["-Wno-stringop-overflow"] if int(CONFIG["CC_VERSION"].split(".")[0]) >= 8: SOURCES["vtune/ittnotify_static.c"].flags += ["-Wno-stringop-truncation"] DIRS += ["build", "debugger", "frontend", "gc", "irregexp", "jit", "util", "wasm"] # Bug 1739321 - clang 13+ only emits debuginfo for classes that are actually # constructed, and we cheat in a number of cases. The flag exists at least # back to clang 4. if CONFIG["CC_TYPE"] == "clang": CXXFLAGS += ["-fstandalone-debug"] # Bug 1722102 - This should never be enabled in Release without explicit # security and SpiderMonkey review. # See https://bugzilla.mozilla.org/show_bug.cgi?id=1722102#c16 if CONFIG["NIGHTLY_BUILD"] and CONFIG["INTEL_ARCHITECTURE"]: DIRS += ["intgemm"] if CONFIG["JS_JITSPEW"]: DIRS += ["zydis"] FINAL_LIBRARY = "js" selfhosted_inputs = [ "../public/friend/ErrorNumbers.msg", # ProfilingCategoryList.h is being indirectly included, and it must be passed # here as an input, so it's generated before this self-hosted JS code # generation. Otherwise, it will intermittently fail to build. "!/mozglue/baseprofiler/public/ProfilingCategoryList.h", "builtin/TypedArrayConstants.h", "builtin/SelfHostingDefines.h", "builtin/Utilities.js", "builtin/Array.js", "builtin/AsyncFunction.js", "builtin/AsyncIteration.js", "builtin/BigInt.js", "builtin/Date.js", "builtin/Error.js", "builtin/Function.js", "builtin/Generator.js", "builtin/Iterator.js", "builtin/Map.js", "builtin/Number.js", "builtin/Object.js", "builtin/Promise.js", "builtin/Reflect.js", "builtin/RegExp.js", "builtin/RegExpGlobalReplaceOpt.h.js", "builtin/RegExpLocalReplaceOpt.h.js", "builtin/String.js", "builtin/Set.js", "builtin/Sorting.js", "builtin/TypedArray.js", "builtin/WeakMap.js", "builtin/WeakSet.js", ] + ( [ "builtin/intl/NumberingSystemsGenerated.h", "builtin/intl/Collator.js", "builtin/intl/CommonFunctions.js", "builtin/intl/CurrencyDataGenerated.js", "builtin/intl/DateTimeFormat.js", "builtin/intl/DisplayNames.js", "builtin/intl/IntlObject.js", "builtin/intl/ListFormat.js", "builtin/intl/NumberFormat.js", "builtin/intl/PluralRules.js", "builtin/intl/RelativeTimeFormat.js", "builtin/intl/SanctionedSimpleUnitIdentifiersGenerated.js", ] if CONFIG["JS_HAS_INTL_API"] else [] ) if CONFIG["ENABLE_RECORD_TUPLE"]: selfhosted_inputs += ["builtin/Tuple.js"] # Prepare self-hosted JS code for embedding GeneratedFile( "selfhosted.out.h", "selfhosted.js", script="builtin/embedjs.py", entry_point="generate_selfhosted", inputs=selfhosted_inputs, ) if CONFIG["JS_HAS_CTYPES"]: if CONFIG["MOZ_SYSTEM_FFI"]: CXXFLAGS += CONFIG["MOZ_FFI_CFLAGS"] if CONFIG["JS_HAS_INTL_API"]: DIRS += [ "../../intl/components", ] USE_LIBS += ["intlcomponents"]