| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2020-12-07 18:50:27 +01:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2024-05-21 15:14:59 +02:00
										 |  |  | from typing import TYPE_CHECKING | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-25 04:48:11 +01:00
										 |  |  | from emscripten_helpers import ( | 
					
						
							| 
									
										
										
										
											2024-05-21 15:14:59 +02:00
										 |  |  |     add_js_externs, | 
					
						
							| 
									
										
										
										
											2021-01-25 04:48:11 +01:00
										 |  |  |     add_js_libraries, | 
					
						
							|  |  |  |     add_js_pre, | 
					
						
							| 
									
										
										
										
											2024-05-21 15:14:59 +02:00
										 |  |  |     create_engine_file, | 
					
						
							| 
									
										
										
										
											2021-03-08 15:39:14 +01:00
										 |  |  |     create_template_zip, | 
					
						
							| 
									
										
										
										
											2023-12-01 13:39:09 -05:00
										 |  |  |     get_template_zip_path, | 
					
						
							| 
									
										
										
										
											2024-05-21 15:14:59 +02:00
										 |  |  |     run_closure_compiler, | 
					
						
							| 
									
										
										
										
											2021-01-25 04:48:11 +01:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2020-10-03 15:46:52 +02:00
										 |  |  | from SCons.Util import WhereIs | 
					
						
							| 
									
										
										
										
											2024-05-21 15:14:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-22 09:42:30 -05:00
										 |  |  | from methods import get_compiler_version, print_error, print_info, print_warning | 
					
						
							| 
									
										
										
										
											2024-09-27 21:36:52 +03:00
										 |  |  | from platform_methods import validate_arch | 
					
						
							| 
									
										
										
										
											2022-08-23 22:21:46 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | if TYPE_CHECKING: | 
					
						
							| 
									
										
										
										
											2023-11-24 13:31:05 -06:00
										 |  |  |     from SCons.Script.SConscript import SConsEnvironment | 
					
						
							| 
									
										
										
										
											2016-10-30 19:05:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-08 16:55:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | def get_name(): | 
					
						
							| 
									
										
										
										
											2022-08-28 20:27:45 +02:00
										 |  |  |     return "Web" | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-30 19:05:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | def can_build(): | 
					
						
							| 
									
										
										
										
											2020-10-03 15:46:52 +02:00
										 |  |  |     return WhereIs("emcc") is not None | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-30 19:05:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-25 13:59:30 +01:00
										 |  |  | def get_tools(env: "SConsEnvironment"): | 
					
						
							|  |  |  |     # Use generic POSIX build toolchain for Emscripten. | 
					
						
							|  |  |  |     return ["cc", "c++", "ar", "link", "textfile", "zip"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | def get_opts(): | 
					
						
							| 
									
										
										
										
											2017-09-25 00:37:17 -04:00
										 |  |  |     from SCons.Variables import BoolVariable | 
					
						
							| 
									
										
										
										
											2020-05-08 16:55:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  |     return [ | 
					
						
							| 
									
										
										
										
											2021-06-14 07:57:28 +02:00
										 |  |  |         ("initial_memory", "Initial WASM memory (in MiB)", 32), | 
					
						
							| 
									
										
										
										
											2023-03-20 18:39:07 -07:00
										 |  |  |         # Matches default values from before Emscripten 3.1.27. New defaults are too low for Godot. | 
					
						
							|  |  |  |         ("stack_size", "WASM stack size (in KiB)", 5120), | 
					
						
							|  |  |  |         ("default_pthread_stack_size", "WASM pthread default stack size (in KiB)", 2048), | 
					
						
							| 
									
										
										
										
											2020-12-10 13:57:27 +01:00
										 |  |  |         BoolVariable("use_assertions", "Use Emscripten runtime assertions", False), | 
					
						
							|  |  |  |         BoolVariable("use_ubsan", "Use Emscripten undefined behavior sanitizer (UBSAN)", False), | 
					
						
							|  |  |  |         BoolVariable("use_asan", "Use Emscripten address sanitizer (ASAN)", False), | 
					
						
							|  |  |  |         BoolVariable("use_lsan", "Use Emscripten leak sanitizer (LSAN)", False), | 
					
						
							|  |  |  |         BoolVariable("use_safe_heap", "Use Emscripten SAFE_HEAP sanitizer", False), | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  |         # eval() can be a security concern, so it can be disabled. | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |         BoolVariable("javascript_eval", "Enable JavaScript eval interface", True), | 
					
						
							| 
									
										
										
										
											2022-08-29 15:56:28 +02:00
										 |  |  |         BoolVariable( | 
					
						
							|  |  |  |             "dlink_enabled", "Enable WebAssembly dynamic linking (GDExtension support). Produces bigger binaries", False | 
					
						
							|  |  |  |         ), | 
					
						
							| 
									
										
										
										
											2020-05-01 14:45:45 +02:00
										 |  |  |         BoolVariable("use_closure_compiler", "Use closure compiler to minimize JavaScript code", False), | 
					
						
							| 
									
										
										
										
											2023-07-20 09:42:03 -04:00
										 |  |  |         BoolVariable( | 
					
						
							|  |  |  |             "proxy_to_pthread", | 
					
						
							|  |  |  |             "Use Emscripten PROXY_TO_PTHREAD option to run the main application code to a separate thread", | 
					
						
							| 
									
										
										
										
											2023-10-23 08:44:57 -04:00
										 |  |  |             False, | 
					
						
							| 
									
										
										
										
											2023-07-20 09:42:03 -04:00
										 |  |  |         ), | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  |     ] | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-30 19:05:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-19 12:23:22 +03:00
										 |  |  | def get_doc_classes(): | 
					
						
							|  |  |  |     return [ | 
					
						
							|  |  |  |         "EditorExportPlatformWeb", | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_doc_path(): | 
					
						
							|  |  |  |     return "doc_classes" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | def get_flags(): | 
					
						
							| 
									
										
										
										
											2024-05-19 09:41:03 -05:00
										 |  |  |     return { | 
					
						
							|  |  |  |         "arch": "wasm32", | 
					
						
							|  |  |  |         "target": "template_debug", | 
					
						
							|  |  |  |         "builtin_pcre2_with_jit": False, | 
					
						
							|  |  |  |         "vulkan": False, | 
					
						
							| 
									
										
										
										
											2023-09-16 00:21:31 +02:00
										 |  |  |         # Embree is heavy and requires too much memory (GH-70621). | 
					
						
							| 
									
										
										
										
											2024-05-19 09:41:03 -05:00
										 |  |  |         "module_raycast_enabled": False, | 
					
						
							| 
									
										
										
										
											2022-08-29 15:56:28 +02:00
										 |  |  |         # Use -Os to prioritize optimizing for reduced file size. This is | 
					
						
							|  |  |  |         # particularly valuable for the web platform because it directly | 
					
						
							|  |  |  |         # decreases download time. | 
					
						
							|  |  |  |         # -Os reduces file size by around 5 MiB over -O3. -Oz only saves about | 
					
						
							|  |  |  |         # 100 KiB over -Os, which does not justify the negative impact on | 
					
						
							|  |  |  |         # run-time performance. | 
					
						
							| 
									
										
										
										
											2024-07-09 00:17:16 +02:00
										 |  |  |         # Note that this overrides the "auto" behavior for target/dev_build. | 
					
						
							| 
									
										
										
										
											2024-05-19 09:41:03 -05:00
										 |  |  |         "optimize": "size", | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-10 16:08:02 -05:00
										 |  |  | def library_emitter(target, source, env): | 
					
						
							|  |  |  |     # Make every source file dependent on the compiler version. | 
					
						
							|  |  |  |     # This makes sure that when emscripten is updated, that the cached files | 
					
						
							|  |  |  |     # aren't used and are recompiled instead. | 
					
						
							|  |  |  |     env.Depends(source, env.Value(get_compiler_version(env))) | 
					
						
							|  |  |  |     return target, source | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-24 13:31:05 -06:00
										 |  |  | def configure(env: "SConsEnvironment"): | 
					
						
							| 
									
										
										
										
											2025-01-13 11:13:17 -06:00
										 |  |  |     env.Append(LIBEMITTER=[library_emitter]) | 
					
						
							| 
									
										
										
										
											2025-02-10 16:08:02 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-15 17:38:10 -08:00
										 |  |  |     # Validate arch. | 
					
						
							|  |  |  |     supported_arches = ["wasm32"] | 
					
						
							| 
									
										
										
										
											2024-09-27 21:36:52 +03:00
										 |  |  |     validate_arch(env["arch"], get_name(), supported_arches) | 
					
						
							| 
									
										
										
										
											2021-12-15 17:38:10 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-28 19:23:49 +00:00
										 |  |  |     try: | 
					
						
							|  |  |  |         env["initial_memory"] = int(env["initial_memory"]) | 
					
						
							|  |  |  |     except Exception: | 
					
						
							| 
									
										
										
										
											2024-04-26 12:35:07 -05:00
										 |  |  |         print_error("Initial memory must be a valid integer") | 
					
						
							| 
									
										
										
										
											2021-01-28 19:23:49 +00:00
										 |  |  |         sys.exit(255) | 
					
						
							| 
									
										
										
										
											2016-06-14 11:27:16 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  |     ## Build type | 
					
						
							| 
									
										
											  
											
												SCons: Unify tools/target build type configuration
Implements https://github.com/godotengine/godot-proposals/issues/3371.
New `target` presets
====================
The `tools` option is removed and `target` changes to use three new presets,
which match the builds users are familiar with. These targets control the
default optimization level and enable editor-specific and debugging code:
- `editor`: Replaces `tools=yes target=release_debug`.
  * Defines: `TOOLS_ENABLED`, `DEBUG_ENABLED`, `-O2`/`/O2`
- `template_debug`: Replaces `tools=no target=release_debug`.
  * Defines: `DEBUG_ENABLED`, `-O2`/`/O2`
- `template_release`: Replaces `tools=no target=release`.
  * Defines: `-O3`/`/O2`
New `dev_build` option
======================
The previous `target=debug` is now replaced by a separate `dev_build=yes`
option, which can be used in combination with either of the three targets,
and changes the following:
- `dev_build`: Defines `DEV_ENABLED`, disables optimization (`-O0`/`/0d`),
  enables generating debug symbols, does not define `NDEBUG` so `assert()`
  works in thirdparty libraries, adds a `.dev` suffix to the binary name.
Note: Unlike previously, `dev_build` defaults to off so that users who
compile Godot from source get an optimized and small build by default.
Engine contributors should now set `dev_build=yes` in their build scripts or
IDE configuration manually.
Changed binary names
====================
The name of generated binaries and object files are changed too, to follow
this format:
`godot.<platform>.<target>[.dev][.double].<arch>[.<extra_suffix>][.<ext>]`
For example:
- `godot.linuxbsd.editor.dev.arm64`
- `godot.windows.template_release.double.x86_64.mono.exe`
Be sure to update your links/scripts/IDE config accordingly.
More flexible `optimize` and `debug_symbols` options
====================================================
The optimization level and whether to generate debug symbols can be further
specified with the `optimize` and `debug_symbols` options. So the default
values listed above for the various `target` and `dev_build` combinations
are indicative and can be replaced when compiling, e.g.:
`scons p=linuxbsd target=template_debug dev_build=yes optimize=debug`
will make a "debug" export template with dev-only code enabled, `-Og`
optimization level for GCC/Clang, and debug symbols. Perfect for debugging
complex crashes at runtime in an exported project.
											
										 
											2022-09-22 08:28:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if env.debug_features: | 
					
						
							|  |  |  |         # Retain function names for backtraces at the cost of file size. | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=["--profiling-funcs"]) | 
					
						
							|  |  |  |     else: | 
					
						
							| 
									
										
										
										
											2020-12-07 18:50:27 +01:00
										 |  |  |         env["use_assertions"] = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if env["use_assertions"]: | 
					
						
							| 
									
										
										
										
											2024-06-13 23:40:45 +02:00
										 |  |  |         env.Append(LINKFLAGS=["-sASSERTIONS=1"]) | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-14 13:02:40 +02:00
										 |  |  |     if env.editor_build and env["initial_memory"] < 64: | 
					
						
							| 
									
										
										
										
											2024-06-22 09:42:30 -05:00
										 |  |  |         print_info("Forcing `initial_memory=64` as it is required for the web editor.") | 
					
						
							| 
									
										
										
										
											2023-08-14 13:02:40 +02:00
										 |  |  |         env["initial_memory"] = 64 | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-13 23:40:45 +02:00
										 |  |  |     env.Append(LINKFLAGS=["-sINITIAL_MEMORY=%sMB" % env["initial_memory"]]) | 
					
						
							| 
									
										
										
										
											2020-12-07 18:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  |     ## Copy env variables. | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     env["ENV"] = os.environ | 
					
						
							| 
									
										
										
										
											2018-03-28 06:10:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-10 10:27:19 -04:00
										 |  |  |     # This makes `wasm-ld` treat all warnings as errors. | 
					
						
							|  |  |  |     if env["werror"]: | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=["-Wl,--fatal-warnings"]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  |     # LTO | 
					
						
							| 
									
										
										
										
											2022-09-13 17:01:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 12:29:19 +02:00
										 |  |  |     if env["lto"] == "auto":  # Enable LTO for production. | 
					
						
							|  |  |  |         env["lto"] = "thin" | 
					
						
							| 
									
										
										
										
											2022-09-13 17:01:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-21 15:15:54 +02:00
										 |  |  |     if env["lto"] != "none": | 
					
						
							|  |  |  |         if env["lto"] == "thin": | 
					
						
							|  |  |  |             env.Append(CCFLAGS=["-flto=thin"]) | 
					
						
							|  |  |  |             env.Append(LINKFLAGS=["-flto=thin"]) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             env.Append(CCFLAGS=["-flto"]) | 
					
						
							|  |  |  |             env.Append(LINKFLAGS=["-flto"]) | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-07 18:50:27 +01:00
										 |  |  |     # Sanitizers | 
					
						
							|  |  |  |     if env["use_ubsan"]: | 
					
						
							|  |  |  |         env.Append(CCFLAGS=["-fsanitize=undefined"]) | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=["-fsanitize=undefined"]) | 
					
						
							|  |  |  |     if env["use_asan"]: | 
					
						
							|  |  |  |         env.Append(CCFLAGS=["-fsanitize=address"]) | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=["-fsanitize=address"]) | 
					
						
							|  |  |  |     if env["use_lsan"]: | 
					
						
							|  |  |  |         env.Append(CCFLAGS=["-fsanitize=leak"]) | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=["-fsanitize=leak"]) | 
					
						
							|  |  |  |     if env["use_safe_heap"]: | 
					
						
							| 
									
										
										
										
											2024-06-13 23:40:45 +02:00
										 |  |  |         env.Append(LINKFLAGS=["-sSAFE_HEAP=1"]) | 
					
						
							| 
									
										
										
										
											2020-12-07 18:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  |     # Closure compiler | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     if env["use_closure_compiler"]: | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  |         # For emscripten support code. | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |         env.Append(LINKFLAGS=["--closure", "1"]) | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  |         # Register builder for our Engine files | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |         jscc = env.Builder(generator=run_closure_compiler, suffix=".cc.js", src_suffix=".js") | 
					
						
							|  |  |  |         env.Append(BUILDERS={"BuildJS": jscc}) | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-10 12:19:35 +01:00
										 |  |  |     # Add helper method for adding libraries, externs, pre-js. | 
					
						
							|  |  |  |     env["JS_LIBS"] = [] | 
					
						
							|  |  |  |     env["JS_PRE"] = [] | 
					
						
							|  |  |  |     env["JS_EXTERNS"] = [] | 
					
						
							| 
									
										
										
										
											2020-10-23 18:33:20 +02:00
										 |  |  |     env.AddMethod(add_js_libraries, "AddJSLibraries") | 
					
						
							| 
									
										
										
										
											2020-09-26 17:15:21 -05:00
										 |  |  |     env.AddMethod(add_js_pre, "AddJSPre") | 
					
						
							|  |  |  |     env.AddMethod(add_js_externs, "AddJSExterns") | 
					
						
							| 
									
										
										
										
											2020-10-23 18:33:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  |     # Add method that joins/compiles our Engine files. | 
					
						
							|  |  |  |     env.AddMethod(create_engine_file, "CreateEngineFile") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-01 13:39:09 -05:00
										 |  |  |     # Add method for getting the final zip path | 
					
						
							|  |  |  |     env.AddMethod(get_template_zip_path, "GetTemplateZipPath") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-08 15:39:14 +01:00
										 |  |  |     # Add method for creating the final zip file | 
					
						
							|  |  |  |     env.AddMethod(create_template_zip, "CreateTemplateZip") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     env["CC"] = "emcc" | 
					
						
							|  |  |  |     env["CXX"] = "em++" | 
					
						
							| 
									
										
										
										
											2015-03-20 07:47:06 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     env["AR"] = "emar" | 
					
						
							|  |  |  |     env["RANLIB"] = "emranlib" | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Use TempFileMunge since some AR invocations are too long for cmd.exe. | 
					
						
							|  |  |  |     # Use POSIX-style paths, required with TempFileMunge. | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     env["ARCOM_POSIX"] = env["ARCOM"].replace("$TARGET", "$TARGET.posix").replace("$SOURCES", "$SOURCES.posix") | 
					
						
							| 
									
										
										
										
											2024-05-16 12:56:27 -05:00
										 |  |  |     env["ARCOM"] = "${TEMPFILE('$ARCOM_POSIX','$ARCOMSTR')}" | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-29 15:56:28 +02:00
										 |  |  |     # All intermediate files are just object files. | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     env["OBJPREFIX"] = "" | 
					
						
							| 
									
										
										
										
											2022-08-29 15:56:28 +02:00
										 |  |  |     env["OBJSUFFIX"] = ".o" | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     env["PROGPREFIX"] = "" | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  |     # Program() output consists of multiple files, so specify suffixes manually at builder. | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     env["PROGSUFFIX"] = "" | 
					
						
							|  |  |  |     env["LIBPREFIX"] = "lib" | 
					
						
							| 
									
										
										
										
											2021-04-29 16:46:36 +02:00
										 |  |  |     env["LIBSUFFIX"] = ".a" | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     env["LIBPREFIXES"] = ["$LIBPREFIX"] | 
					
						
							|  |  |  |     env["LIBSUFFIXES"] = ["$LIBSUFFIX"] | 
					
						
							| 
									
										
										
										
											2015-03-20 07:47:06 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-11 10:48:35 -05:00
										 |  |  |     # Get version info for checks below. | 
					
						
							|  |  |  |     cc_version = get_compiler_version(env) | 
					
						
							|  |  |  |     cc_semver = (cc_version["major"], cc_version["minor"], cc_version["patch"]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-05 10:17:52 -04:00
										 |  |  |     # Minimum emscripten requirements. | 
					
						
							|  |  |  |     if cc_semver < (3, 1, 62): | 
					
						
							|  |  |  |         print_error("The minimum emscripten version to build Godot is 3.1.62, detected: %s.%s.%s" % cc_semver) | 
					
						
							|  |  |  |         sys.exit(255) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-28 20:27:45 +02:00
										 |  |  |     env.Prepend(CPPPATH=["#platform/web"]) | 
					
						
							| 
									
										
										
										
											2024-11-08 12:38:16 +01:00
										 |  |  |     env.Append(CPPDEFINES=["WEB_ENABLED", "UNIX_ENABLED", "UNIX_SOCKET_UNAVAILABLE"]) | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-25 19:16:40 +02:00
										 |  |  |     if env["opengl3"]: | 
					
						
							|  |  |  |         env.AppendUnique(CPPDEFINES=["GLES3_ENABLED"]) | 
					
						
							|  |  |  |         # This setting just makes WebGL 2 APIs available, it does NOT disable WebGL 1. | 
					
						
							| 
									
										
										
										
											2024-06-13 23:40:45 +02:00
										 |  |  |         env.Append(LINKFLAGS=["-sMAX_WEBGL_VERSION=2"]) | 
					
						
							| 
									
										
										
										
											2021-10-25 19:16:40 +02:00
										 |  |  |         # Allow use to take control of swapping WebGL buffers. | 
					
						
							| 
									
										
										
										
											2024-06-13 23:40:45 +02:00
										 |  |  |         env.Append(LINKFLAGS=["-sOFFSCREEN_FRAMEBUFFER=1"]) | 
					
						
							| 
									
										
										
										
											2024-06-22 15:55:48 -05:00
										 |  |  |         # Disables the use of *glGetProcAddress() which is inefficient. | 
					
						
							|  |  |  |         # See https://emscripten.org/docs/tools_reference/settings_reference.html#gl-enable-get-proc-address | 
					
						
							| 
									
										
										
										
											2024-09-05 10:17:52 -04:00
										 |  |  |         env.Append(LINKFLAGS=["-sGL_ENABLE_GET_PROC_ADDRESS=0"]) | 
					
						
							| 
									
										
										
										
											2021-10-25 19:16:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-30 08:28:32 +02:00
										 |  |  |     if env["javascript_eval"]: | 
					
						
							|  |  |  |         env.Append(CPPDEFINES=["JAVASCRIPT_EVAL_ENABLED"]) | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-05 10:17:52 -04:00
										 |  |  |     env.Append(LINKFLAGS=["-s%s=%sKB" % ("STACK_SIZE", env["stack_size"])]) | 
					
						
							| 
									
										
										
										
											2023-03-20 18:39:07 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-01 13:39:09 -05:00
										 |  |  |     if env["threads"]: | 
					
						
							|  |  |  |         # Thread support (via SharedArrayBuffer). | 
					
						
							|  |  |  |         env.Append(CPPDEFINES=["PTHREAD_NO_RENAME"]) | 
					
						
							| 
									
										
										
										
											2024-06-13 23:40:45 +02:00
										 |  |  |         env.Append(CCFLAGS=["-sUSE_PTHREADS=1"]) | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=["-sUSE_PTHREADS=1"]) | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=["-sDEFAULT_PTHREAD_STACK_SIZE=%sKB" % env["default_pthread_stack_size"]]) | 
					
						
							| 
									
										
										
										
											2025-03-21 20:01:48 +01:00
										 |  |  |         env.Append(LINKFLAGS=["-sPTHREAD_POOL_SIZE='Module[\"emscriptenPoolSize\"]||8'"]) | 
					
						
							| 
									
										
										
										
											2024-06-13 23:40:45 +02:00
										 |  |  |         env.Append(LINKFLAGS=["-sWASM_MEM_MAX=2048MB"]) | 
					
						
							| 
									
										
										
										
											2024-07-24 19:56:48 +02:00
										 |  |  |         if not env["dlink_enabled"]: | 
					
						
							|  |  |  |             # Workaround https://github.com/emscripten-core/emscripten/issues/21844#issuecomment-2116936414. | 
					
						
							|  |  |  |             # Not needed (and potentially dangerous) when dlink_enabled=yes, since we set EXPORT_ALL=1 in that case. | 
					
						
							|  |  |  |             env.Append(LINKFLAGS=["-sEXPORTED_FUNCTIONS=['__emscripten_thread_crashed','_main']"]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-01 13:39:09 -05:00
										 |  |  |     elif env["proxy_to_pthread"]: | 
					
						
							| 
									
										
										
										
											2024-04-26 12:35:07 -05:00
										 |  |  |         print_warning('"threads=no" support requires "proxy_to_pthread=no", disabling proxy to pthread.') | 
					
						
							| 
									
										
										
										
											2023-12-01 13:39:09 -05:00
										 |  |  |         env["proxy_to_pthread"] = False | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-18 16:32:13 +02:00
										 |  |  |     if env["lto"] != "none": | 
					
						
							| 
									
										
										
										
											2024-02-04 15:24:24 -05:00
										 |  |  |         # Workaround https://github.com/emscripten-core/emscripten/issues/16836. | 
					
						
							| 
									
										
										
										
											2024-09-05 10:17:52 -04:00
										 |  |  |         env.Append(LINKFLAGS=["-Wl,-u,_emscripten_run_callback_on_thread"]) | 
					
						
							| 
									
										
										
										
											2023-09-18 16:32:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-29 15:56:28 +02:00
										 |  |  |     if env["dlink_enabled"]: | 
					
						
							| 
									
										
										
										
											2023-07-20 09:42:03 -04:00
										 |  |  |         if env["proxy_to_pthread"]: | 
					
						
							| 
									
										
										
										
											2024-04-26 12:35:07 -05:00
										 |  |  |             print_warning("GDExtension support requires proxy_to_pthread=no, disabling proxy to pthread.") | 
					
						
							| 
									
										
										
										
											2023-07-20 09:42:03 -04:00
										 |  |  |             env["proxy_to_pthread"] = False | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-13 23:40:45 +02:00
										 |  |  |         env.Append(CCFLAGS=["-sSIDE_MODULE=2"]) | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=["-sSIDE_MODULE=2"]) | 
					
						
							| 
									
										
										
										
											2023-07-12 15:56:46 +02:00
										 |  |  |         env.Append(CCFLAGS=["-fvisibility=hidden"]) | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=["-fvisibility=hidden"]) | 
					
						
							| 
									
										
										
										
											2022-08-29 15:56:28 +02:00
										 |  |  |         env.extra_suffix = ".dlink" + env.extra_suffix | 
					
						
							| 
									
										
										
										
											2020-10-24 16:02:09 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-05 10:17:52 -04:00
										 |  |  |     env.Append(LINKFLAGS=["-sWASM_BIGINT"]) | 
					
						
							| 
									
										
										
										
											2024-02-20 08:19:56 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-20 09:42:03 -04:00
										 |  |  |     # Run the main application in a web worker | 
					
						
							|  |  |  |     if env["proxy_to_pthread"]: | 
					
						
							| 
									
										
										
										
											2024-06-13 23:40:45 +02:00
										 |  |  |         env.Append(LINKFLAGS=["-sPROXY_TO_PTHREAD=1"]) | 
					
						
							| 
									
										
										
										
											2023-07-20 09:42:03 -04:00
										 |  |  |         env.Append(CPPDEFINES=["PROXY_TO_PTHREAD_ENABLED"]) | 
					
						
							| 
									
										
										
										
											2024-06-13 23:40:45 +02:00
										 |  |  |         env.Append(LINKFLAGS=["-sEXPORTED_RUNTIME_METHODS=['_emscripten_proxy_main']"]) | 
					
						
							| 
									
										
										
										
											2023-07-20 09:42:03 -04:00
										 |  |  |         # https://github.com/emscripten-core/emscripten/issues/18034#issuecomment-1277561925 | 
					
						
							| 
									
										
										
										
											2024-06-13 23:40:45 +02:00
										 |  |  |         env.Append(LINKFLAGS=["-sTEXTDECODER=0"]) | 
					
						
							| 
									
										
										
										
											2023-07-20 09:42:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  |     # Reduce code size by generating less support code (e.g. skip NodeJS support). | 
					
						
							| 
									
										
										
										
											2024-06-13 23:40:45 +02:00
										 |  |  |     env.Append(LINKFLAGS=["-sENVIRONMENT=web,worker"]) | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-24 16:02:09 +02:00
										 |  |  |     # Wrap the JavaScript support code around a closure named Godot. | 
					
						
							| 
									
										
										
										
											2024-06-13 23:40:45 +02:00
										 |  |  |     env.Append(LINKFLAGS=["-sMODULARIZE=1", "-sEXPORT_NAME='Godot'"]) | 
					
						
							| 
									
										
										
										
											2019-12-02 14:10:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-13 23:42:41 +02:00
										 |  |  |     # Force long jump mode to 'wasm' | 
					
						
							|  |  |  |     env.Append(CCFLAGS=["-sSUPPORT_LONGJMP='wasm'"]) | 
					
						
							|  |  |  |     env.Append(LINKFLAGS=["-sSUPPORT_LONGJMP='wasm'"]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  |     # Allow increasing memory buffer size during runtime. This is efficient | 
					
						
							|  |  |  |     # when using WebAssembly (in comparison to asm.js) and works well for | 
					
						
							|  |  |  |     # us since we don't know requirements at compile-time. | 
					
						
							| 
									
										
										
										
											2024-06-13 23:40:45 +02:00
										 |  |  |     env.Append(LINKFLAGS=["-sALLOW_MEMORY_GROWTH=1"]) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-24 16:02:09 +02:00
										 |  |  |     # Do not call main immediately when the support code is ready. | 
					
						
							| 
									
										
										
										
											2024-06-13 23:40:45 +02:00
										 |  |  |     env.Append(LINKFLAGS=["-sINVOKE_RUN=0"]) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 16:46:36 +02:00
										 |  |  |     # callMain for manual start, cwrap for the mono version. | 
					
						
							| 
									
										
										
										
											2024-06-13 23:40:45 +02:00
										 |  |  |     env.Append(LINKFLAGS=["-sEXPORTED_RUNTIME_METHODS=['callMain','cwrap']"]) | 
					
						
							| 
									
										
										
										
											2020-10-24 16:02:09 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-01 14:36:41 +02:00
										 |  |  |     # Add code that allow exiting runtime. | 
					
						
							| 
									
										
										
										
											2024-06-13 23:40:45 +02:00
										 |  |  |     env.Append(LINKFLAGS=["-sEXIT_RUNTIME=1"]) | 
					
						
							| 
									
										
										
										
											2022-09-08 09:44:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # This workaround creates a closure that prevents the garbage collector from freeing the WebGL context. | 
					
						
							|  |  |  |     # We also only use WebGL2, and changing context version is not widely supported anyway. | 
					
						
							| 
									
										
										
										
											2024-06-13 23:40:45 +02:00
										 |  |  |     env.Append(LINKFLAGS=["-sGL_WORKAROUND_SAFARI_GETCONTEXT_BUG=0"]) |