Source code
Revision control
Copy as Markdown
Other Tools
# -*- 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
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_DEFINE_FILES += [
"js-confdefs.h",
]
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/PrefsGenerated.h",
"../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/ColumnNumber.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/EnvironmentChain.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/Iterator.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/Prefs.h",
"../public/Principals.h",
"../public/Printer.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/BindingAllocs.h",
"../public/experimental/CodeCoverage.h",
"../public/experimental/CompileScript.h",
"../public/experimental/CTypes.h",
"../public/experimental/Intl.h",
"../public/experimental/JitInfo.h",
"../public/experimental/JSStencil.h",
"../public/experimental/LoggingInterface.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/ParseRecordObject.cpp",
"builtin/Profilers.cpp",
"builtin/Promise.cpp",
"builtin/RawJSONObject.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/BoundFunctionObject.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/ConcurrentDelazification.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/InvalidatingFuse.cpp",
"vm/Iteration.cpp",
"vm/Iterator.cpp",
"vm/JitActivation.cpp",
"vm/JSAtomUtils.cpp",
"vm/JSContext.cpp",
"vm/JSFunction.cpp",
"vm/JSObject.cpp",
"vm/JSONParser.cpp",
"vm/JSONPrinter.cpp",
"vm/JSScript.cpp",
"vm/List.cpp",
"vm/Logging.cpp",
"vm/MemoryMetrics.cpp",
"vm/Modules.cpp",
"vm/NativeObject.cpp",
"vm/OffThreadPromiseRuntimeState.cpp",
"vm/PIC.cpp",
"vm/PlainObject.cpp",
"vm/Prefs.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/RealmFuses.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/SharedScriptDataTableHolder.cpp",
"vm/SourceHook.cpp",
"vm/Stack.cpp",
"vm/StaticStrings.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",
]
# 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 <ntsecapi.h> 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_PORTABLE_BASELINE_INTERP"]:
SOURCES += [
"vm/PortableBaselineInterpret.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["ENABLE_EXPLICIT_RESOURCE_MANAGEMENT"]:
UNIFIED_SOURCES += [
"builtin/AsyncDisposableStackObject.cpp",
"builtin/DisposableStackObject.cpp",
"builtin/DisposableStackObjectBase.cpp",
"vm/DisposableRecord.cpp",
]
if CONFIG["JS_HAS_INTL_API"]:
UNIFIED_SOURCES += [
"builtin/intl/Collator.cpp",
"builtin/intl/CommonFunctions.cpp",
"builtin/intl/DateTimeFormat.cpp",
"builtin/intl/DisplayNames.cpp",
"builtin/intl/DurationFormat.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/Segmenter.cpp",
"builtin/intl/SharedIntlData.cpp",
]
if CONFIG["MOZ_INSTRUMENTS"]:
OS_LIBS += ["-framework CoreFoundation"]
SOURCES += [
"devtools/Instruments.cpp",
]
if CONFIG["OS_ARCH"] == "WINNT":
OS_LIBS += [
"advapi32",
]
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_INTL_API"] and CONFIG["MOZ_ICU4X"]:
LOCAL_INCLUDES += [
"/intl/icu_capi/bindings/c",
]
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"]
if CONFIG["JS_HAS_TEMPORAL_API"]:
DIRS += ["builtin/temporal"]
# 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"]
# security and SpiderMonkey review.
if CONFIG["ENABLE_WASM_MOZ_INTGEMM"]:
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/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/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/DurationFormat.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",
"builtin/intl/Segmenter.js",
]
if CONFIG["JS_HAS_INTL_API"]
else []
)
if CONFIG["ENABLE_RECORD_TUPLE"]:
selfhosted_inputs += ["builtin/Tuple.js"]
if CONFIG["ENABLE_EXPLICIT_RESOURCE_MANAGEMENT"]:
selfhosted_inputs += [
"builtin/AsyncDisposableStack.js",
"builtin/DisposableStack.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,
)
GeneratedFile(
"../public/PrefsGenerated.h",
script="GeneratePrefs.py",
entry_point="generate_prefs_header",
inputs=["../../modules/libpref/init/StaticPrefList.yaml"],
)
if CONFIG["JS_HAS_CTYPES"]:
if CONFIG["MOZ_SYSTEM_FFI"]:
CXXFLAGS += CONFIG["MOZ_FFI_CFLAGS"]
if CONFIG["JS_HAS_INTL_API"]:
if CONFIG["JS_STANDALONE"]:
DIRS += [
"../../intl/bidi",
"../../intl/components",
]
USE_LIBS += ["intlcomponents"]