Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/platform/web/emscripten_helpers.py
20936 views
1
import json
2
import os
3
4
from SCons.Util import WhereIs
5
6
from platform_methods import get_build_version
7
8
9
def run_closure_compiler(target, source, env, for_signature):
10
closure_bin = os.path.join(
11
os.path.dirname(WhereIs("emcc")),
12
"node_modules",
13
".bin",
14
"google-closure-compiler",
15
)
16
cmd = [WhereIs("node"), closure_bin]
17
cmd.extend(["--compilation_level", "ADVANCED_OPTIMIZATIONS"])
18
for f in env["JSEXTERNS"]:
19
cmd.extend(["--externs", f.get_abspath()])
20
for f in source:
21
cmd.extend(["--js", f.get_abspath()])
22
cmd.extend(["--js_output_file", target[0].get_abspath()])
23
return " ".join(cmd)
24
25
26
def create_engine_file(env, target, source, externs, threads_enabled):
27
if env["use_closure_compiler"]:
28
return env.BuildJS(target, source, JSEXTERNS=externs)
29
subst_dict = {"___GODOT_THREADS_ENABLED": "true" if threads_enabled else "false"}
30
return env.Substfile(target=target, source=[env.File(s) for s in source], SUBST_DICT=subst_dict)
31
32
33
def create_template_zip(env, js, wasm, side):
34
binary_name = "godot.editor" if env.editor_build else "godot"
35
zip_dir = env.Dir(env.GetTemplateZipPath())
36
in_files = [
37
js,
38
wasm,
39
"#platform/web/js/libs/audio.worklet.js",
40
"#platform/web/js/libs/audio.position.worklet.js",
41
]
42
out_files = [
43
zip_dir.File(binary_name + ".js"),
44
zip_dir.File(binary_name + ".wasm"),
45
zip_dir.File(binary_name + ".audio.worklet.js"),
46
zip_dir.File(binary_name + ".audio.position.worklet.js"),
47
]
48
# Dynamic linking (extensions) specific.
49
if env["dlink_enabled"]:
50
in_files.append(side) # Side wasm (contains the actual Godot code).
51
out_files.append(zip_dir.File(binary_name + ".side.wasm"))
52
53
service_worker = "#misc/dist/html/service-worker.js"
54
if env.editor_build:
55
# HTML
56
html = "#misc/dist/html/editor.html"
57
cache = [
58
"godot.editor.html",
59
"offline.html",
60
"godot.editor.js",
61
"godot.editor.audio.worklet.js",
62
"godot.editor.audio.position.worklet.js",
63
"logo.svg",
64
"favicon.png",
65
"inter-regular.woff2",
66
"inter-bold.woff2",
67
]
68
opt_cache = ["godot.editor.wasm"]
69
subst_dict = {
70
"___GODOT_VERSION___": get_build_version(False),
71
"___GODOT_NAME___": "GodotEngine",
72
"___GODOT_CACHE___": json.dumps(cache),
73
"___GODOT_OPT_CACHE___": json.dumps(opt_cache),
74
"___GODOT_OFFLINE_PAGE___": "offline.html",
75
"___GODOT_THREADS_ENABLED___": "true" if env["threads"] else "false",
76
"___GODOT_ENSURE_CROSSORIGIN_ISOLATION_HEADERS___": "true",
77
}
78
html = env.Substfile(target="#bin/godot${PROGSUFFIX}.html", source=html, SUBST_DICT=subst_dict)
79
in_files.append(html)
80
out_files.append(zip_dir.File(binary_name + ".html"))
81
# And logo/favicon
82
in_files.append("#misc/dist/html/logo.svg")
83
out_files.append(zip_dir.File("logo.svg"))
84
in_files.append("#icon.png")
85
out_files.append(zip_dir.File("favicon.png"))
86
# PWA
87
service_worker = env.Substfile(
88
target="#bin/godot${PROGSUFFIX}.service.worker.js",
89
source=service_worker,
90
SUBST_DICT=subst_dict,
91
)
92
in_files.append(service_worker)
93
out_files.append(zip_dir.File("service.worker.js"))
94
in_files.append("#misc/dist/html/manifest.json")
95
out_files.append(zip_dir.File("manifest.json"))
96
in_files.append("#misc/dist/html/offline.html")
97
out_files.append(zip_dir.File("offline.html"))
98
in_files.append("#thirdparty/fonts/Inter_Regular.woff2")
99
out_files.append(zip_dir.File("inter-regular.woff2"))
100
in_files.append("#thirdparty/fonts/Inter_Bold.woff2")
101
out_files.append(zip_dir.File("inter-bold.woff2"))
102
else:
103
# HTML
104
in_files.append("#misc/dist/html/full-size.html")
105
out_files.append(zip_dir.File(binary_name + ".html"))
106
in_files.append(service_worker)
107
out_files.append(zip_dir.File(binary_name + ".service.worker.js"))
108
in_files.append("#misc/dist/html/offline-export.html")
109
out_files.append(zip_dir.File("godot.offline.html"))
110
111
zip_files = env.NoCache(env.InstallAs(out_files, in_files))
112
env.NoCache(
113
env.Zip(
114
"#bin/godot",
115
zip_files,
116
ZIPROOT=zip_dir,
117
ZIPSUFFIX="${PROGSUFFIX}${ZIPSUFFIX}",
118
)
119
)
120
121
122
def get_template_zip_path(env):
123
return "#bin/.web_zip"
124
125
126
def add_js_libraries(env, libraries):
127
env.Append(JS_LIBS=env.File(libraries))
128
129
130
def add_js_pre(env, js_pre):
131
env.Append(JS_PRE=env.File(js_pre))
132
133
134
def add_js_post(env, js_post):
135
env.Append(JS_POST=env.File(js_post))
136
137
138
def add_js_externs(env, externs):
139
env.Append(JS_EXTERNS=env.File(externs))
140
141