godot-docs/reference/compiling_for_web.rst

237 lines
10 KiB
ReStructuredText

.. _doc_compiling_for_web:
Compiling for the Web
========================
.. highlight:: shell
Requirements
------------
To compile export templates for the Web, the following is required:
- `Emscripten SDK <http://emscripten.org/>`__ (Install in a path without
spaces, i.e. not on "Program Files")
- `Python 2.7+ <https://www.python.org/>`__ (3.0 is
untested as of now)
- `SCons <http://www.scons.org>`__ build system
Compiling
---------
Start a terminal and set the environment variable ``EMSCRIPTEN_ROOT`` to the
installation directory of Emscripten::
export EMSCRIPTEN_ROOT=~/emsdk/emscripten/master
If you are on Windows, start a regular prompt or the Emscripten Command Prompt.
Do **not** use the Developer Command Prompt nor any of the ones that come with
Visual Studio. You can set the environment variable in the system settings or
in the prompt itself::
set EMSCRIPTEN_ROOT=C:\emsdk\emscripten\master
Now go to the root directory of the engine source code and instruct SCons to
compile for JavaScript. Specify ``target`` as either ``release`` for a release
build or ``release_debug`` for a debug build::
scons platform=javascript tools=no target=release
scons platform=javascript tools=no target=release_debug
The engine will now be compiled to JavaScript by Emscripten. If all goes well,
the resulting file will be placed in the ``bin`` subdirectory. Its name is
``godot.javascript.opt.js`` for release or ``godot.javascript.opt.debug.js``
for debug. Additionally, a file of the same name but with the extension
``.html.mem`` will be generated.
Building export templates
-------------------------
After compiling, further steps are required to build the template.
The actual web export template has the form of a zip file containing at least
these 4 files:
1. ``godot.js`` — This is the file that was just compiled, but under a different
name.
For the release template::
cp bin/godot.javascript.opt.js godot.js
For the debug template::
cp bin/godot.javascript.opt.debug.js godot.js
2. ``godot.mem`` — Also created during compilation, this file initially has the
same name as the JavaScript file, except ``.js`` is replaced by
``.html.mem``.
For the release template::
cp bin/godot.javascript.opt.html.mem godot.mem
For the debug template::
cp bin/godot.javascript.opt.debug.html.mem godot.mem
3. ``godot.html`` — Another file created during compilation. This file has a
``.html`` extension.
For the release template::
cp bin/godot.javascript.opt.html godot.html
For the debug template::
cp bin/godot.javascript.opt.debug.html godot.html
4. ``godotfs.js`` — This file is located within the Godot Engine repository,
under ``/tools/dist/html_fs/``.
::
cp tools/dist/html_fs/godotfs.js .
Once these 4 files are assembled, zip them up and your export template is ready
to go. The correct name for the template file is ``javascript_release.zip`` for
the release template::
zip javascript_release.zip godot.js godot.mem godotfs.js godot.html
And ``javascript_debug.zip`` for the debug template::
zip javascript_debug.zip godot.js godot.mem godotfs.js godot.html
The resulting files must be placed in the ``templates`` directory in your Godot
user directory::
mv javascript_release.zip ~/.godot/templates
mv javascript_debug.zip ~/.godot/templates
If you are writing custom modules or using custom C++ code, you may want to
configure your zip files as custom export templates. This can be done in the
export GUI, using the "Custom Package" option.
There's no need to copy the templates in this case — you can simply reference
the resulting files in your Godot source folder, so the next time you build,
the custom templates will already be referenced.
Compiling to WebAssembly
-------------------------
The current default for exporting to the web is to compile to *asm.js*, a
highly optimizable subset of JavaScript.
It is also possible to compile to the experimental WebAssembly format, which
should eventually offer better performance and loading times. Its specification
is still in flux and compile tools may sporadically fail to build Godot.
Running a game per WebAssembly requires nightly browser builds with special
flags set. As such, WebAssembly builds are currently not suitable for
publishing.
WebAssembly can be compiled in two ways: The default way is to first
compile to asm.js similarly to the default method, then translate to
WebAssembly using a tool called ``asm2wasm``. Emscripten automatically takes
care of both processes, we simply run SCons.
The other method uses LLVM's WebAssembly backend, which should eventually
produce more performant binaries. To build LLVM with this backend, set the
CMake variable ``LLVM_EXPERIMENTAL_TARGETS_TO_BUILD` to ``WebAssembly`` when
building LLVM.
Compiling with this backend outputs files in LLVM's ``.s`` format, which is
translated to actual WebAssembly using a tool called ``s2wasm``. Emscripten
manages these processes as well, so we just invoke SCons.
In order to choose one of the two methods, the ``LLVM_ROOT`` variable in the
Emscripten configuration file ``~/.emscripten`` is set. If it points to a
directory containing binaries of Emscripten's *fastcomp* fork of clang,
``asm2wasm`` is used. This is the default in a normal Emscripten installation.
Otherwise, LLVM binaries built with the WebAssembly backend will be expected
and ``s2wasm`` is used.
With ``LLVM_ROOT`` set up correctly, compiling to WebAssembly is as easy as
adding ``wasm=yes`` to the SCons arguments::
scons platform=javascript target=release wasm=yes
scons platform=javascript target=release_debug wasm=yes
These commands will build WebAssembly binaries in either release or debug mode.
The generated files' names contain ``.webassembly`` as an additional file
suffix before the extension.
WebAssembly builds do not use a memory initializer file, so do not add a
``godot.mem`` file in the archive — there is none.
However, the binary WebAssembly file with the ``.wasm`` extension must be
added to the archive as ``godot.wasm``.
For the release template::
cp bin/godot.javascript.opt.webassembly.wasm godot.wasm
For the debug template::
cp bin/godot.javascript.opt.debug.webassembly.wasm godot.wasm
The WebAssembly export templates simply replace the previous asm.js-based web
export templates with the names ``javascript_release.zip`` and
``javascript_debug.zip``
Customizing the HTML page
-------------------------
Rather than the default ``godot.html`` file generated when compiling, it is
also possible to use a custom HTML page. This allows drastic customization of
the final web presentation.
The JavaScript object ``Module`` is the page's interface to Emscripten. Check
the official documentation for information on how to use it: https://kripken.github.io/emscripten-site/docs/api_reference/module.html
The default HTML page offers a good example to start off with, separating the
Emscripten interface logic in the JavaScript ``Module`` object from the page
logic in the ``Presentation`` object.
When exporting a game, several placeholders in the ``godot.html`` file are
substituted by values dependent on the export:
+------------------------------+-----------------------------------------------+
| Placeholder | substituted by |
+==============================+===============================================+
| ``{{{ SCRIPT }}}`` | ``<script>`` element responsible for loading |
| | the engine, generated by Emscripten |
+------------------------------+-----------------------------------------------+
| ``$GODOT_BASE`` | Basename of files referenced within the page, |
| | without file extension or other suffixes |
+------------------------------+-----------------------------------------------+
| ``$GODOT_CANVAS_WIDTH`` | Integer specifying the initial display width |
| | of the game |
+------------------------------+-----------------------------------------------+
| ``$GODOT_CANVAS_HEIGHT`` | Integer specifying the initial display height |
| | of the game |
+------------------------------+-----------------------------------------------+
| ``$GODOT_DEBUG_ENABLED`` | String ``true`` if debugging, ``false`` |
| | otherwise |
+------------------------------+-----------------------------------------------+
| ``$GODOT_CONTROLS_ENABLED`` | String ``true`` if ``html/controls_enabled`` |
| | is enabled, ``false`` otherwise |
+------------------------------+-----------------------------------------------+
| ``$GODOT_HEAD_TITLE`` | Title of the page, normally used as content |
| | of the HTML ``<title>`` element |
+------------------------------+-----------------------------------------------+
| ``$GODOT_HEAD_INCLUDE`` | Custom string to include just before the end |
| | of the HTML ``<head>`` element |
+------------------------------+-----------------------------------------------+
| ``$GODOT_STYLE_FONT_FAMILY`` | CSS format ``font-family`` to use, without |
| | terminating semicolon |
+------------------------------+-----------------------------------------------+
| ``$GODOT_STYLE_INCLUDE`` | Custom string to include just before the end |
| | of the page's CSS style sheet |
+------------------------------+-----------------------------------------------+
The first four of the placeholders listed should always be implemented in the
HTML page, since they are important for the correct presentation of the game.
The other placeholders are optional.
Finally, the custom HTML page is installed by replacing the existing
``godot.html`` file in the export template with the new one, retaining the name
of the original.