1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494
|
.. _emccdoc:
===================================
Emscripten Compiler Frontend (emcc)
===================================
The Emscripten Compiler Frontend (``emcc``) is used to call the Emscripten compiler from the command line. It is effectively a drop-in replacement for a standard compiler like *gcc* or *clang*.
Command line syntax
===================
::
emcc [options] file...
(Note that you will need ``./emcc`` if you want to run emcc from your current directory.)
The input file(s) can be either source code files that *Clang* can handle (C or
C++), object files (produced by `emcc -c`), or LLVM assembly files.
Arguments
---------
Most `clang options <http://linux.die.net/man/1/clang>`_ will work, as will `gcc options <https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html#Option-Summary>`_, for example: ::
# Display this information
emcc --help
Display compiler version information
emcc --version
To see the full list of *Clang* options supported on the version of *Clang* used by Emscripten, run ``clang --help``.
Options that are modified or new in *emcc* are listed below:
.. _emcc-compiler-optimization-options:
.. _emcc-O0:
``-O0``
No optimizations (default). This is the recommended setting for starting to port a project, as it includes various assertions.
This and other optimization settings are meaningful both during compile and
during link. During compile it affects LLVM optimizations, and during link it
affects final optimization of the code in Binaryen as well as optimization of
the JS. (For fast incremental builds ``-O0`` is best, while for release you
should link with something higher.)
.. _emcc-O1:
``-O1``
Simple optimizations. During the compile step these include LLVM ``-O1`` optimizations. During the link step this does not include various runtime assertions in JS that `-O0` would do.
.. _emcc-O2:
``-O2``
Like ``-O1``, but enables more optimizations. During link this will also enable various JavaScript optimizations.
.. note:: These JavaScript optimizations can reduce code size by removing things that the compiler does not see being used, in particular, parts of the runtime may be stripped if they are not exported on the ``Module`` object. The compiler is aware of code in :ref:`--pre-js <emcc-pre-js>` and :ref:`--post-js <emcc-post-js>`, so you can safely use the runtime from there. Alternatively, you can use ``EXTRA_EXPORTED_RUNTIME_METHODS``, see `src/settings.js <https://github.com/emscripten-core/emscripten/blob/master/src/settings.js>`_.
.. _emcc-O3:
``-O3``
Like ``-O2``, but with additional optimizations that may take longer to run.
.. note:: This is a good setting for a release build.
.. _emcc-Os:
``-Os``
Like ``-O3``, but focuses more on code size (and may make tradeoffs with speed). This can affect both wasm and JavaScript.
.. _emcc-Oz:
``-Oz``
Like ``-Os``, but reduces code size even further, and may take longer to run. This can affect both wasm and JavaScript.
.. note:: For more tips on optimizing your code, see :ref:`Optimizing-Code`.
.. _emcc-s-option-value:
``-s OPTION[=VALUE]``
Emscripten build options. For the available options, see `src/settings.js <https://github.com/emscripten-core/emscripten/blob/master/src/settings.js>`_.
.. note:: You can prefix boolean options with ``NO_`` to reverse them. For example, ``-s EXIT_RUNTIME=1`` is the same as ``-s NO_EXIT_RUNTIME=0``.
.. note:: If no value is specifed it will default to ``1``.
.. note:: For options that are lists, you need quotation marks (") around the list in most shells (to avoid errors being raised). Two examples are shown below:
::
-s RUNTIME_LINKED_LIBS="['liblib.so']"
-s "RUNTIME_LINKED_LIBS=['liblib.so']"
You can also specify that the value of an option will be read from a specified JSON-formatted file. For example, the following option sets the ``EXPORTED_FUNCTIONS`` option with the contents of the file at **path/to/file**.
::
-s EXPORTED_FUNCTIONS=@/path/to/file
.. note::
- In this case the file might contain a JSON-formatted list of functions: ``["_func1", "func2"]``.
- The specified file path must be absolute, not relative.
.. note:: Options can be specified as a single argument without a space
between the ``-s`` and option name. e.g. ``-sFOO=1``.
.. _emcc-g:
``-g``
Preserve debug information.
- When compiling to object files, this is the same as in *Clang* and *gcc*, it adds debug information to the object files.
- When linking, this is equivalent to :ref:`-g3 <emcc-g3>`.
``-gseparate-dwarf[=FILENAME]``
Preserve debug information, but in a separate file on the side. This is the
same as ``-g``, but the main file will contain no debug info. Instead, debug
info will be present in a file on the side, in ``FILENAME`` if provided,
otherwise the same as the wasm file but with suffix ``.debug.wasm``. While
the main file contains no debug info, it does contain a URL to where the
debug file is, so that devtools can find it. You can use
``-s SEPARATE_DWARF_URL=URL`` to customize that location (this is useful if
you want to host it on a different server, for example).
.. _emcc-gN:
``-g<level>``
Controls the level of debuggability. Each level builds on the previous one:
-
.. _emcc-g0:
``-g0``: Make no effort to keep code debuggable.
-
.. _emcc-g1:
``-g1``: When linking, preserve whitespace in JavaScript.
-
.. _emcc-g2:
``-g2``: When linking, preserve function names in compiled code.
-
.. _emcc-g3:
``-g3``: When compiling to object files, keep debug info, including JS whitespace, function names, and LLVM debug info if any (this is the same as :ref:`-g <emcc-g>`).
.. _emcc-g4:
- ``-g4``: When linking, generate a source map using LLVM debug information (which must be present in object files, i.e., they should have been compiled with ``-g``).
.. note::
- Source maps allow you to view and debug the *C/C++ source code* in your browser's debugger!
- This debugging level may make compilation significantly slower (this is why we only do it on ``-g4``).
.. _emcc-profiling:
``--profiling``
Use reasonable defaults when emitting JavaScript to make the build readable but still useful for profiling. This sets ``-g2`` (preserve whitespace and function names) and may also enable optimizations that affect performance and otherwise might not be performed in ``-g2``.
``--profiling-funcs``
Preserve function names in profiling, but otherwise minify whitespace and names as we normally do in optimized builds. This is useful if you want to look at profiler results based on function names, but do *not* intend to read the emitted code.
``--tracing``
Enable the :ref:`Emscripten Tracing API <trace-h>`.
.. _emcc-emit-symbol-map:
``--emit-symbol-map``
Save a map file between the minified global names and the original function names. This allows you, for example, to reconstruct meaningful stack traces.
.. note:: This is only relevant when :term:`minifying` global names, which happens in ``-O2`` and above, and when no ``-g`` option was specified to prevent minification.
.. _emcc-llvm-opts:
``--llvm-opts <level>``
Enables LLVM optimizations, relevant when we call the LLVM optimizer (which is done when building source files to object code). Possible ``level`` values are:
- ``0``: No LLVM optimizations (default in -O0).
- ``1``: LLVM ``-O1`` optimizations (default in -O1).
- ``2``: LLVM ``-O2`` optimizations.
- ``3``: LLVM ``-O3`` optimizations (default in -O2+).
You can also specify arbitrary LLVM options, e.g.::
--llvm-opts "['-O3', '-somethingelse']"
You normally don't need to specify this option, as ``-O`` with an optimization level will set a good value.
.. _emcc-lto:
``-flto``
Enables link-time optimizations (LTO).
.. _emcc-closure:
``--closure <on>``
Runs the :term:`Closure Compiler`. Possible ``on`` values are:
- ``0``: No closure compiler (default in ``-O2`` and below).
- ``1``: Run closure compiler. This greatly reduces the size of the support JavaScript code (everything but the WebAssembly or asm.js). Note that this increases compile time significantly.
- ``2``: Run closure compiler on *all* the emitted code, even on **asm.js** output in **asm.js** mode. This can further reduce code size, but does prevent a significant amount of **asm.js** optimizations, so it is not recommended unless you want to reduce code size at all costs.
.. note::
- Consider using ``-s MODULARIZE=1`` when using closure, as it minifies globals to names that might conflict with others in the global scope. ``MODULARIZE`` puts all the output into a function (see ``src/settings.js``).
- Closure will minify the name of `Module` itself, by default! Using ``MODULARIZE`` will solve that as well. Another solution is to make sure a global variable called `Module` already exists before the closure-compiled code runs, because then it will reuse that variable.
- If closure compiler hits an out-of-memory, try adjusting ``JAVA_HEAP_SIZE`` in the environment (for example, to 4096m for 4GB).
- Closure is only run if JavaScript opts are being done (``-O2`` or above).
.. _emcc-pre-js:
``--pre-js <file>``
Specify a file whose contents are added before the emitted code and optimized together with it. Note that this might not literally be the very first thing in the JS output, for example if ``MODULARIZE`` is used (see ``src/settings.js``). If you want that, you can just prepend to the output from emscripten; the benefit of ``--pre-js`` is that it optimizes the code with the rest of the emscripten output, which allows better dead code elimination and minification, and it should only be used for that purpose. In particular, ``--pre-js`` code should not alter the main output from emscripten in ways that could confuse the optimizer, such as using ``--pre-js`` + ``--post-js`` to put all the output in an inner function scope (see ``MODULARIZE`` for that).
`--pre-js` (but not `--post-js`) is also useful for specifying things on the ``Module`` object, as it appears before the JS looks at ``Module`` (for example, you can define ``Module['print']`` there).
.. _emcc-post-js:
``--post-js <file>``
Like ``--pre-js``, but emits a file *after* the emitted code.
``--extern-pre-js <file>``
Specify a file whose contents are prepended to the JavaScript output. This
file is prepended to the final JavaScript output, *after* all other
work has been done, including optimization, optional ``MODULARIZE``-ation,
instrumentation like ``SAFE_HEAP``, etc. This is the same as prepending
this file after ``emcc`` finishes running, and is just a convenient
way to do that. (For comparison, ``--pre-js`` and ``--post-js`` optimize the
code together with everything else, keep it in the same scope if running
`MODULARIZE`, etc.).
``--extern-post-js <file>``
Like ``--extern-pre-js``, but appends to the end.
.. _emcc-embed-file:
``--embed-file <file>``
Specify a file (with path) to embed inside the generated JavaScript. The path is relative to the current directory at compile time. If a directory is passed here, its entire contents will be embedded.
For example, if the command includes ``--embed-file dir/file.dat``, then ``dir/file.dat`` must exist relative to the directory where you run *emcc*.
.. note:: Embedding files is much less efficient than :ref:`preloading <emcc-preload-file>` them. You should only use it for small files, in small numbers. Instead use ``--preload-file``, which emits efficient binary data.
For more information about the ``--embed-file`` options, see :ref:`packaging-files`.
.. _emcc-preload-file:
``--preload-file <name>``
Specify a file to preload before running the compiled code asynchronously. The path is relative to the current directory at compile time. If a directory is passed here, its entire contents will be embedded.
Preloaded files are stored in **filename.data**, where **filename.html** is the main file you are compiling to. To run your code, you will need both the **.html** and the **.data**.
.. note:: This option is similar to :ref:`--embed-file <emcc-embed-file>`, except that it is only relevant when generating HTML (it uses asynchronous binary :term:`XHRs <XHR>`), or JavaScript that will be used in a web page.
*emcc* runs `tools/file_packager <https://github.com/emscripten-core/emscripten/blob/master/tools/file_packager.py>`_ to do the actual packaging of embedded and preloaded files. You can run the file packager yourself if you want (see :ref:`packaging-files-file-packager`). You should then put the output of the file packager in an emcc ``--pre-js``, so that it executes before your main compiled code.
For more information about the ``--preload-file`` options, see :ref:`packaging-files`.
.. _emcc-exclude-file:
``--exclude-file <name>``
Files and directories to be excluded from :ref:`--embed-file <emcc-embed-file>` and :ref:`--preload-file <emcc-preload-file>`. Wildcards (*) are supported.
``--use-preload-plugins``
Tells the file packager to run preload plugins on the files as they are loaded. This performs tasks like decoding images and audio using the browser's codecs.
.. _emcc-shell-file:
``--shell-file <path>``
The path name to a skeleton HTML file used when generating HTML output. The shell file used needs to have this token inside it: ``{{{ SCRIPT }}}``.
.. note::
- See `src/shell.html <https://github.com/emscripten-core/emscripten/blob/master/src/shell.html>`_ and `src/shell_minimal.html <https://github.com/emscripten-core/emscripten/blob/master/src/shell_minimal.html>`_ for examples.
- This argument is ignored if a target other than HTML is specified using the ``-o`` option.
.. _emcc-source-map-base:
``--source-map-base <base-url>``
The URL for the location where WebAssembly source maps will be published. When this option is provided, the **.wasm** file is updated to have a ``sourceMappingURL`` section. The resulting URL will have format: ``<base-url>`` + ``<wasm-file-name>`` + ``.map``.
.. _emcc-minify:
``--minify 0``
Identical to ``-g1``.
``--js-transform <cmd>``
Specifies a ``<cmd>`` to be called on the generated code before it is optimized. This lets you modify the JavaScript, for example adding or removing some code, in a way that those modifications will be optimized together with the generated code.
``<cmd>`` will be called with the file name of the generated code as a parameter. To modify the code, you can read the original data and then append to it or overwrite it with the modified data.
``<cmd>`` is interpreted as a space-separated list of arguments, for example, ``<cmd>`` of **python processor.py** will cause a Python script to be run.
.. _emcc-bind:
``--bind``
Compiles the source code using the :ref:`embind` bindings to connect C/C++ and JavaScript.
``--ignore-dynamic-linking``
Tells the compiler to ignore dynamic linking (the user will need to manually link to the shared libraries later on).
Normally *emcc* will simply link in code from the dynamic library as though it were statically linked, which will fail if the same dynamic library is linked more than once. With this option, dynamic linking is ignored, which allows the build system to proceed without errors.
.. _emcc-js-library:
``--js-library <lib>``
A JavaScript library to use in addition to those in Emscripten's core libraries (src/library_*).
.. _emcc-verbose:
``-v``
Turns on verbose output.
This will print the internal sub-commands run by emscripten as well as ``-v``
to *Clang*.
.. tip:: ``emcc -v`` is a useful tool for diagnosing errors. It works with or without other arguments.
``--check``
Runs Emscripten's internal sanity checks and reports any issues with the
current configuration.
.. _emcc-cache:
``--cache``
Sets the directory to use as the Emscripten cache. The Emscripten cache
is used to store pre-built versions of ``libc``, ``libcxx`` and other
libraries.
If using this in combination with ``--clear-cache``, be sure to specify
this argument first.
The Emscripten cache defaults to ``emscripten/cache`` but can be overridden
using the ``EM_CACHE`` environment variable or ``CACHE`` config setting.
.. _emcc-clear-cache:
``--clear-cache``
Manually clears the cache of compiled Emscripten system libraries (libc++,
libc++abi, libc).
This is normally handled automatically, but if you update LLVM in-place
(instead of having a different directory for a new version), the caching
mechanism can get confused. Clearing the cache can fix weird problems related
to cache incompatibilities, like *Clang* failing to link with library files.
This also clears other cached data. After the cache is cleared, this process
will exit.
By default this will also clear any download ports since the ports directory
is usually within the cache directory.
.. _emcc-clear-ports:
``--clear-ports``
Manually clears the local copies of ports from the Emscripten Ports repos
(sdl2, etc.). This also clears the cache, to remove their builds.
You should only need to do this if a problem happens and you want all ports
that you use to be downloaded and built from scratch. After this operation is
complete, this process will exit.
.. _emcc-show-ports:
``--show-ports``
Shows the list of available projects in the Emscripten Ports repos. After this operation is complete, this process will exit.
.. _emcc-memory-init-file:
``--memory-init-file <on>``
Specifies whether to emit a separate memory initialization file.
.. note:: Note that this is only relevant when *not* emitting wasm, as wasm embeds the memory init data in the wasm binary.
Possible ``on`` values are:
- ``0``: Do not emit a separate memory initialization file. Instead keep the static initialization inside the generated JavaScript as text. This is the default setting if compiling with -O0 or -O1 link-time optimization flags.
- ``1``: Emit a separate memory initialization file in binary format. This is more efficient than storing it as text inside JavaScript, but does mean you have another file to publish. The binary file will also be loaded asynchronously, which means ``main()`` will not be called until the file is downloaded and applied; you cannot call any C functions until it arrives. This is the default setting when compiling with -O2 or higher.
.. note:: The :ref:`safest way <faq-when-safe-to-call-compiled-functions>` to ensure that it is safe to call C functions (the initialisation file has loaded) is to call a notifier function from ``main()``.
.. note:: If you assign a network request to ``Module.memoryInitializerRequest`` (before the script runs), then it will use that request instead of automatically starting a download for you. This is beneficial in that you can, in your HTML, fire off a request for the memory init file before the script actually arrives. For this to work, the network request should be an XMLHttpRequest with responseType set to ``'arraybuffer'``. (You can also put any other object here, all it must provide is a ``.response`` property containing an ArrayBuffer.)
``-Wwarn-absolute-paths``
Enables warnings about the use of absolute paths in ``-I`` and ``-L`` command line directives. This is used to warn against unintentional use of absolute paths, which is sometimes dangerous when referring to nonportable local system headers.
.. _proxy-to-worker:
``--proxy-to-worker``
Runs the main application code in a worker, proxying events to it and output from it. If emitting HTML, this emits a **.html** file, and a separate **.js** file containing the JavaScript to be run in a worker. If emitting JavaScript, the target file name contains the part to be run on the main thread, while a second **.js** file with suffix ".worker.js" will contain the worker portion.
.. _emcc-emrun:
``--emrun``
Enables the generated output to be aware of the :ref:`emrun <Running-html-files-with-emrun>` command line tool. This allows ``stdout``, ``stderr`` and ``exit(returncode)`` capture when running the generated application through *emrun*. (This enables `EXIT_RUNTIME=1`, allowing normal runtime exiting with return code passing.)
``--cpuprofiler``
Embeds a simple CPU profiler onto the generated page. Use this to perform cursory interactive performance profiling.
``--memoryprofiler``
Embeds a memory allocation tracker onto the generated page. Use this to profile the application usage of the Emscripten HEAP.
``--threadprofiler``
Embeds a thread activity profiler onto the generated page. Use this to profile the application usage of pthreads when targeting multithreaded builds (-s USE_PTHREADS=1/2).
.. _emcc-config:
``--em-config``
Specifies the location of the **.emscripten** configuration file. If not
specified emscripten will search for ``.emscripten`` first in the emscripten
directory itself, and then in the user's home directory (``~/.emscripten``).
This can be overridden using the ``EM_CONFIG`` environment variable.
``--default-obj-ext .ext``
Specifies the file suffix to generate if the location of a directory name is passed to the ``-o`` directive.
For example, consider the following command, which will by default generate an output name **dir/a.o**. With ``--default-obj-ext .ext`` the generated file has the custom suffix *dir/a.ext*.
::
emcc -c a.c -o dir/
``--valid-abspath path``
Note an allowed absolute path, which we should not warn about (absolute
include paths normally are warned about, since they may refer to the
local system headers etc. which we need to avoid when cross-compiling).
.. _emcc-o-target:
``-o <target>``
When linking an executable, the ``target`` file name extension defines the output type to be generated:
- <name> **.js** : JavaScript (+ separate **<name>.wasm** file if emitting WebAssembly). (default)
- <name> **.mjs** : ES6 JavaScript module (+ separate **<name>.wasm** file if emitting WebAssembly).
- <name> **.html** : HTML + separate JavaScript file (**<name>.js**; + separate **<name>.wasm** file if emitting WebAssembly).
- <name> **.wasm** : WebAssembly without JavaScript support code ("standalone wasm"; this enables ``STANDALONE_WASM``).
These rules only apply when linking. When compiling to object code (See `-c`
below) the name of the output file is irrelevant.
.. note:: If ``--memory-init-file`` is used, a **.mem** file will be created in addition to the generated **.js** and/or **.html** file.
.. _emcc-c:
``-c``
Tells *emcc* to emit an object file which can then be linked with other object files to produce an executable.
``--output_eol windows|linux``
Specifies the line ending to generate for the text files that are outputted. If "--output_eol windows" is passed, the final output files will have Windows \r\n line endings in them. With "--output_eol linux", the final generated files will be written with Unix \n line endings.
``--cflags``
Prints out the flags ``emcc`` would pass to ``clang`` to compile source code to object form. You can use this to invoke clang yourself, and then run ``emcc`` on those outputs just for the final linking+conversion to JS.
.. _emcc-environment-variables:
Environment variables
=====================
*emcc* is affected by several environment variables, as listed below:
- ``EMMAKEN_JUST_CONFIGURE``
- ``EMMAKEN_CFLAGS``
- ``EMCC_DEBUG``
- ``EMCC_CLOSURE_ARGS`` : arguments to be passed to *Closure Compiler*
Search for 'os.environ' in `emcc.py <https://github.com/emscripten-core/emscripten/blob/master/emcc.py>`_ to see how these are used. The most interesting is possibly ``EMCC_DEBUG``, which forces the compiler to dump its build and temporary files to a temporary directory where they can be reviewed.
.. todo:: In case we choose to document them properly in future, below are some of the :ref:`-s <emcc-s-option-value>` options that are documented in the site are listed below. Note that this is not exhaustive by any means:
- ``-s FULL_ES2=1``
- ``-s LEGACY_GL_EMULATION=1``:
- ``-s GL_UNSAFE_OPTS=1``
- ``-s GL_FFP_ONLY=1``
- ASSERTIONS
- SAFE_HEAP
- -s DISABLE_EXCEPTION_CATCHING=0.
- INLINING_LIMIT=
|