mirror of
https://github.com/godotengine/godot.git
synced 2025-11-01 14:11:15 +00:00
The "webgl/webgl2.h" include provides that function, but it's not
available in emscripten versions < 2.0.17 .
Since we need to support emscripten 1.39.9 (mono builds), this commit
adds a JS function in library_godot_display.js as a compatibility layer
for it, and implement glGetBufferSubData by funneling the call to that
function (so we don't have name collisions JS-side with recent emcc).
All those hacks are now moved to the platform directory instead of being
ifdefs inside the drivers implementations.
(cherry picked from commit bbfe054175)
91 lines
3.4 KiB
Python
91 lines
3.4 KiB
Python
#!/usr/bin/env python
|
|
|
|
Import("env")
|
|
|
|
javascript_files = [
|
|
"audio_driver_javascript.cpp",
|
|
"godot_webgl2.cpp",
|
|
"http_client_javascript.cpp",
|
|
"javascript_singleton.cpp",
|
|
"javascript_main.cpp",
|
|
"os_javascript.cpp",
|
|
"api/javascript_tools_editor_plugin.cpp",
|
|
]
|
|
|
|
sys_env = env.Clone()
|
|
sys_env.AddJSLibraries(
|
|
[
|
|
"js/libs/library_godot_audio.js",
|
|
"js/libs/library_godot_display.js",
|
|
"js/libs/library_godot_fetch.js",
|
|
"js/libs/library_godot_os.js",
|
|
"js/libs/library_godot_runtime.js",
|
|
"js/libs/library_godot_input.js",
|
|
]
|
|
)
|
|
|
|
if env["javascript_eval"]:
|
|
sys_env.AddJSLibraries(["js/libs/library_godot_javascript_singleton.js"])
|
|
|
|
for lib in sys_env["JS_LIBS"]:
|
|
sys_env.Append(LINKFLAGS=["--js-library", lib.abspath])
|
|
for js in env["JS_PRE"]:
|
|
sys_env.Append(LINKFLAGS=["--pre-js", js.abspath])
|
|
for ext in env["JS_EXTERNS"]:
|
|
sys_env["ENV"]["EMCC_CLOSURE_ARGS"] += " --externs " + ext.abspath
|
|
|
|
build = []
|
|
if env["gdnative_enabled"]:
|
|
build_targets = ["#bin/godot${PROGSUFFIX}.js", "#bin/godot${PROGSUFFIX}.wasm"]
|
|
# Reset libraries. The main runtime will only link emscripten libraries, not godot ones.
|
|
sys_env["LIBS"] = []
|
|
# We use IDBFS. Since Emscripten 1.39.1 it needs to be linked explicitly.
|
|
sys_env.Append(LIBS=["idbfs.js"])
|
|
# Configure it as a main module (dynamic linking support).
|
|
sys_env.Append(CCFLAGS=["-s", "MAIN_MODULE=1"])
|
|
sys_env.Append(LINKFLAGS=["-s", "MAIN_MODULE=1"])
|
|
sys_env.Append(CCFLAGS=["-s", "EXPORT_ALL=1"])
|
|
sys_env.Append(LINKFLAGS=["-s", "EXPORT_ALL=1"])
|
|
sys_env.Append(LINKFLAGS=["-s", "WARN_ON_UNDEFINED_SYMBOLS=0"])
|
|
# Force exporting the standard library (printf, malloc, etc.)
|
|
sys_env["ENV"]["EMCC_FORCE_STDLIBS"] = "libc,libc++,libc++abi"
|
|
# The main emscripten runtime, with exported standard libraries.
|
|
sys = sys_env.Program(build_targets, ["javascript_runtime.cpp"])
|
|
|
|
# The side library, containing all Godot code.
|
|
wasm_env = env.Clone()
|
|
wasm_env.Append(CPPDEFINES=["WASM_GDNATIVE"]) # So that OS knows it can run GDNative libraries.
|
|
wasm_env.Append(CCFLAGS=["-s", "SIDE_MODULE=2"])
|
|
wasm_env.Append(LINKFLAGS=["-s", "SIDE_MODULE=2"])
|
|
wasm = wasm_env.add_program("#bin/godot.side${PROGSUFFIX}.wasm", javascript_files)
|
|
build = [sys[0], sys[1], wasm[0]]
|
|
else:
|
|
build_targets = ["#bin/godot${PROGSUFFIX}.js", "#bin/godot${PROGSUFFIX}.wasm"]
|
|
if env["threads_enabled"]:
|
|
build_targets.append("#bin/godot${PROGSUFFIX}.worker.js")
|
|
# We use IDBFS. Since Emscripten 1.39.1 it needs to be linked explicitly.
|
|
sys_env.Append(LIBS=["idbfs.js"])
|
|
build = sys_env.Program(build_targets, javascript_files + ["javascript_runtime.cpp"])
|
|
|
|
sys_env.Depends(build[0], sys_env["JS_LIBS"])
|
|
sys_env.Depends(build[0], sys_env["JS_PRE"])
|
|
sys_env.Depends(build[0], sys_env["JS_EXTERNS"])
|
|
|
|
engine = [
|
|
"js/engine/preloader.js",
|
|
"js/engine/config.js",
|
|
"js/engine/engine.js",
|
|
]
|
|
externs = [env.File("#platform/javascript/js/engine/engine.externs.js")]
|
|
js_engine = env.CreateEngineFile("#bin/godot${PROGSUFFIX}.engine.js", engine, externs)
|
|
env.Depends(js_engine, externs)
|
|
|
|
wrap_list = [
|
|
build[0],
|
|
js_engine,
|
|
]
|
|
js_wrapped = env.Textfile("#bin/godot", [env.File(f) for f in wrap_list], TEXTFILESUFFIX="${PROGSUFFIX}.wrapped.js")
|
|
|
|
# Extra will be the thread worker, or the GDNative side, or None
|
|
extra = build[2] if len(build) > 2 else None
|
|
env.CreateTemplateZip(js_wrapped, build[1], extra)
|