diff options
author | George Marques <george@gmarqu.es> | 2021-03-22 09:57:45 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-22 09:57:45 -0300 |
commit | d7c55b1ab2606253e94db5ed3caf75f90a47d03c (patch) | |
tree | 7825dd3beeb2fa797b8c2cc8aebcfd53e379f6bb | |
parent | 6e4a13beec96433d38c9c9dc90a8d0dfce29b70b (diff) | |
parent | f6899e190f26de8365a1f477957635d211c88e87 (diff) | |
download | redot-cpp-d7c55b1ab2606253e94db5ed3caf75f90a47d03c.tar.gz |
Merge pull request #530 from Faless/js/scons_and_readme
Add JavaScript platform support (emcc, wasm).
-rw-r--r-- | README.md | 15 | ||||
-rw-r--r-- | SConstruct | 32 |
2 files changed, 43 insertions, 4 deletions
@@ -275,9 +275,18 @@ Godot headers repository for more information. #### HTML5 -GDNative isn't supported on the HTML5 platform yet. Support is being tracked on -[issue #12243](https://github.com/godotengine/godot/issues/12243) in the main -Godot repository. +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. + +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 @@ -86,7 +86,7 @@ opts.Add(EnumVariable( 'platform', 'Target platform', host_platform, - allowed_values=('linux', 'freebsd', 'osx', 'windows', 'android', 'ios'), + allowed_values=('linux', 'freebsd', 'osx', 'windows', 'android', 'ios', 'javascript'), ignorecase=2 )) 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=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['headers_dir'], @@ -413,6 +441,8 @@ if env['platform'] == 'android': arch_suffix = env['android_arch'] if env['platform'] == 'ios': arch_suffix = env['ios_arch'] +if env['platform'] == 'javascript': + arch_suffix = 'wasm' library = env.StaticLibrary( target='bin/' + 'libgodot-cpp.{}.{}.{}{}'.format( |