@ -4,7 +4,12 @@ from SCons.Util import WhereIs
def run_closure_compiler ( target , source , env , for_signature ) :
closure_bin = os . path . join ( os . path . dirname ( WhereIs ( " emcc " ) ) , " node_modules " , " .bin " , " google-closure-compiler " )
closure_bin = os . path . join (
os . path . dirname ( WhereIs ( " emcc " ) ) ,
" node_modules " ,
" .bin " ,
" google-closure-compiler " ,
)
cmd = [ WhereIs ( " node " ) , closure_bin ]
cmd . extend ( [ " --compilation_level " , " ADVANCED_OPTIMIZATIONS " ] )
for f in env [ " JSEXTERNS " ] :
@ -31,27 +36,29 @@ def get_build_version():
return v
def create_engine_file ( env , target , source , externs ):
def create_engine_file ( env , target , source , externs , threads_enabled ):
if env [ " use_closure_compiler " ] :
return env . BuildJS ( target , source , JSEXTERNS = externs )
return env . Textfile ( target , [ env . File ( s ) for s in source ] )
subst_dict = { " ___GODOT_THREADS_ENABLED " : " true " if threads_enabled else " false " }
return env . Substfile ( target = target , source = [ env . File ( s ) for s in source ] , SUBST_DICT = subst_dict )
def create_template_zip ( env , js , wasm , worker , side ) :
binary_name = " godot.editor " if env . editor_build else " godot "
zip_dir = env . Dir ( " #bin/.web_zip " )
zip_dir = env . Dir ( env . GetTemplateZipPath ( ) )
in_files = [
js ,
wasm ,
worker ,
" #platform/web/js/libs/audio.worklet.js " ,
]
out_files = [
zip_dir . File ( binary_name + " .js " ) ,
zip_dir . File ( binary_name + " .wasm " ) ,
zip_dir . File ( binary_name + " .worker.js " ) ,
zip_dir . File ( binary_name + " .audio.worklet.js " ) ,
]
if env [ " threads " ] :
in_files . append ( worker )
out_files . append ( zip_dir . File ( binary_name + " .worker.js " ) )
# Dynamic linking (extensions) specific.
if env [ " dlink_enabled " ] :
in_files . append ( side ) # Side wasm (contains the actual Godot code).
@ -65,18 +72,20 @@ def create_template_zip(env, js, wasm, worker, side):
" godot.editor.html " ,
" offline.html " ,
" godot.editor.js " ,
" godot.editor.worker.js " ,
" godot.editor.audio.worklet.js " ,
" logo.svg " ,
" favicon.png " ,
]
if env [ " threads " ] :
cache . append ( " godot.editor.worker.js " )
opt_cache = [ " godot.editor.wasm " ]
subst_dict = {
" @GODOT_VERSION@ " : get_build_version ( ) ,
" @GODOT_NAME@ " : " GodotEngine " ,
" @GODOT_CACHE@ " : json . dumps ( cache ) ,
" @GODOT_OPT_CACHE@ " : json . dumps ( opt_cache ) ,
" @GODOT_OFFLINE_PAGE@ " : " offline.html " ,
" ___GODOT_VERSION___ " : get_build_version ( ) ,
" ___GODOT_NAME___ " : " GodotEngine " ,
" ___GODOT_CACHE___ " : json . dumps ( cache ) ,
" ___GODOT_OPT_CACHE___ " : json . dumps ( opt_cache ) ,
" ___GODOT_OFFLINE_PAGE___ " : " offline.html " ,
" ___GODOT_THREADS_ENABLED___ " : " true " if env [ " threads " ] else " false " ,
}
html = env . Substfile ( target = " #bin/godot$ {PROGSUFFIX} .html " , source = html , SUBST_DICT = subst_dict )
in_files . append ( html )
@ -88,7 +97,9 @@ def create_template_zip(env, js, wasm, worker, side):
out_files . append ( zip_dir . File ( " favicon.png " ) )
# PWA
service_worker = env . Substfile (
target = " #bin/godot$ {PROGSUFFIX} .service.worker.js " , source = service_worker , SUBST_DICT = subst_dict
target = " #bin/godot$ {PROGSUFFIX} .service.worker.js " ,
source = service_worker ,
SUBST_DICT = subst_dict ,
)
in_files . append ( service_worker )
out_files . append ( zip_dir . File ( " service.worker.js " ) )
@ -115,6 +126,10 @@ def create_template_zip(env, js, wasm, worker, side):
)
def get_template_zip_path ( env ) :
return " #bin/.web_zip "
def add_js_libraries ( env , libraries ) :
env . Append ( JS_LIBS = env . File ( libraries ) )