# Building Emscripten from Source

Building Emscripten yourself is an alternative to getting binaries using the emsdk.

Emscripten itself is written in Python and JavaScript so it does not need to be compiled. However, after checkout you will need to run the top level `bootstrap.py` script before the toolchain is usable. This performs various steps including `npm install` and the creation of compiler entry points (e.g. .bat files on windows).

Emscripten comes with its own versions of some C/C++ system libraries which `emcc` builds automatically as and when needed (in the emsdk builds, these are precompiled). You can also build them manually with the `embuilder` tool - see `embuilder --help` for more information.

In addition to the main emscripten repository you will also need to checkout and build LLVM and Binaryen (as detailed below). After compiling these, you will need to edit your `.emscripten` file to point to their corresponding locations.

Use the `main` branches of each of these repositories, or check the Packaging instructions to identify precise commits used in a specific release.

## Building LLVM

Build LLVM from the git repo. Include clang and wasm-ld (using something like `-DLLVM_ENABLE_PROJECTS='lld;clang'`) and the Wasm backend (which is included by default; just don’t disable it), following that project’s instructions. For example, something like this can work:

>     mkdir build
>     cd build/
>     cmake ../llvm -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS='lld;clang' -DLLVM_TARGETS_TO_BUILD="host;WebAssembly" -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF  # -DLLVM_ENABLE_ASSERTIONS=ON
>     cmake --build .

Then set the environment variable `EM_LLVM_ROOT` to `<llvm_src>/build/bin` (no need to install).

If you need to match the emsdk releases of LLVM, review the emscripten-release build and test scripts. Specifically src/build.py.

Please refer to the upstream docs for more detail.

## Building Binaryen

See the Binaryen build instructions.

- Emscripten Toolchain Requirements
- Configuring Emscripten Settings when Manually Building from Source
- Verifying the Emscripten Development Environment