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

No optimizations (default). This is the recommended setting for starting to port a project, as it includes various assertions.

-O1

Simple optimizations. These include using asm.js, LLVM -O1 optimizations, relooping, removing runtime assertions and C++ exception catching, and enabling -sALIASING_FUNCTION_POINTERS=1. This is the recommended setting when you want a reasonably optimized build that is generated as quickly as possible (it builds much faster than -O2).

Like -O1, but with various JavaScript-level optimizations and LLVM -O3 optimizations.

Note

This is a reasonable setting for a release build.

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 EXTRA_EXPORTED_RUNTIME_METHODS, see src/settings.js.

-O3

Like -O2, but with additional JavaScript optimizations that can take a significant amount of compilation time.

Note

This is a good setting for a release build.

-Os

Like -O3, but with extra optimizations that reduce code size at the expense of performance. This can affect both bitcode generation and JavaScript.

-Oz

Like -Os, but reduces code size even further. This can affect both bitcode generation and JavaScript.

For JavaScript, this turns on some code size reduction optimizations that can take a significant amount of compilation time.

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 DEAD_FUNCTIONS option with the contents of the file at path/to/file.

-s DEAD_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.

-g

Preserve debug information.

When compiling to bitcode, this is the same as in Clang and gcc (it adds debug information to the object files).

When compiling from source to JavaScript or bitcode to JavaScript, it is equivalent to -g3 (discards LLVM debug info including C/C++ line numbers, but otherwise keeps as much debug information as possible). Use -g4 to get line number debugging information in JavaScript.

-g<level>

Controls how much debug information is kept when compiling from bitcode to JavaScript. Each level builds on the previous level:

-g0: Make no effort to keep code debuggable. Will discard LLVM debug information (this is done by default in -01 and higher).

Variable names in the output will not necessarily match the original variable names in source. They are, however, usually similar enough to infer the purpose of the variables.

-g4: Preserve LLVM debug information. This is the highest level of debuggability. If -g was used when compiling the C/C++ sources, this shows line number debug comments, and generates source maps.

Note

This debugging level may make compilation at optimization level -O1 and above significantly slower, because JavaScript optimization will be limited to one core (the default in -O0).

Source maps allow you to view and debug the C/C++ source code in your browser’s debugger! This works in Firefox, Chrome and Safari.

--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.

1: Run closure compiler. This greatly reduces code size and may in some cases increase runtime speed (although the opposite can also occur). Note that it takes time to run, and may require some changes to the code. In asm.js mode, closure will only be used on the ‘shell’ code around the compiled code (the compiled code will be processed by the custom asm.js minifier).

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=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, or --js-opts1).

--pre-js<file>

Specify a file whose contents are added before the generated code. This is done before optimization, so it will be minified properly if the Closure Compiler is run.

--post-js<file>

Specify a file whose contents are added after the generated code. This is done before optimization, so it will be minified properly if the Closure Compiler is run.

--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-filedir/file.dat, then dir/file.dat must exist relative to the directory where you run emcc.

Note

Embedding files is much less efficient than preloading them. You should only use it for small files, in small numbers. Instead use --preload-file, which emits efficient binary data.

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.py 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.

This argument is ignored if a target other than HTML is specified using the -o option.

--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.

--minify0

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.

--bind

Compiles the source code using the 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.

--js-library<lib>

A JavaScript library to use in addition to those in Emscripten’s core libraries (src/library_*).

-v

Turns on verbose output.

This will pass -v to Clang, and also enable EMCC_DEBUG to generate intermediate files for the compiler’s various stages. It will also run Emscripten’s internal sanity checks on the toolchain, etc.

Tip

emcc-v is a useful tool for diagnosing errors. It works with or without other arguments.

--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 being located in the path name stored
in the EM_CACHE environment variable or ~/.emscripten_cache.

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.

--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.

--show-ports

Shows the list of available projects in the Emscripten Ports repos. After this operation is complete, this process will exit.

--save-bcPATH

When compiling to JavaScript or HTML, this option will save a copy of the bitcode to the specified path. The bitcode will include all files being linked after link-time optimizations have been performed (if any), including standard libraries.

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 safest way 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

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

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 NO_EXIT_RUNTIME=0, allowing normal runtime exiting with return code passing.)

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).

--em-config

Specifies the location of the .emscripten configuration file for the current compiler run. If not specified, the environment variable EM_CONFIG is first read for this location. If neither are specified, the default location ~/.emscripten is used.

--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-ca.c-odir/

--valid-abspathpath

Whitelist an absolute path to prevent warnings about absolute include paths.

-o<target>

The target file name extension defines the output type to be generated:

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

Prints out the flags emcc would pass to clang to compile source code to object/bitcode form. You can use this to invoke clang yourself, and then run emcc on those outputs just for the final linking+conversion to JS.

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.