| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | import os | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  | from emscripten_helpers import parse_config, run_closure_compiler, create_engine_file | 
					
						
							| 
									
										
										
										
											2016-10-30 19:05:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | def is_active(): | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  |     return True | 
					
						
							| 
									
										
										
										
											2016-04-02 20:26:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-30 19:05:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | def get_name(): | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  |     return 'JavaScript' | 
					
						
							| 
									
										
										
										
											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(): | 
					
						
							| 
									
										
										
										
											2018-03-28 06:10:11 +02:00
										 |  |  |     return 'EM_CONFIG' in os.environ or os.path.exists(os.path.expanduser('~/.emscripten')) | 
					
						
							| 
									
										
										
										
											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 get_opts(): | 
					
						
							| 
									
										
										
										
											2017-09-25 00:37:17 -04:00
										 |  |  |     from SCons.Variables import BoolVariable | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  |     return [ | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  |         # eval() can be a security concern, so it can be disabled. | 
					
						
							| 
									
										
										
										
											2017-09-25 00:37:17 -04:00
										 |  |  |         BoolVariable('javascript_eval', 'Enable JavaScript eval interface', True), | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  |         BoolVariable('threads_enabled', 'Enable WebAssembly Threads support (limited browser support)', False), | 
					
						
							|  |  |  |         BoolVariable('use_closure_compiler', 'Use closure compiler to minimize Javascript code', False), | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  |     ] | 
					
						
							| 
									
										
										
										
											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 get_flags(): | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  |     return [ | 
					
						
							| 
									
										
										
										
											2017-09-25 00:04:49 -04:00
										 |  |  |         ('tools', False), | 
					
						
							| 
									
										
										
										
											2019-11-20 08:54:52 +01:00
										 |  |  |         ('builtin_pcre2_with_jit', False), | 
					
						
							| 
									
										
										
										
											2018-02-08 22:00:55 +01:00
										 |  |  |         # Disabling the mbedtls module reduces file size. | 
					
						
							| 
									
										
										
										
											2018-01-25 09:07:07 +01:00
										 |  |  |         # The module has little use due to the limited networking functionality | 
					
						
							|  |  |  |         # in this platform. For the available networking methods, the browser | 
					
						
							|  |  |  |         # manages TLS. | 
					
						
							| 
									
										
										
										
											2018-02-08 22:00:55 +01:00
										 |  |  |         ('module_mbedtls_enabled', False), | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  |     ] | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def configure(env): | 
					
						
							| 
									
										
										
										
											2016-06-14 11:27:16 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  |     ## Build type | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  |     if env['target'] == 'release': | 
					
						
							| 
									
										
										
										
											2018-01-07 00:13:04 +01: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. | 
					
						
							|  |  |  |         env.Append(CCFLAGS=['-Os']) | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=['-Os']) | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  |     elif env['target'] == 'release_debug': | 
					
						
							|  |  |  |         env.Append(CCFLAGS=['-Os']) | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=['-Os']) | 
					
						
							|  |  |  |         env.Append(CPPDEFINES=['DEBUG_ENABLED']) | 
					
						
							|  |  |  |         # Retain function names for backtraces at the cost of file size. | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=['--profiling-funcs']) | 
					
						
							|  |  |  |     else: # 'debug' | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  |         env.Append(CPPDEFINES=['DEBUG_ENABLED']) | 
					
						
							|  |  |  |         env.Append(CCFLAGS=['-O1', '-g']) | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  |         env.Append(LINKFLAGS=['-O1', '-g']) | 
					
						
							| 
									
										
										
										
											2018-03-18 21:33:54 +01:00
										 |  |  |         env.Append(LINKFLAGS=['-s', 'ASSERTIONS=1']) | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  |     if env['tools']: | 
					
						
							|  |  |  |         if not env['threads_enabled']: | 
					
						
							|  |  |  |             raise RuntimeError("Threads must be enabled to build the editor. Please add the 'threads_enabled=yes' option") | 
					
						
							|  |  |  |         # Tools need more memory. Initial stack memory in bytes. See `src/settings.js` in emscripten repository (will be renamed to INITIAL_MEMORY). | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=['-s', 'TOTAL_MEMORY=33554432']) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         # Disable exceptions and rtti on non-tools (template) builds | 
					
						
							|  |  |  |         # These flags help keep the file size down. | 
					
						
							|  |  |  |         env.Append(CCFLAGS=['-fno-exceptions', '-fno-rtti']) | 
					
						
							|  |  |  |         # Don't use dynamic_cast, necessary with no-rtti. | 
					
						
							|  |  |  |         env.Append(CPPDEFINES=['NO_SAFE_CAST']) | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  |     ## Copy env variables. | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  |     env['ENV'] = os.environ | 
					
						
							| 
									
										
										
										
											2018-03-28 06:10:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  |     # LTO | 
					
						
							|  |  |  |     if env['use_lto']: | 
					
						
							|  |  |  |         env.Append(CCFLAGS=['-s', 'WASM_OBJECT_FILES=0']) | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=['-s', 'WASM_OBJECT_FILES=0']) | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=['--llvm-lto',  '1']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Closure compiler | 
					
						
							|  |  |  |     if env['use_closure_compiler']: | 
					
						
							|  |  |  |         # For emscripten support code. | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=['--closure', '1']) | 
					
						
							|  |  |  |         # Register builder for our Engine files | 
					
						
							|  |  |  |         jscc = env.Builder(generator=run_closure_compiler, suffix='.cc.js', src_suffix='.js') | 
					
						
							|  |  |  |         env.Append(BUILDERS = {'BuildJS' : jscc}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Add method that joins/compiles our Engine files. | 
					
						
							|  |  |  |     env.AddMethod(create_engine_file, "CreateEngineFile") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Closure compiler extern and support for ecmascript specs (const, let, etc). | 
					
						
							|  |  |  |     env['ENV']['EMCC_CLOSURE_ARGS'] = '--language_in ECMASCRIPT6' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     em_config = parse_config() | 
					
						
							|  |  |  |     env.PrependENVPath('PATH', em_config['EMCC_ROOT']) | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  |     env['CC'] = 'emcc' | 
					
						
							|  |  |  |     env['CXX'] = 'em++' | 
					
						
							|  |  |  |     env['LINK'] = 'emcc' | 
					
						
							| 
									
										
										
										
											2015-03-20 07:47:06 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-15 09:39:18 +01:00
										 |  |  |     env['AR'] = 'emar' | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  |     env['RANLIB'] = 'emranlib' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Use TempFileMunge since some AR invocations are too long for cmd.exe. | 
					
						
							|  |  |  |     # Use POSIX-style paths, required with TempFileMunge. | 
					
						
							|  |  |  |     env['ARCOM_POSIX'] = env['ARCOM'].replace( | 
					
						
							|  |  |  |         '$TARGET', '$TARGET.posix').replace( | 
					
						
							|  |  |  |         '$SOURCES', '$SOURCES.posix') | 
					
						
							|  |  |  |     env['ARCOM'] = '${TEMPFILE(ARCOM_POSIX)}' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # All intermediate files are just LLVM bitcode. | 
					
						
							|  |  |  |     env['OBJPREFIX'] = '' | 
					
						
							| 
									
										
										
										
											2017-02-20 13:36:54 +01:00
										 |  |  |     env['OBJSUFFIX'] = '.bc' | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  |     env['PROGPREFIX'] = '' | 
					
						
							|  |  |  |     # Program() output consists of multiple files, so specify suffixes manually at builder. | 
					
						
							|  |  |  |     env['PROGSUFFIX'] = '' | 
					
						
							|  |  |  |     env['LIBPREFIX'] = 'lib' | 
					
						
							| 
									
										
										
										
											2017-02-21 22:47:33 +01:00
										 |  |  |     env['LIBSUFFIX'] = '.bc' | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  |     env['LIBPREFIXES'] = ['$LIBPREFIX'] | 
					
						
							|  |  |  |     env['LIBSUFFIXES'] = ['$LIBSUFFIX'] | 
					
						
							| 
									
										
										
										
											2015-03-20 07:47:06 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-30 13:12:02 +02:00
										 |  |  |     env.Prepend(CPPPATH=['#platform/javascript']) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  |     env.Append(CPPDEFINES=['JAVASCRIPT_ENABLED', 'UNIX_ENABLED']) | 
					
						
							| 
									
										
										
										
											2016-10-30 18:44:57 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-25 00:37:17 -04:00
										 |  |  |     if env['javascript_eval']: | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  |         env.Append(CPPDEFINES=['JAVASCRIPT_EVAL_ENABLED']) | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  |     # Thread support (via SharedArrayBuffer). | 
					
						
							|  |  |  |     if env['threads_enabled']: | 
					
						
							|  |  |  |         env.Append(CPPDEFINES=['PTHREAD_NO_RENAME']) | 
					
						
							|  |  |  |         env.Append(CCFLAGS=['-s', 'USE_PTHREADS=1']) | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=['-s', 'USE_PTHREADS=1']) | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=['-s', 'PTHREAD_POOL_SIZE=4']) | 
					
						
							|  |  |  |         env.Append(LINKFLAGS=['-s', 'WASM_MEM_MAX=2048MB']) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         env.Append(CPPDEFINES=['NO_THREADS']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Reduce code size by generating less support code (e.g. skip NodeJS support). | 
					
						
							|  |  |  |     env.Append(LINKFLAGS=['-s', 'ENVIRONMENT=web,worker']) | 
					
						
							| 
									
										
										
										
											2017-06-30 19:21:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-19 09:44:04 +01:00
										 |  |  |     # We use IDBFS in javascript_main.cpp. Since Emscripten 1.39.1 it needs to | 
					
						
							|  |  |  |     # be linked explicitly. | 
					
						
							|  |  |  |     env.Append(LIBS=['idbfs.js']) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-18 05:50:26 +01:00
										 |  |  |     env.Append(LINKFLAGS=['-s', 'BINARYEN=1']) | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  |     env.Append(LINKFLAGS=['-s', 'MODULARIZE=1', '-s', 'EXPORT_NAME="Godot"']) | 
					
						
							| 
									
										
										
										
											2019-12-02 14:10:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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. | 
					
						
							| 
									
										
										
										
											2017-11-18 05:50:26 +01:00
										 |  |  |     env.Append(LINKFLAGS=['-s', 'ALLOW_MEMORY_GROWTH=1']) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # This setting just makes WebGL 2 APIs available, it does NOT disable WebGL 1. | 
					
						
							| 
									
										
										
										
											2017-11-19 15:30:09 +01:00
										 |  |  |     env.Append(LINKFLAGS=['-s', 'USE_WEBGL2=1']) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-19 15:30:09 +01:00
										 |  |  |     env.Append(LINKFLAGS=['-s', 'INVOKE_RUN=0']) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:51:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-11 11:55:28 +01:00
										 |  |  |     # callMain for manual start, FS for preloading. | 
					
						
							|  |  |  |     env.Append(LINKFLAGS=['-s', 'EXTRA_EXPORTED_RUNTIME_METHODS=["callMain", "FS"]']) |