Add JavaScript platform support (emcc, wasm).

Includes update to `README.md` with instructions on how to build a
GDNative library for webassembly.
pull/530/head
Fabio Alessandrelli 2020-12-03 20:57:58 +01:00
parent 55c0a2ea03
commit f6899e190f
2 changed files with 43 additions and 4 deletions

View File

@ -275,9 +275,18 @@ Godot headers repository for more information.
#### HTML5 #### HTML5
GDNative isn't supported on the HTML5 platform yet. Support is being tracked on GDNative is supported on [specific exports](https://docs.godotengine.org/en/latest/tutorials/export/exporting_for_web.html#export-options) for the HTML5 platform since Godot `3.2.4`. Linking webassembly modules is currently underspecified in the standard, but [emscripten](https://emscripten.org/), which Godot uses to build the HTML5 version, implements its own linking system.
[issue #12243](https://github.com/godotengine/godot/issues/12243) in the main
Godot repository. To build GDNative libraries you wwill need a recent version of [emscripten](https://emscripten.org/).
```bash
cd SimpleLibrary
emcc -o bin/libtest.wasm -g -O3 -s SIDE_MODULE=1 src/init.cpp godot-cpp/bin/<name of the godot-cpp> -Igodot-cpp/include -Igodot-cpp/include/core -Igodot-cpp/include/gen -Igodot-cpp/godot-headers
```
You'll need to replace `<name of the godot-cpp>` with the file that was created in [**Compiling the cpp bindings library**](#compiling-the-cpp-bindings-library).
This creates the file `libtest.so` in your `SimpleLibrary/bin` directory.
### Creating `.gdnlib` and `.gdns` files ### Creating `.gdnlib` and `.gdns` files

View File

@ -86,7 +86,7 @@ opts.Add(EnumVariable(
'platform', 'platform',
'Target platform', 'Target platform',
host_platform, host_platform,
allowed_values=('linux', 'freebsd', 'osx', 'windows', 'android', 'ios'), allowed_values=('linux', 'freebsd', 'osx', 'windows', 'android', 'ios', 'javascript'),
ignorecase=2 ignorecase=2
)) ))
opts.Add(EnumVariable( opts.Add(EnumVariable(
@ -375,6 +375,34 @@ elif env['platform'] == 'android':
env.Append(CCFLAGS=['--target=' + arch_info['target'] + env['android_api_level'], '-march=' + arch_info['march'], '-fPIC'])#, '-fPIE', '-fno-addrsig', '-Oz']) env.Append(CCFLAGS=['--target=' + arch_info['target'] + env['android_api_level'], '-march=' + arch_info['march'], '-fPIC'])#, '-fPIE', '-fno-addrsig', '-Oz'])
env.Append(CCFLAGS=arch_info['ccflags']) env.Append(CCFLAGS=arch_info['ccflags'])
elif env["platform"] == "javascript":
env["ENV"] = os.environ
env["CC"] = "emcc"
env["CXX"] = "em++"
env["AR"] = "emar"
env["RANLIB"] = "emranlib"
env.Append(CPPFLAGS=["-s", "SIDE_MODULE=1"])
env.Append(LINKFLAGS=["-s", "SIDE_MODULE=1"])
env["SHOBJSUFFIX"] = ".bc"
env["SHLIBSUFFIX"] = ".wasm"
# 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"] = ""
env["OBJSUFFIX"] = ".bc"
env["PROGPREFIX"] = ""
# Program() output consists of multiple files, so specify suffixes manually at builder.
env["PROGSUFFIX"] = ""
env["LIBPREFIX"] = "lib"
env["LIBSUFFIX"] = ".bc"
env["LIBPREFIXES"] = ["$LIBPREFIX"]
env["LIBSUFFIXES"] = ["$LIBSUFFIX"]
env.Replace(SHLINKFLAGS='$LINKFLAGS')
env.Replace(SHLINKFLAGS='$LINKFLAGS')
env.Append(CPPPATH=[ env.Append(CPPPATH=[
'.', '.',
env['headers_dir'], env['headers_dir'],
@ -413,6 +441,8 @@ if env['platform'] == 'android':
arch_suffix = env['android_arch'] arch_suffix = env['android_arch']
if env['platform'] == 'ios': if env['platform'] == 'ios':
arch_suffix = env['ios_arch'] arch_suffix = env['ios_arch']
if env['platform'] == 'javascript':
arch_suffix = 'wasm'
library = env.StaticLibrary( library = env.StaticLibrary(
target='bin/' + 'libgodot-cpp.{}.{}.{}{}'.format( target='bin/' + 'libgodot-cpp.{}.{}.{}{}'.format(