compiling_for_web.rst 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. .. _doc_compiling_for_web:
  2. Compiling for the Web
  3. =====================
  4. .. highlight:: shell
  5. Requirements
  6. ------------
  7. To compile export templates for the Web, the following is required:
  8. - `Emscripten SDK <http://emscripten.org/>`__ (Install in a path without
  9. spaces, i.e. not on "Program Files")
  10. - `Python 2.7+ <https://www.python.org/>`__ (3.0 is
  11. untested as of now)
  12. - `SCons <http://www.scons.org>`__ build system
  13. Building export templates
  14. -------------------------
  15. Start a terminal and set the environment variable ``EMSCRIPTEN_ROOT`` to the
  16. installation directory of Emscripten::
  17. export EMSCRIPTEN_ROOT=~/emsdk/emscripten/master
  18. If you are on Windows, start a regular prompt or the Emscripten Command Prompt.
  19. Do **not** use the Developer Command Prompt nor any of the ones that come with
  20. Visual Studio. You can set the environment variable in the system settings or
  21. in the prompt itself::
  22. set EMSCRIPTEN_ROOT=C:\emsdk\emscripten\master
  23. Now go to the root directory of the engine source code and instruct SCons to
  24. compile for JavaScript. Specify ``target`` as either ``release`` for a release
  25. build or ``release_debug`` for a debug build::
  26. scons platform=javascript tools=no target=release
  27. scons platform=javascript tools=no target=release_debug
  28. The engine will now be compiled to JavaScript by Emscripten. If all goes well,
  29. the resulting file will be placed in the ``bin`` subdirectory. Its name is
  30. ``godot.javascript.opt.zip`` for release or ``godot.javascript.opt.debug.zip``
  31. for debug.
  32. Finally, rename the zip archive to ``javascript_release.zip`` for the
  33. release template::
  34. mv bin/godot.javascript.opt.zip bin/javascript_release.zip
  35. And ``javascript_debug.zip`` for the debug template::
  36. mv bin/godot.javascript.opt.debug.zip bin/javascript_debug.zip
  37. Compiling to WebAssembly
  38. -------------------------
  39. The current default for exporting to the web is to compile to *asm.js*, a
  40. highly optimizable subset of JavaScript.
  41. It is also possible to compile to the *WebAssembly* format, which offers better
  42. performance and loading times. Running a game in this format requires a browser
  43. with WebAssembly support.
  44. Compiling to WebAssembly requires using the latest version of Emscripten.
  45. If your OS does not offer up-to-date packages for Emscripten, the easiest way
  46. is usually to install using Emscripten's `emsdk <http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html>`_.
  47. WebAssembly can be compiled in two ways: The default way is to first
  48. compile to asm.js similarly to the default method, then translate to
  49. WebAssembly using a tool called ``asm2wasm``. Emscripten automatically takes
  50. care of both processes, we simply run SCons.
  51. The other method uses LLVM's WebAssembly backend. This backend is not yet
  52. available in release versions of LLVM, only in development builds.
  53. Compiling with this backend outputs files in LLVM's ``.s`` format, which is
  54. translated into actual WebAssembly using a tool called ``s2wasm``.
  55. Emscripten manages these processes as well, so we just invoke SCons.
  56. In order to choose one of the two methods, the ``LLVM_ROOT`` variable in the
  57. Emscripten configuration file ``~/.emscripten`` is set. If it points to a
  58. directory containing binaries of Emscripten's *fastcomp* fork of clang,
  59. ``asm2wasm`` is used. This is the default in a normal Emscripten installation.
  60. Otherwise, LLVM binaries built with the WebAssembly backend will be expected
  61. and ``s2wasm`` is used. On Windows, make sure to escape backslashes of paths
  62. within this file as double backslashes ``\\`` or use Unix-style paths with
  63. a single forward slash ``/``.
  64. With ``LLVM_ROOT`` set up correctly, compiling to WebAssembly is as easy as
  65. adding ``wasm=yes`` to the SCons arguments::
  66. scons platform=javascript target=release wasm=yes
  67. scons platform=javascript target=release_debug wasm=yes
  68. These commands will build WebAssembly export templates in either release or
  69. debug mode. The generated files' names contain ``.webassembly`` as an
  70. additional file suffix before the extension.
  71. Finally, the WebAssembly templates are renamed to ``webassembly_release.zip``
  72. and ``webassembly_debug.zip``::
  73. mv bin/godot.javascript.opt.webassembly.zip bin/webassembly_release.zip
  74. mv bin/godot.javascript.opt.debug.webassembly.zip bin/webassembly_debug.zip
  75. Customizing the HTML page
  76. -------------------------
  77. Rather than the default HTML file generated when compiling, it is
  78. also possible to use a custom HTML page. This allows drastic customization of
  79. the final web presentation.
  80. This can be done in two ways. The first is to replace the
  81. ``platform/javascript/godot_shell.html`` file. In this case, the HTML file is
  82. used at build time, allowing Emscripten to substitute the ``{{{ SCRIPT }}}``
  83. placeholder by a ``<script>`` element containing the loader code. This makes
  84. the HTML file usable for both asm.js and WebAssembly templates, since they use
  85. different loading code.
  86. The other method is to simply replace the ``godot.html`` file within the
  87. complete export templates. This method does not require building the engine.
  88. However, in this case, no ``{{{ SCRIPT }}}`` placeholder should be used in the
  89. HTML file, since it would never be replaced — the loader code for either asm.js
  90. or WebAssembly must already be included in the file.
  91. In the HTML page, the JavaScript object ``Module`` is the page's interface to
  92. Emscripten. Check the official documentation for information on how to use it:
  93. https://kripken.github.io/emscripten-site/docs/api_reference/module.html
  94. The default HTML page offers an example to start off with, separating the
  95. Emscripten interface logic in the JavaScript ``Module`` object from the page
  96. logic in the ``Presentation`` object. Emscripten's default ``shell.html`` file
  97. is another example, but does not use Godot's placeholders, listed below.
  98. When exporting a game, several placeholders in the ``godot.html`` file are
  99. substituted by values dependent on the export:
  100. +------------------------------+-----------------------------------------------+
  101. | Placeholder | substituted by |
  102. +==============================+===============================================+
  103. | ``$GODOT_BASE`` | Basename of files referenced within the page, |
  104. | | without suffixes |
  105. +------------------------------+-----------------------------------------------+
  106. | ``$GODOT_DEBUG_ENABLED`` | ``true`` if debugging, ``false`` otherwise |
  107. +------------------------------+-----------------------------------------------+
  108. | ``$GODOT_HEAD_INCLUDE`` | Custom string to include just before the end |
  109. | | of the HTML ``<head>`` element |
  110. +------------------------------+-----------------------------------------------+
  111. | ``{{{ SCRIPT }}}`` | ``<script>`` that loads the engine, |
  112. | | substituted only when building, not on export |
  113. +------------------------------+-----------------------------------------------+
  114. The first three of the placeholders listed should always be implemented in the
  115. HTML page, since they are important for the correct presentation of the game.
  116. The last placeholder is important when rewriting the ``godot_shell.html`` file
  117. and is substituted during build time rather than export.