Bug 1827405 [wpt PR 39473] - Fix VisibilityStateEntry and reenable test, a=testonly
[gecko.git] / js / moz.configure
blob4f8360e5f150bff5c8f5b97212e8397a865e9a1d
1 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
2 # vim: set filetype=python:
3 # This Source Code Form is subject to the terms of the Mozilla Public
4 # License, v. 2.0. If a copy of the MPL was not distributed with this
5 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 @depends(build_project)
9 def js_standalone(build_project):
10     if build_project == "js":
11         return True
14 # Debug (see Bug 939505)
15 # ==============================================================
16 set_define("JS_DEBUG", True, when=moz_debug)
19 # Branding
20 # ==============================================================
21 option(
22     "--with-app-name",
23     env="MOZ_APP_NAME",
24     nargs=1,
25     help="Used for e.g. the binary program file name. If not set, "
26     "defaults to a lowercase form of MOZ_APP_BASENAME.",
30 @depends("--with-app-name", js_standalone, moz_app_basename)
31 def moz_app_name(value, js_standalone, moz_app_basename):
32     if value:
33         return value[0]
34     if js_standalone:
35         return "js"
36     return moz_app_basename.lower()
39 set_config("MOZ_APP_NAME", moz_app_name)
41 # SmooshMonkey (new frontend)
42 # ==================================================
44 # Define here in order to use the option from bindgen.configure.
45 option(
46     "--enable-smoosh",
47     default=False,
48     help="Enable SmooshMonkey (new JS engine frontend)",
52 @depends("--enable-smoosh")
53 def enable_smoosh(value):
54     if value:
55         return True
58 set_config("JS_ENABLE_SMOOSH", enable_smoosh)
59 set_define("JS_ENABLE_SMOOSH", enable_smoosh)
61 include("../build/moz.configure/nspr.configure", when="--enable-compile-environment")
62 include("../build/moz.configure/rust.configure", when="--enable-compile-environment")
63 include("../build/moz.configure/bindgen.configure", when="--enable-compile-environment")
65 set_config("JS_STANDALONE", js_standalone)
66 set_define("JS_STANDALONE", js_standalone)
67 add_old_configure_assignment("JS_STANDALONE", js_standalone)
68 option(
69     "--enable-js-shell", default=js_standalone, help="{Build|Do not build} the JS shell"
73 @depends("--enable-js-shell")
74 def js_disable_shell(value):
75     if not value:
76         return True
79 set_config("JS_DISABLE_SHELL", js_disable_shell)
81 set_define("JS_64BIT", depends(target)(lambda t: t.bitness == 64 or None))
83 set_define("JS_PUNBOX64", depends(target)(lambda t: t.bitness == 64 or None))
84 set_define("JS_NUNBOX32", depends(target)(lambda t: t.bitness == 32 or None))
87 # SpiderMonkey as a shared library, and how its symbols are exported
88 # ==================================================================
89 option(
90     "--disable-shared-js",
91     when=js_standalone,
92     help="{Create|Do not create} a shared library",
95 option(
96     "--disable-export-js",
97     when=js_standalone,
98     help="{Mark|Do not mark} JS symbols as DLL exported/visible",
102 @depends("--disable-shared-js", "--disable-export-js", when=js_standalone)
103 def shared_js(shared_js, export_js):
104     if shared_js:
105         if not export_js:
106             die("Must export JS symbols when building a shared library.")
107         return True
110 set_config("JS_SHARED_LIBRARY", shared_js)
113 @depends(shared_js, "--disable-export-js", when=js_standalone)
114 def exportable_js_api(shared_js, export_js):
115     if not shared_js and export_js:
116         return True
119 set_define("STATIC_EXPORTABLE_JS_API", exportable_js_api)
122 @depends(shared_js, exportable_js_api)
123 def static_js_api(shared_js, export_js):
124     if not shared_js and not export_js:
125         return True
128 set_define("STATIC_JS_API", static_js_api)
131 @depends(shared_js)
132 def static_js(value):
133     if not value:
134         return True
137 set_define("MOZ_STATIC_JS", static_js)
140 # Enable records and tuples
141 # ===================================================
142 option(
143     "--enable-record-tuple",
144     default=False,
145     help="Enable records and tuples (and disables JIT)",
149 @depends("--enable-record-tuple")
150 def enable_record_tuple(value):
151     if value:
152         return True
155 set_config("ENABLE_RECORD_TUPLE", enable_record_tuple)
156 set_define("ENABLE_RECORD_TUPLE", enable_record_tuple)
158 # Enable decorators
159 # ===================================================
160 option(
161     "--enable-decorators",
162     default=False,
163     help="Enable experimental JS Decorators support",
167 @depends("--enable-decorators")
168 def enable_decorators(value):
169     if value:
170         return True
173 set_config("ENABLE_DECORATORS", enable_decorators)
174 set_define("ENABLE_DECORATORS", enable_decorators)
176 # JIT support
177 # =======================================================
178 @depends(target, "--enable-record-tuple")
179 def jit_default(target, enable_record_tuple):
180     if enable_record_tuple:
181         return False
182     if target.cpu in (
183         "x86",
184         "x86_64",
185         "arm",
186         "aarch64",
187         "mips32",
188         "mips64",
189         "loongarch64",
190     ):
191         return True
192     return False
195 option("--enable-jit", default=jit_default, help="{Enable|Disable} use of the JITs")
198 @deprecated_option("--enable-ion")
199 def report_deprecated(value):
200     if value:
201         die("--enable-ion is deprecated, use --enable-jit instead")
202     else:
203         die("--disable-ion is deprecated, use --disable-jit instead")
206 # JIT code simulator for cross compiles
207 # =======================================================
208 option(
209     "--enable-simulator",
210     choices=("arm", "arm64", "mips32", "mips64", "loong64", "riscv64"),
211     nargs=1,
212     help="Enable a JIT code simulator for the specified architecture",
216 @depends("--enable-jit", "--enable-simulator", target)
217 def simulator(jit_enabled, simulator_enabled, target):
218     if not jit_enabled or not simulator_enabled:
219         return
221     sim_cpu = simulator_enabled[0]
223     if sim_cpu in ("arm", "mips32"):
224         if target.cpu != "x86":
225             die("The %s simulator only works on x86." % sim_cpu)
227     if sim_cpu in ("arm64", "mips64", "loong64", "riscv64"):
228         if target.cpu != "x86_64" and target.cpu != "aarch64":
229             die("The %s simulator only works on x86-64 or arm64." % sim_cpu)
231     return namespace(**{sim_cpu: True})
234 set_config("JS_SIMULATOR", depends_if(simulator)(lambda x: True))
235 set_config("JS_SIMULATOR_ARM", simulator.arm)
236 set_config("JS_SIMULATOR_ARM64", simulator.arm64)
237 set_config("JS_SIMULATOR_MIPS32", simulator.mips32)
238 set_config("JS_SIMULATOR_MIPS64", simulator.mips64)
239 set_config("JS_SIMULATOR_LOONG64", simulator.loong64)
240 set_config("JS_SIMULATOR_RISCV64", simulator.riscv64)
241 set_define("JS_SIMULATOR", depends_if(simulator)(lambda x: True))
242 set_define("JS_SIMULATOR_ARM", simulator.arm)
243 set_define("JS_SIMULATOR_ARM64", simulator.arm64)
244 set_define("JS_SIMULATOR_MIPS32", simulator.mips32)
245 set_define("JS_SIMULATOR_MIPS64", simulator.mips64)
246 set_define("JS_SIMULATOR_LOONG64", simulator.loong64)
247 set_define("JS_SIMULATOR_RISCV64", simulator.riscv64)
250 @depends("--enable-jit", simulator, target)
251 def jit_codegen(jit_enabled, simulator, target):
252     if not jit_enabled:
253         return namespace(none=True)
255     if simulator:
256         return simulator
258     if target.cpu == "aarch64":
259         return namespace(arm64=True)
260     elif target.cpu == "x86_64":
261         return namespace(x64=True)
262     elif target.cpu == "loongarch64":
263         return namespace(loong64=True)
264     elif target.cpu == "riscv64":
265         return namespace(riscv64=True)
267     return namespace(**{str(target.cpu): True})
270 set_config("JS_CODEGEN_NONE", jit_codegen.none)
271 set_config("JS_CODEGEN_ARM", jit_codegen.arm)
272 set_config("JS_CODEGEN_ARM64", jit_codegen.arm64)
273 set_config("JS_CODEGEN_MIPS32", jit_codegen.mips32)
274 set_config("JS_CODEGEN_MIPS64", jit_codegen.mips64)
275 set_config("JS_CODEGEN_LOONG64", jit_codegen.loong64)
276 set_config("JS_CODEGEN_RISCV64", jit_codegen.riscv64)
277 set_config("JS_CODEGEN_X86", jit_codegen.x86)
278 set_config("JS_CODEGEN_X64", jit_codegen.x64)
279 set_config("JS_CODEGEN_WASM32", jit_codegen.wasm32)
281 set_define("JS_CODEGEN_NONE", jit_codegen.none)
282 set_define("JS_CODEGEN_ARM", jit_codegen.arm)
283 set_define("JS_CODEGEN_ARM64", jit_codegen.arm64)
284 set_define("JS_CODEGEN_MIPS32", jit_codegen.mips32)
285 set_define("JS_CODEGEN_MIPS64", jit_codegen.mips64)
286 set_define("JS_CODEGEN_LOONG64", jit_codegen.loong64)
287 set_define("JS_CODEGEN_RISCV64", jit_codegen.riscv64)
288 set_define("JS_CODEGEN_X86", jit_codegen.x86)
289 set_define("JS_CODEGEN_X64", jit_codegen.x64)
290 set_define("JS_CODEGEN_WASM32", jit_codegen.wasm32)
293 # Profiling
294 # =======================================================
295 option(
296     "--enable-instruments",
297     env="MOZ_INSTRUMENTS",
298     help="Enable instruments remote profiling",
302 @depends("--enable-instruments", target)
303 def instruments(value, target):
304     if value and target.os != "OSX":
305         die("--enable-instruments cannot be used when targeting %s", target.os)
306     if value:
307         return True
310 set_config("MOZ_INSTRUMENTS", instruments)
311 set_define("MOZ_INSTRUMENTS", instruments)
312 add_old_configure_assignment("MOZ_INSTRUMENTS", instruments)
313 imply_option("--enable-profiling", instruments, reason="--enable-instruments")
315 option("--enable-callgrind", env="MOZ_CALLGRIND", help="Enable callgrind profiling")
318 @depends("--enable-callgrind")
319 def callgrind(value):
320     if value:
321         return True
324 set_define("MOZ_CALLGRIND", callgrind)
325 imply_option("--enable-profiling", callgrind)
328 @depends(milestone)
329 def enable_profiling(milestone):
330     return milestone.is_nightly
333 option(
334     "--enable-profiling",
335     env="MOZ_PROFILING",
336     default=enable_profiling,
337     help="{Set|Do not set} compile flags necessary for using sampling "
338     "profilers (e.g. shark, perf)",
342 @depends("--enable-profiling")
343 def profiling(value):
344     if value:
345         return True
348 add_old_configure_assignment("MOZ_PROFILING", profiling)
350 with only_when("--enable-compile-environment"):
351     imply_option("--enable-frame-pointers", True, when=profiling)
354 @depends(profiling, target)
355 def imply_vtune(value, target):
356     ok_cpu = target.cpu in ["x86", "x86_64"]
357     ok_kernel = target.kernel == "WINNT" or (
358         target.kernel == "Linux" and target.os == "GNU"
359     )
361     if value and ok_cpu and ok_kernel:
362         return True
365 set_config("MOZ_PROFILING", profiling)
366 set_define("MOZ_PROFILING", profiling)
367 imply_option("--enable-vtune", imply_vtune, reason="--enable-profiling")
370 option("--enable-vtune", env="MOZ_VTUNE", help="Enable VTune profiling")
373 @depends("--enable-vtune")
374 def vtune(value):
375     if value:
376         return True
379 set_config("MOZ_VTUNE", vtune)
380 set_define("MOZ_VTUNE", vtune)
383 option(
384     "--enable-gc-probes",
385     env="JS_GC_PROBES",
386     help="Turn on probes for allocation and finalization",
390 @depends("--enable-gc-probes")
391 def gc_probes(value):
392     if value:
393         return True
396 set_define("JS_GC_PROBES", gc_probes)
399 option(
400     "--enable-gczeal",
401     default=depends(when=moz_debug)(lambda: True),
402     help="{Enable|Disable} zealous GCing",
405 set_define("JS_GC_ZEAL", depends_if("--enable-gczeal")(lambda _: True))
408 # Use a smaller chunk size for GC chunks
409 # ========================================================
410 # Use large (1MB) chunks by default.  This option can be used to give
411 # smaller (currently 256K) chunks.
412 option(
413     "--enable-small-chunk-size",
414     help="Allocate memory for JS GC things in smaller chunks",
417 set_define(
418     "JS_GC_SMALL_CHUNK_SIZE", depends(when="--enable-small-chunk-size")(lambda: True)
422 # Enable breakpoint for artificial OOMs
423 # =======================================================
424 option(
425     "--enable-oom-breakpoint", help="Enable a breakpoint function for artificial OOMs"
428 set_define("JS_OOM_BREAKPOINT", depends_if("--enable-oom-breakpoint")(lambda _: True))
431 option("--enable-perf", env="JS_ION_PERF", help="Enable Linux perf integration")
434 @depends("--enable-perf", target)
435 def ion_perf(value, target):
436     is_linux = target.kernel == "Linux" and target.os == "GNU"
437     is_mac = target.kernel == "Darwin" and target.os == "OSX"
439     if value and (is_linux or is_mac):
440         return True
443 set_define("JS_ION_PERF", ion_perf)
446 option(
447     "--enable-jitspew",
448     default=depends(when=moz_debug)(lambda: True),
449     help="{Enable|Disable} the Jit spew and IONFLAGS environment " "variable",
452 set_define("JS_JITSPEW", depends_if("--enable-jitspew")(lambda _: True))
453 set_config("JS_JITSPEW", depends_if("--enable-jitspew")(lambda _: True))
455 # Also enable the structured spewer
456 set_define("JS_STRUCTURED_SPEW", depends_if("--enable-jitspew")(lambda _: True))
457 set_config("JS_STRUCTURED_SPEW", depends_if("--enable-jitspew")(lambda _: True))
460 @depends("--enable-jit", "--enable-jitspew", simulator, target, moz_debug)
461 def jit_disasm_arm(jit_enabled, spew, simulator, target, debug):
462     if not jit_enabled:
463         return
465     if simulator and (debug or spew):
466         if getattr(simulator, "arm", None):
467             return True
469     if target.cpu == "arm" and (debug or spew):
470         return True
473 set_config("JS_DISASM_ARM", jit_disasm_arm)
474 set_define("JS_DISASM_ARM", jit_disasm_arm)
477 @depends("--enable-jit", "--enable-jitspew", simulator, target, moz_debug)
478 def jit_disasm_riscv(jit_enabled, spew, simulator, target, debug):
479     if not jit_enabled:
480         return
482     if simulator and (debug or spew):
483         if getattr(simulator, "riscv64", None):
484             return True
486     if target.cpu == "riscv64" and (debug or spew):
487         return True
490 set_config("JS_DISASM_RISCV64", jit_disasm_riscv)
491 set_define("JS_DISASM_RISCV64", jit_disasm_riscv)
494 @depends("--enable-jit", "--enable-jitspew", simulator, target, moz_debug)
495 def jit_disasm_arm64(jit_enabled, spew, simulator, target, debug):
496     if not jit_enabled:
497         return
499     if simulator and (debug or spew):
500         if getattr(simulator, "arm64", None):
501             return True
503     if target.cpu == "aarch64" and (debug or spew):
504         return True
507 set_config("JS_DISASM_ARM64", jit_disasm_arm64)
508 set_define("JS_DISASM_ARM64", jit_disasm_arm64)
510 # When enabled, masm will generate assumeUnreachable calls that act as
511 # assertions in the generated code. This option is worth disabling when you
512 # have to track mutated values through the generated code, to avoid constantly
513 # dumping registers on and off the stack.
514 option(
515     "--enable-masm-verbose",
516     default=depends(when=moz_debug)(lambda: True),
517     help="{Enable|Disable} MacroAssembler verbosity of generated code.",
519 set_define("JS_MASM_VERBOSE", depends_if("--enable-masm-verbose")(lambda _: True))
520 set_config("JS_MASM_VERBOSE", depends_if("--enable-masm-verbose")(lambda _: True))
522 # Architecture feature flags
523 # =======================================================
525 # Apple silicon does not seem to have any way to query the OS for the JSCVT
526 # flag stored in the ID_AA64ISAR1_EL1 system register. In the mean time, we
527 # hard code the value of the JSCVT flag which guards the implementation of
528 # FJCVTZS instruction as part of ARMv8.3-JSConv.
529 @depends(target)
530 def is_apple_silicon(target):
531     return target.os == "OSX" and target.kernel == "Darwin" and target.cpu == "aarch64"
534 option(
535     "--enable-arm64-fjcvtzs",
536     default=is_apple_silicon,
537     help="{Enable|Disable} static use of FJCVTZS instruction on Aarch64 targets.",
540 # The "ARM Architecture Reference Manual" for ARMv8 defines the JSCVT flag as
541 # being a 4 bit integer (D12.2.52) and it can be manipulated using >= operator
542 # (D12.1.4).
544 # The FJCVTZS instruction is implemented if ID_AA64ISAR1_EL1.JSCVT >= 1.
545 @depends("--enable-arm64-fjcvtzs", target, simulator)
546 def aarch64_jscvt(fjcvtzs, target, simulator):
547     if target.cpu == "aarch64" and fjcvtzs:
548         return 1
550     if simulator and getattr(simulator, "arm64", False) and fjcvtzs:
551         return 1
553     return 0
556 set_define("MOZ_AARCH64_JSCVT", aarch64_jscvt)
558 # CTypes
559 # =======================================================
560 @depends(js_standalone)
561 def ctypes_default(js_standalone):
562     return not js_standalone
565 option("--enable-ctypes", default=ctypes_default, help="{Enable|Disable} js-ctypes")
567 build_ctypes = depends_if("--enable-ctypes")(lambda _: True)
569 set_config("BUILD_CTYPES", build_ctypes)
570 set_define("BUILD_CTYPES", build_ctypes)
572 set_config("JS_HAS_CTYPES", build_ctypes)
573 set_define("JS_HAS_CTYPES", build_ctypes)
576 @depends("--enable-ctypes", "--enable-compile-environment")
577 def ctypes_and_compile_environment(ctypes, compile_environment):
578     return ctypes and compile_environment
581 include("ffi.configure", when=ctypes_and_compile_environment)
584 # Enable pipeline operator
585 # ===================================================
586 option("--enable-pipeline-operator", default=False, help="Enable pipeline operator")
589 @depends("--enable-pipeline-operator")
590 def enable_pipeline_operator(value):
591     if value:
592         return True
595 set_config("ENABLE_PIPELINE_OPERATOR", enable_pipeline_operator)
596 set_define("ENABLE_PIPELINE_OPERATOR", enable_pipeline_operator)
599 # SIMD acceleration for encoding_rs
600 # ==============================================================
602 option(
603     "--enable-rust-simd", env="MOZ_RUST_SIMD", help="Enable explicit SIMD in Rust code."
607 @depends("--enable-rust-simd", target)
608 def rust_simd(value, target):
609     # As of 2019-09-17, the simd-accel feature of encoding_rs has not
610     # been properly set up outside aarch64, armv7, x86 and x86_64.
611     if target.cpu in ("aarch64", "arm", "x86", "x86_64") and value:
612         return True
615 set_config("MOZ_RUST_SIMD", rust_simd)
616 set_define("MOZ_RUST_SIMD", rust_simd)
618 # Telemetry to measure compile time and generated-code runtime
619 # ============================================================
621 option(
622     "--enable-spidermonkey-telemetry",
623     default=milestone.is_nightly,
624     help="{Enable|Disable} performance telemetry for SpiderMonkey (e.g. compile and run times)",
627 set_define(
628     "ENABLE_SPIDERMONKEY_TELEMETRY",
629     depends_if("--enable-spidermonkey-telemetry")(lambda x: True),
632 # Support for debugging code generated by wasm backends
633 # =====================================================
635 option(
636     "--enable-wasm-codegen-debug",
637     default=depends(when=moz_debug)(lambda: True),
638     help="{Enable|Disable} debugging for wasm codegen",
641 set_config(
642     "WASM_CODEGEN_DEBUG", depends_if("--enable-wasm-codegen-debug")(lambda x: True)
644 set_define(
645     "WASM_CODEGEN_DEBUG", depends_if("--enable-wasm-codegen-debug")(lambda x: True)
648 # WebAssembly feature flags
649 # ==================================================
651 option(
652     "--wasm-no-experimental",
653     default=False,
654     help="Force disable all wasm experimental features for testing.",
657 # Support for WebAssembly function-references.
658 # ===========================
661 @depends(milestone.is_nightly)
662 def default_wasm_function_references(is_nightly):
663     if is_nightly:
664         return True
667 option(
668     "--enable-wasm-function-references",
669     default=default_wasm_function_references,
670     help="{Enable|Disable} WebAssembly function-references",
674 @depends("--enable-wasm-function-references", "--wasm-no-experimental")
675 def wasm_function_references(value, no_experimental):
676     if no_experimental:
677         return
679     if value:
680         return True
683 set_config("ENABLE_WASM_FUNCTION_REFERENCES", wasm_function_references)
684 set_define("ENABLE_WASM_FUNCTION_REFERENCES", wasm_function_references)
686 # Support for WebAssembly GC.
687 # ===========================
690 @depends(milestone.is_nightly, "--enable-wasm-function-references")
691 def default_wasm_gc(is_nightly, function_references):
692     if is_nightly and function_references:
693         return True
696 option(
697     "--enable-wasm-gc", default=default_wasm_gc, help="{Enable|Disable} WebAssembly GC"
701 @depends(
702     "--enable-wasm-gc", "--enable-wasm-function-references", "--wasm-no-experimental"
704 def wasm_gc(value, function_references, no_experimental):
705     if no_experimental or not value:
706         return
708     if function_references:
709         return True
711     die("--enable-wasm-gc only possible with --enable-wasm-function-references")
714 set_config("ENABLE_WASM_GC", wasm_gc)
715 set_define("ENABLE_WASM_GC", wasm_gc)
718 # Support for WebAssembly shared memory and atomics.
720 # This affects the JS shell only.
721 # =====================================================
723 option(
724     "--disable-shared-memory", help="Disable JS/WebAssembly shared memory and atomics"
728 @depends("--disable-shared-memory")
729 def enable_shared_memory(value):
730     if value:
731         return True
734 set_config("ENABLE_SHARED_MEMORY", enable_shared_memory)
735 set_define("ENABLE_SHARED_MEMORY", enable_shared_memory)
737 # Support for WebAssembly extended constant expressions
738 # =====================================================
741 option(
742     "--disable-wasm-extended-const",
743     help="{Enable|Disable} WebAssembly extended constant expressions",
747 @depends("--disable-wasm-extended-const")
748 def wasm_extended_const(value):
749     if value:
750         return True
753 set_config("ENABLE_WASM_EXTENDED_CONST", wasm_extended_const)
754 set_define("ENABLE_WASM_EXTENDED_CONST", wasm_extended_const)
756 # Support for WebAssembly SIMD
757 # =====================================================
760 @depends("--enable-jit", "--enable-simulator", target)
761 def default_wasm_simd(jit_enabled, simulator, target):
762     if not jit_enabled:
763         return
765     if simulator and (simulator[0] != "arm64"):
766         return
768     if target.cpu in ("x86_64", "x86", "aarch64"):
769         return True
772 option(
773     "--enable-wasm-simd",
774     default=default_wasm_simd,
775     help="{Enable|Disable} WebAssembly SIMD",
779 @depends(
780     "--enable-wasm-simd",
781     "--enable-jit",
782     "--enable-simulator",
783     target,
784     "--wasm-no-experimental",
786 def wasm_simd(value, jit_enabled, simulator, target, no_experimental):
787     if no_experimental or not value:
788         return
790     if not jit_enabled:
791         die("--enable-wasm-simd requires --enable-jit")
793     if simulator and (simulator[0] != "arm64"):
794         die("--enable-wasm-simd is not supported for simulators, except arm64")
796     if target.cpu in ("x86_64", "x86", "aarch64"):
797         return True
799     die("--enable-wasm-simd only possible when targeting the x86_64/x86/arm64 jits")
802 set_config("ENABLE_WASM_SIMD", wasm_simd)
803 set_define("ENABLE_WASM_SIMD", wasm_simd)
805 # Whether to check for field changes in WebAssembly serialization
807 # See the comment for 'WASM_VERIFY_SERIALIZATION_FOR_SIZE' in WasmSerialize.cpp
808 # for more background.
809 # =====================================================================
812 @depends(
813     target,
814     c_compiler,
815     moz_debug,
816     milestone,
817     "--wasm-no-experimental",
819 def wasm_verify_serialization_for_size(
820     target, c_compiler, debug, milestone, no_experimental
822     if (
823         debug == True
824         and target.kernel == "Linux"
825         and target.cpu == "x86_64"
826         and c_compiler
827         and c_compiler.type == "clang"
828         and milestone.is_nightly
829         and not no_experimental
830     ):
831         return True
832     return
835 set_define(
836     "ENABLE_WASM_VERIFY_SERIALIZATION_FOR_SIZE", wasm_verify_serialization_for_size
839 # Support for Intel AVX instruction.
841 # AVX is exclusively used in WebAssembly SIMD instructions at the moment:
842 # set direct dependency on "--enable-wasm-simd".
843 # =====================================================
846 @depends("--enable-wasm-simd", "--enable-simulator", target)
847 def default_wasm_avx(wasm_simd_enabled, simulator, target):
848     if not wasm_simd_enabled:
849         return
851     if simulator:
852         return
854     if target.cpu in ("x86_64", "x86"):
855         return True
858 option(
859     "--enable-wasm-avx",
860     default=default_wasm_avx,
861     help="{Enable|Disable} AVX support for WebAssembly SIMD",
865 @depends(
866     "--enable-wasm-avx",
867     "--enable-wasm-simd",
868     "--enable-simulator",
869     target,
870     "--wasm-no-experimental",
872 def wasm_avx(value, wasm_simd_enabled, simulator, target, no_experimental):
873     if no_experimental or not value:
874         return
876     if not wasm_simd_enabled:
877         die("--enable-wasm-avx requires --enable-wasm-simd")
879     if simulator:
880         die("--enable-wasm-avx is not supported for simulators")
882     if target.cpu in ("x86_64", "x86"):
883         return True
885     die("--enable-wasm-avx only possible when targeting the x86_64/x86 jits")
888 set_config("ENABLE_WASM_AVX", wasm_avx)
889 set_define("ENABLE_WASM_AVX", wasm_avx)
891 # Support for WebAssembly relaxed SIMD
892 # =====================================================
895 @depends(milestone.is_nightly, "--enable-wasm-simd")
896 def default_wasm_relaxed_simd(is_nightly, wasm_simd):
897     if is_nightly and wasm_simd:
898         return True
901 option(
902     "--enable-wasm-relaxed-simd",
903     default=default_wasm_relaxed_simd,
904     help="{Enable|Disable} WebAssembly relaxed SIMD",
908 @depends("--enable-wasm-relaxed-simd", "--enable-wasm-simd", "--wasm-no-experimental")
909 def wasm_relaxed_simd(value, wasm_simd, no_experimental):
910     if no_experimental or not value:
911         return
913     if not wasm_simd:
914         die("relaxed SIMD requires SIMD")
916     return True
919 set_config("ENABLE_WASM_RELAXED_SIMD", wasm_relaxed_simd)
920 set_define("ENABLE_WASM_RELAXED_SIMD", wasm_relaxed_simd)
922 # Support for WebAssembly intgemm private intrinsics
923 # =====================================================
926 @depends(milestone.is_nightly)
927 def default_wasm_moz_intgemm(is_nightly):
928     if is_nightly:
929         return True
932 option(
933     "--enable-wasm-moz-intgemm",
934     default=default_wasm_moz_intgemm,
935     help="{Enable|Disable} WebAssembly intgemm private intrinsics",
939 @depends("--enable-wasm-moz-intgemm", target, "--wasm-no-experimental")
940 def wasm_moz_intgemm(value, target, no_experimental):
941     if no_experimental:
942         return
944     if value and target.cpu in ("x86", "x86_64"):
945         return True
948 set_config("ENABLE_WASM_MOZ_INTGEMM", wasm_moz_intgemm)
949 set_define("ENABLE_WASM_MOZ_INTGEMM", wasm_moz_intgemm)
951 # Support for WebAssembly Memory64.
952 # ===========================
955 @depends(milestone.is_nightly, "--enable-simulator", target)
956 def default_wasm_memory64(is_nightly, simulator, target):
957     if target.cpu == "mips32":
958         return
960     if simulator and simulator[0] == "mips32":
961         return
963     if is_nightly:
964         return True
967 option(
968     "--enable-wasm-memory64",
969     default=default_wasm_memory64,
970     help="{Enable|Disable} WebAssembly Memory64",
974 @depends(
975     "--enable-wasm-memory64", "--enable-simulator", target, "--wasm-no-experimental"
977 def wasm_memory64(value, simulator, target, no_experimental):
978     if no_experimental or not value:
979         return
981     if target.cpu == "mips32":
982         die("Memory64 is incompatible with MIPS32 target")
984     if simulator and simulator[0] == "mips32":
985         die("Memory64 is incompatible with MIPS32 simulator")
987     return True
990 set_config("ENABLE_WASM_MEMORY64", wasm_memory64)
991 set_define("ENABLE_WASM_MEMORY64", wasm_memory64)
994 # Support for WebAssembly memory control.
995 # ===========================
998 @depends(milestone.is_nightly)
999 def default_wasm_memory_control(is_nightly):
1000     if is_nightly:
1001         return True
1004 option(
1005     "--enable-wasm-memory-control",
1006     default=default_wasm_memory_control,
1007     help="{Enable|Disable} WebAssembly fine-grained memory control instructions",
1011 @depends("--enable-wasm-memory-control", "--wasm-no-experimental")
1012 def wasm_memory_control(value, no_experimental):
1013     if no_experimental or not value:
1014         return
1016     return True
1019 set_config("ENABLE_WASM_MEMORY_CONTROL", wasm_memory_control)
1020 set_define("ENABLE_WASM_MEMORY_CONTROL", wasm_memory_control)
1023 # Options for generating the shell as a script
1024 # ============================================
1025 option("--with-qemu-exe", nargs=1, help="Use path as an arm emulator on host platforms")
1026 set_config("QEMU_EXE", depends_if("--with-qemu-exe")(lambda x: x))
1028 option(
1029     "--with-cross-lib",
1030     nargs=1,
1031     default=depends(target.alias)(lambda x: "/usr/%s" % x),
1032     help="Use dir as the location for arm libraries",
1034 set_config("CROSS_LIB", depends_if("--with-cross-lib")(lambda x: x))
1036 # Enable static checking using sixgill
1037 # ====================================
1039 option("--with-sixgill", nargs=1, help="Enable static checking of code using sixgill")
1042 @depends_if("--with-sixgill")
1043 @imports("os")
1044 def sixgill(value):
1045     for f in ("bin/xdbfind", "gcc/xgill.so", "scripts/wrap_gcc/g++"):
1046         if not os.path.exists(os.path.join(value[0], f)):
1047             die("The sixgill plugin and binaries are not at the specified path")
1048     return value[0]
1051 set_config("SIXGILL_PATH", sixgill)
1054 # Support for readline
1055 # =====================================================
1058 @depends("--enable-js-shell", target_is_windows, compile_environment, target)
1059 def editline(js_shell, is_windows, compile_environment, target):
1060     return js_shell and not is_windows and compile_environment and (target.os != "WASI")
1063 option(
1064     "--enable-readline", help="Link js shell to system readline library", when=editline
1067 has_readline = check_symbol(
1068     "readline",
1069     flags=["-lreadline"],
1070     when="--enable-readline",
1071     onerror=lambda: die("No system readline library found"),
1074 set_config("EDITLINE_LIBS", ["-lreadline"], when=has_readline)
1077 @depends("--enable-readline", editline, when=editline)
1078 def bundled_editline(readline, editline):
1079     return editline and not readline
1082 set_config("JS_BUNDLED_EDITLINE", bundled_editline)
1084 set_define("EDITLINE", True, when=editline)
1087 # JIT observers
1088 # =============
1090 option(
1091     "--with-jitreport-granularity",
1092     default="3",
1093     choices=("0", "1", "2", "3"),
1094     help="Default granularity at which to report JIT code to external tools "
1095     "(0 - no info, 1 - code ranges for while functions only, "
1096     "2 - per-line information, 3 - per-op information)",
1099 set_define(
1100     "JS_DEFAULT_JITREPORT_GRANULARITY",
1101     depends_if("--with-jitreport-granularity")(lambda value: value[0]),
1105 # ECMAScript Internationalization API Support (uses ICU)
1106 # ======================================================
1107 system_lib_option("--with-system-icu", help="Use system ICU")
1109 system_icu = pkg_check_modules("MOZ_ICU", "icu-i18n >= 72.1", when="--with-system-icu")
1112 @depends("--with-system-icu")
1113 def in_tree_icu(system_icu):
1114     return not system_icu
1117 # Set MOZ_ICU_CFLAGS to an explicit empty value when --with-system-icu is *not* used,
1118 # for layout/style/extra-bindgen-flags
1119 set_config("MOZ_ICU_CFLAGS", [], when=in_tree_icu)
1121 set_config("MOZ_SYSTEM_ICU", True, when=system_icu)
1122 set_define("MOZ_SYSTEM_ICU", True, when=system_icu)
1124 option("--without-intl-api", help="Disable ECMAScript Internationalization API")
1127 @depends("--with-intl-api", js_standalone)
1128 def check_intl_api(enabled, js_standalone):
1129     if not enabled and not js_standalone:
1130         die("--without-intl-api is not supported")
1133 set_config("JS_HAS_INTL_API", True, when="--with-intl-api")
1134 set_define("JS_HAS_INTL_API", True, when="--with-intl-api")
1137 @depends(build_environment, when="--with-intl-api")
1138 @imports(_from="__builtin__", _import="open")
1139 @imports(_from="__builtin__", _import="ValueError")
1140 def icu_version(build_env):
1141     path = os.path.join(
1142         build_env.topsrcdir, "intl", "icu", "source", "common", "unicode", "uvernum.h"
1143     )
1144     with open(path, encoding="utf-8") as fh:
1145         for line in fh:
1146             if line.startswith("#define"):
1147                 define = line.split(None, 3)
1148                 if len(define) == 3 and define[1] == "U_ICU_VERSION_MAJOR_NUM":
1149                     try:
1150                         return str(int(define[2]))
1151                     except ValueError:
1152                         pass
1153     die("Cannot determine ICU version number from uvernum.h header file")
1156 set_config("MOZ_ICU_VERSION", icu_version)
1158 # Source files that use ICU should have control over which parts of the ICU
1159 # namespace they want to use.
1160 set_define("U_USING_ICU_NAMESPACE", "0", when="--with-intl-api")
1162 # We build ICU as a static library.
1163 set_define("U_STATIC_IMPLEMENTATION", True, when=depends(system_icu)(lambda x: not x))
1166 # Initial support for WebAssembly JS-API Type Reflections
1167 # =======================================================
1170 @depends(milestone.is_nightly)
1171 def default_wasm_type_reflections(is_nightly):
1172     return is_nightly
1175 option(
1176     "--enable-wasm-type-reflections",
1177     default=default_wasm_type_reflections,
1178     help="{Enable|Disable} type reflection in WASM JS-API",
1181 set_config(
1182     "ENABLE_WASM_TYPE_REFLECTIONS",
1183     depends_if("--enable-wasm-type-reflections")(lambda x: True),
1185 set_define(
1186     "ENABLE_WASM_TYPE_REFLECTIONS",
1187     depends_if("--enable-wasm-type-reflections")(lambda x: True),
1190 # Wasi configuration
1191 # ===================================================
1194 @depends(target.os)
1195 def is_wasi_target(os):
1196     return os == "WASI"
1199 set_define("_WASI_EMULATED_PROCESS_CLOCKS", True, when=is_wasi_target)
1200 set_define("_WASI_EMULATED_GETPID", True, when=is_wasi_target)
1202 # Enable change-array-by-copy
1203 # ===================================================
1206 @depends(milestone.is_nightly)
1207 def use_change_array_by_copy(is_nightly):
1208     return is_nightly
1211 option(
1212     "--enable-change-array-by-copy",
1213     default=use_change_array_by_copy,
1214     help="{Enable|Disable} change-array-by-copy method pref/command-line option (disabled by default in Release-or-Beta)",
1218 @depends("--enable-change-array-by-copy")
1219 def enable_change_array_by_copy(value):
1220     if value:
1221         return True
1224 set_config("ENABLE_CHANGE_ARRAY_BY_COPY", enable_change_array_by_copy)
1225 set_define("ENABLE_CHANGE_ARRAY_BY_COPY", enable_change_array_by_copy)
1227 # Enable New Set methods
1228 # ===================================================
1229 def use_new_set_methods():
1230     return False
1233 option(
1234     "--enable-new-set-methods",
1235     default=use_new_set_methods(),
1236     help="{Enable|Disable} New Set methods pref/command-line option (disabled by default)",
1240 @depends("--enable-new-set-methods")
1241 def enable_new_set_methods(value):
1242     if value:
1243         return True
1246 set_config("ENABLE_NEW_SET_METHODS", enable_new_set_methods)
1247 set_define("ENABLE_NEW_SET_METHODS", enable_new_set_methods)
1250 @depends(milestone.version)
1251 def js_version(version):
1252     return Version(version)
1255 set_config("MOZJS_MAJOR_VERSION", depends(js_version.major)(lambda m: str(m)))
1256 set_define("MOZJS_MAJOR_VERSION", js_version.major)
1257 set_config("MOZJS_MINOR_VERSION", depends(js_version.minor)(lambda m: str(m)))
1258 set_define("MOZJS_MINOR_VERSION", js_version.minor)
1259 set_config("MOZJS_PATCH_VERSION", depends(js_version.patch)(lambda p: str(p)))
1260 set_config(
1261     "MOZJS_ALPHA",
1262     depends(js_version)(
1263         lambda x: x.version[-2] if str(x.version[-2]) in "ab" else None
1264     ),
1268 # Some platforms have HeapReg, some don't
1269 # =====================================================
1271 # The ARM simulator runs on x86 and might be excluded by the first test,
1272 # so we special-case it.
1275 @depends("--enable-simulator", target)
1276 def wasm_has_heapreg(simulator, target):
1277     if target.cpu != "x86":
1278         return True
1280     if simulator and simulator[0] == "arm":
1281         return True
1284 set_define("WASM_HAS_HEAPREG", wasm_has_heapreg)
1286 # Check for tm_zone, tm_gmtoff in struct tm
1287 # ===================================================
1288 with only_when(compile_environment):
1289     set_define(
1290         "HAVE_TM_ZONE_TM_GMTOFF",
1291         c_compiler.try_compile(
1292             includes=["time.h"],
1293             body="struct tm tm; tm.tm_zone = 0; tm.tm_gmtoff = 1;",
1294             check_msg="for tm_zone and tm_gmtoff in struct tm",
1295         ),
1296     )
1299 # Checks for library functions
1300 # ==============================================================
1301 with only_when(compile_environment & depends(target.os)(lambda os: os != "WINNT")):
1302     set_define("HAVE_GETPAGESIZE", check_symbol("getpagesize"))
1303     set_define("HAVE_GMTIME_R", check_symbol("gmtime_r"))
1304     set_define("HAVE_LOCALTIME_R", check_symbol("localtime_r"))
1305     set_define("HAVE_GETTID", check_symbol("gettid"))
1306     set_define("HAVE_SETPRIORITY", check_symbol("setpriority"))
1307     set_define("HAVE_SYSCALL", check_symbol("syscall"))
1308     set_define("HAVE_GETC_UNLOCKED", check_symbol("getc_unlocked"))
1309     set_define("HAVE_PTHREAD_GETNAME_NP", check_symbol("pthread_getname_np"))
1310     set_define("HAVE_PTHREAD_GET_NAME_NP", check_symbol("pthread_get_name_np"))
1311     set_define("HAVE_STRERROR", check_symbol("strerror"))
1313     @depends(check_symbol("__cxa_demangle", language="C++"), moz_debug, dmd)
1314     def demangle_symbols(cxa_demangle, moz_debug, dmd):
1315         # Demangle only for debug or DMD builds
1316         if cxa_demangle and (moz_debug or dmd):
1317             return True
1319     set_define("MOZ_DEMANGLE_SYMBOLS", demangle_symbols)
1321     set_define(
1322         "HAVE__UNWIND_BACKTRACE",
1323         check_symbol("_Unwind_Backtrace", when=check_header("unwind.h")),
1324     )
1326 with only_when(compile_environment):
1327     set_define("HAVE__GETC_NOLOCK", check_symbol("_getc_nolock"))
1328     set_define("HAVE_LOCALECONV", check_symbol("localeconv"))