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 will work, as will gcc options, 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:
"-O0"
- [compile+link] 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.)
"-O1"
- [compile+link] 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.
"-O2"
- [compile+link] 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 --pre-js and
--post-js, so you can safely use the runtime from there.
Alternatively, you can use "EXPORTED_RUNTIME_METHODS", see
src/settings.js.
"-O3"
- [compile+link] Like "-O2", but with additional optimizations
that may take longer to run.
- Note:
- This is a good setting for a release build.
"-Og"
- [compile+link] Like "-O1". In future versions, this option might
disable different optimizations in order to improve debuggability.
"-Os"
- [compile+link] Like "-O3", but focuses more on code size (and
may make tradeoffs with speed). This can affect both Wasm and
JavaScript.
"-Oz"
- [compile+link] 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 Optimizing Code.
"-sOPTION[=VALUE]"
- [different OPTIONs affect at different stages, most at link time]
Emscripten build options. For the available options, see
src/settings.js.
- Note:
- If no value is specified it will default to "1".
- Note:
- It is possible, with boolean options, to use the "NO_" prefix to
reverse their meaning. For example, "-sEXIT_RUNTIME=0" is the
same as "-sNO_EXIT_RUNTIME=1" and vice versa. This is not
recommended in most cases.
- Note:
- Lists can be specified as comma separated strings:
-sEXPORTED_FUNCTIONS=foo,bar
- Note:
- We also support older list formats that involve more quoting. Lists can be
specified with or without quotes around each element and with or without
brackets around the list. For example, all the following are
equivalent:
-sEXPORTED_FUNCTIONS="foo","bar"
-sEXPORTED_FUNCTIONS=["foo","bar"]
-sEXPORTED_FUNCTIONS=[foo,bar]
- Note:
- For lists that include brackets or quote, you need quotation marks
(") around the list in most shells (to avoid errors being raised).
Two examples are shown below:
-sEXPORTED_FUNCTIONS="['liblib.so']"
-s"EXPORTED_FUNCTIONS=['liblib.so']"
- You can also specify that the value of an option will be read from a file.
For example, the following will set "EXPORTED_FUNCTIONS" based
on the contents of the file at **path/to/file**.
-sEXPORTED_FUNCTIONS=@/path/to/file
- Note:
- * In this case the file should contain a list of symbols, one per
- line.
- For legacy use cases JSON-formatted files are also
- supported: e.g. "["_func1", "func2"]".
- * The specified file path must be absolute, not relative.
- * The file may contain comments where the first character of the
- line is "'#'".
- Note:
- Options can be specified as a single argument with or without a space
between the "-s" and option name. e.g. "-sFOO" or
"-s FOO". It's highly recommended you use the notation without
space.
"-g"
- [compile+link] Preserve debug information.
- * When compiling to object files, this is the same as in *Clang*
- and *gcc*, it adds DWARF debug information to the object files.
- * When linking, this is equivalent to -g3.
"-gseparate-dwarf[=FILENAME]"
- [same as -g3 if passed at compile time, otherwise applies at link]
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 "-sSEPARATE_DWARF_URL=URL" to customize
that location (this is useful if you want to host it on a different
server, for example).
"-gsplit-dwarf"
- Enable debug fission, which creates split DWARF object files alongside the
wasm object files. This option must be used together with
"-c".
"-gsource-map"
- [link] Generate a source map using LLVM debug information (which must be
present in object files, i.e., they should have been compiled with
"-g"). 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".
"<base-url>" defaults to being empty (which means the
source map is served from the same directory as the Wasm file). It can be
changed using --source-map-base.
"-g<level>"
- [compile+link] Controls the level of debuggability. Each level builds on
the previous one:
- * "-g0": Make no effort to keep code debuggable.
- * "-g1": When linking, preserve whitespace in JavaScript.
- * "-g2": When linking, preserve function names in compiled
code.
- * "-g3": When compiling to object files, keep debug info,
- including JS whitespace, function names, and LLVM debug info (DWARF) if
any (this is the same as -g).
"--profiling"
- [same as -g2 if passed at compile time, otherwise applies at link]
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"
- [link] 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"
- [link] Enable the Emscripten Tracing API.
"--reproduce=<file.tar>"
- [compile+link] Write tar file containing inputs and command to reproduce
invocation. When sharing this file be aware that it will any object files,
source files and libraries that that were passed to the compiler.
"--emit-symbol-map"
- [link] Save a map file between function indexes in the Wasm and function
names. By storing the names on a file on the side, you can avoid shipping
the names, and can still reconstruct meaningful stack traces by
translating the indexes back to the names.
- Note:
- When used with "-sWASM=2", two symbol files are created.
"[name].js.symbols" (with WASM symbols) and
"[name].wasm.js.symbols" (with ASM.js symbols)
"--emit-minification-map <file>"
- [link] In cases where emscripten performs import/export minificiton this
option can be used to output a file that maps minified names back to their
original names. The format of this file is single line per import/export
of the form "<minname>:<origname>".
"-flto"
- [compile+link] Enables link-time optimizations (LTO).
"--closure 0|1|2"
- [link] Runs the *Closure Compiler*. Possible 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 "-sMODULARIZE" 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.
- * Closure is only run if JavaScript opts are being done ("-O2"
or
- above).
"--closure-args=<args>"
- [link] Pass arguments to the *Closure compiler*. This is an alternative to
"EMCC_CLOSURE_ARGS".
- For example, one might want to pass an externs file to avoid minifying JS
functions defined in "--pre-js" or "--post-js" files.
To pass to Closure the "externs.js" file containing those public
APIs that should not be minified, one would add the flag: "--
closure-args=--externs=path/to/externs.js"
"--pre-js <file>"
- [link] 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).
"--post-js <file>"
- [link] Like "--pre-js", but emits a file *after* the emitted
code.
"--extern-pre-js <file>"
- [link] 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>"
- [link] Like "--extern-pre-js", but appends to the end.
"--embed-file <file>"
- [link] Specify a file (with path) to embed inside the generated
WebAssembly module. 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 generally more efficient than preloading as it avoids
copying the file data at runtime.
- For more information about the "--embed-file" options, see
Packaging Files.
"--preload-file <name>"
- [link] 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 --embed-file, except that it is only
relevant when generating HTML (it uses asynchronous binary *XHRs*), or
JavaScript that will be used in a web page.
- *emcc* runs tools/file_packager to do the actual packaging of embedded and
preloaded files. You can run the file packager yourself if you want (see
Packaging using the file packager tool). 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
Packaging Files.
"--exclude-file <name>"
- [link] Files and directories to be excluded from --embed-file and
--preload-file. Wildcards (*) are supported.
"--use-preload-plugins"
- [link] 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.
"--shell-file <path>"
- [link] 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 and src/shell_minimal.html for examples.
- * This argument is ignored if a target other than HTML is
- specified using the "-o" option.
"--source-map-base <base-url>"
- [link] The base URL for the location where WebAssembly source maps will be
published. Must be used with -gsource-map.
"--minify 0"
- [same as -g1 if passed at compile time, otherwise applies at link]
Identical to "-g1".
"--js-transform <cmd>"
- [link] 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.
"--bind"
- [link] Links against embind library.
- Deprecated: Use "-lembind"
- instead.
"--embind-emit-tsd <path>"
- [link] Generates TypeScript definition file.
- Deprecated: Use "--
- emit-tsd" instead.
"--emit-tsd <path>"
- [link] Generate a TypeScript definition file for the emscripten module.
The definition file will include exported Wasm functions, runtime exports,
and exported embind bindings (if used). In order to generate bindings from
embind, the program will be instrumented and run in node.
"--ignore-dynamic-linking"
- [link] 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.
"--js-library <lib>"
- [link] A JavaScript library to use in addition to those in Emscripten's
core libraries (src/library_*).
"-v"
- [general] 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"
- [general] Runs Emscripten's internal sanity checks and reports any issues
with the current configuration.
"--cache <directory>"
- [general] 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.
"--clear-cache"
- [general] Manually clears the cache of compiled Emscripten system
libraries (libc++, libc++abi, libc).
- This is normally handled automatically, but if you update LLVM inplace
(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.
"--use-port=<port>"
- [compile+link] Use the specified port. If you need to use more than one
port you can use this option multiple times (ex: "--useport=sdl2
--use-port=bzip2"). A port can have options separated
by ":" (ex: "--use-port=sdl2_image:formats=png,jpg").
To use an external port, you provide the path to the port directly (ex:
"-- use-port=/path/to/my_port.py"). To get more information
about a port, use the "help" option (ex:
"--use-port=sdl2_image:help"). To get the list of available
ports, use "--show-ports".
"--clear-ports"
- [general] 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.
"--show-ports"
- [general] Shows the list of available projects in the Emscripten Ports
repos. After this operation is complete, this process will exit.
"-Wwarn-absolute-paths"
- [compile+link] 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"
- [link] 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.
"--emrun"
- [link] Enables the generated output to be aware of the 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"
- [link] Embeds a simple CPU profiler onto the generated page. Use this to
perform cursory interactive performance profiling.
"--memoryprofiler"
- [link] Embeds a memory allocation tracker onto the generated page. Use
this to profile the application usage of the Emscripten HEAP.
"--threadprofiler"
- [link] Embeds a thread activity profiler onto the generated page. Use this
to profile the application usage of pthreads when targeting multithreaded
builds (-pthread).
"--em-config <path>"
- [general] 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.
"--valid-abspath <path>"
- [compile+link] 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).
"-o <target>"
- [link] 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.
"-c"
- [compile] Tells *emcc* to emit an object file which can then be linked
with other object files to produce an executable.
"--output_eol windows|linux"
- [link] 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 rn line endings in them. With "-- output_eol
linux", the final generated files will be written with Unix n line
endings.
"--cflags"
- [other] 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.
Environment variables =====================
*emcc* is affected by several environment variables, as listed
below:
- * "EMMAKEN_JUST_CONFIGURE" [other]
- * "EMCC_AUTODEBUG" [compile+link]
- * "EMCC_CFLAGS" [compile+link]
- * "EMCC_CORES" [general]
- * "EMCC_DEBUG" [general]
- * "EMCC_DEBUG_SAVE" [general]
- * "EMCC_FORCE_STDLIBS" [link]
- * "EMCC_ONLY_FORCED_STDLIBS" [link]
- * "EMCC_LOCAL_PORTS" [compile+link]
- * "EMCC_STDERR_FILE" [general]
- * "EMCC_CLOSURE_ARGS" [link] arguments to be passed to
*Closure
- Compiler*
- * "EMCC_STRICT" [general]
- * "EMCC_SKIP_SANITY_CHECK" [general]
- * "EM_IGNORE_SANITY" [general]
- * "EM_CONFIG" [general]
- * "EM_LLVM_ROOT" [compile+link]
- * "_EMCC_CCACHE" [general] Internal setting that is set to 1
by
- emsdk when integrating with ccache compiler frontend
Search for 'os.environ' in 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.
------------------------------------------------------------------
emcc: supported targets: llvm bitcode, WebAssembly, NOT elf
(autoconf likes to see elf above to enable shared object support)