mirror of
				https://github.com/godotengine/godot.git
				synced 2025-10-31 13:41:03 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			123 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import os
 | |
| import string
 | |
| import sys
 | |
| 
 | |
| 
 | |
| def is_active():
 | |
|     return True
 | |
| 
 | |
| 
 | |
| def get_name():
 | |
|     return "JavaScript"
 | |
| 
 | |
| 
 | |
| def can_build():
 | |
| 
 | |
|     return ("EMSCRIPTEN_ROOT" in os.environ or "EMSCRIPTEN" in os.environ)
 | |
| 
 | |
| 
 | |
| def get_opts():
 | |
|     from SCons.Variables import BoolVariable
 | |
|     return [
 | |
|         BoolVariable('wasm', 'Compile to WebAssembly', False),
 | |
|         BoolVariable('javascript_eval', 'Enable JavaScript eval interface', True),
 | |
|     ]
 | |
| 
 | |
| 
 | |
| def get_flags():
 | |
| 
 | |
|     return [
 | |
|         ('tools', False),
 | |
|         ('module_theora_enabled', False),
 | |
|     ]
 | |
| 
 | |
| 
 | |
| def create(env):
 | |
| 
 | |
|     # remove Windows' .exe suffix
 | |
|     return env.Clone(tools=['textfile', 'zip'], PROGSUFFIX='')
 | |
| 
 | |
| 
 | |
| def escape_sources_backslashes(target, source, env, for_signature):
 | |
|     return [path.replace('\\','\\\\') for path in env.GetBuildPath(source)]
 | |
| 
 | |
| def escape_target_backslashes(target, source, env, for_signature):
 | |
|     return env.GetBuildPath(target[0]).replace('\\','\\\\')
 | |
| 
 | |
| 
 | |
| def configure(env):
 | |
| 
 | |
|     ## Build type
 | |
| 
 | |
|     if (env["target"] == "release"):
 | |
|         env.Append(CCFLAGS=['-O3'])
 | |
|         env.Append(LINKFLAGS=['-O3'])
 | |
| 
 | |
|     elif (env["target"] == "release_debug"):
 | |
|         env.Append(CCFLAGS=['-O2', '-DDEBUG_ENABLED'])
 | |
|         env.Append(LINKFLAGS=['-O2', '-s', 'ASSERTIONS=1'])
 | |
|         # retain function names at the cost of file size, for backtraces and profiling
 | |
|         env.Append(LINKFLAGS=['--profiling-funcs'])
 | |
| 
 | |
|     elif (env["target"] == "debug"):
 | |
|         env.Append(CCFLAGS=['-O1', '-D_DEBUG', '-g', '-DDEBUG_ENABLED'])
 | |
|         env.Append(LINKFLAGS=['-O1', '-g'])
 | |
| 
 | |
|     ## Compiler configuration
 | |
| 
 | |
|     env['ENV'] = os.environ
 | |
|     if ("EMSCRIPTEN_ROOT" in os.environ):
 | |
|         env.PrependENVPath('PATH', os.environ['EMSCRIPTEN_ROOT'])
 | |
|     elif ("EMSCRIPTEN" in os.environ):
 | |
|         env.PrependENVPath('PATH', os.environ['EMSCRIPTEN'])
 | |
|     env['CC']      = 'emcc'
 | |
|     env['CXX']     = 'em++'
 | |
|     env['LINK']    = 'emcc'
 | |
|     env['RANLIB']  = 'emranlib'
 | |
|     # Emscripten's ar has issues with duplicate file names, so use cc
 | |
|     env['AR']      = 'emcc'
 | |
|     env['ARFLAGS'] = '-o'
 | |
| 
 | |
|     if (os.name == 'nt'):
 | |
|         # use TempFileMunge on Windows since some commands get too long for
 | |
|         # cmd.exe even with spawn_fix
 | |
|         # need to escape backslashes for this
 | |
|         env['ESCAPED_SOURCES'] = escape_sources_backslashes
 | |
|         env['ESCAPED_TARGET'] = escape_target_backslashes
 | |
|         env['ARCOM'] = '${TEMPFILE("%s")}' % env['ARCOM'].replace('$SOURCES', '$ESCAPED_SOURCES').replace('$TARGET', '$ESCAPED_TARGET')
 | |
| 
 | |
|     env['OBJSUFFIX'] = '.bc'
 | |
|     env['LIBSUFFIX'] = '.bc'
 | |
| 
 | |
|     ## Compile flags
 | |
| 
 | |
|     env.Append(CPPPATH=['#platform/javascript'])
 | |
|     env.Append(CPPFLAGS=['-DJAVASCRIPT_ENABLED', '-DUNIX_ENABLED', '-DPTHREAD_NO_RENAME', '-DTYPED_METHOD_BIND', '-DNO_THREADS'])
 | |
|     env.Append(CPPFLAGS=['-DGLES3_ENABLED'])
 | |
| 
 | |
|     # These flags help keep the file size down
 | |
|     env.Append(CPPFLAGS=["-fno-exceptions", '-DNO_SAFE_CAST', '-fno-rtti'])
 | |
| 
 | |
|     if env['javascript_eval']:
 | |
|         env.Append(CPPFLAGS=['-DJAVASCRIPT_EVAL_ENABLED'])
 | |
| 
 | |
|     ## Link flags
 | |
| 
 | |
|     env.Append(LINKFLAGS=['-s', 'EXTRA_EXPORTED_RUNTIME_METHODS="[\'FS\']"'])
 | |
|     env.Append(LINKFLAGS=['-s', 'USE_WEBGL2=1'])
 | |
| 
 | |
|     if env['wasm']:
 | |
|         env.Append(LINKFLAGS=['-s', 'BINARYEN=1'])
 | |
|         # In contrast to asm.js, enabling memory growth on WebAssembly has no
 | |
|         # major performance impact, and causes only a negligible increase in
 | |
|         # memory size.
 | |
|         env.Append(LINKFLAGS=['-s', 'ALLOW_MEMORY_GROWTH=1'])
 | |
|         env.extra_suffix = '.webassembly' + env.extra_suffix
 | |
|     else:
 | |
|         env.Append(LINKFLAGS=['-s', 'ASM_JS=1'])
 | |
|         env.Append(LINKFLAGS=['--separate-asm'])
 | |
|         env.Append(LINKFLAGS=['--memory-init-file', '1'])
 | |
| 
 | |
|     # TODO: Move that to opus module's config
 | |
|     if 'module_opus_enabled' in env and env['module_opus_enabled']:
 | |
|         env.opus_fixed_point = "yes"
 | 
