|  | |
| Main project page: <https://emscripten.org> | |
| GitHub CI status: [](https://circleci.com/gh/emscripten-core/emscripten/tree/main) | |
| Chromium builder status: [emscripten-releases](https://ci.chromium.org/p/emscripten-releases) | |
| # Overview | |
| Emscripten compiles C and C++ to [WebAssembly](https://webassembly.org/) using | |
| [LLVM](https://en.wikipedia.org/wiki/LLVM) and | |
| [Binaryen](https://github.com/WebAssembly/binaryen/). Emscripten output can run | |
| on the Web, in Node.js, and in | |
| [wasm runtimes](https://v8.dev/blog/emscripten-standalone-wasm#running-in-wasm-runtimes). | |
| Emscripten provides Web support for popular portable APIs such as OpenGL and | |
| SDL2, allowing complex graphical native applications to be ported, such as | |
| the [Unity game engine](https://docs.unity3d.com/Manual/webgl-gettingstarted.html) | |
| and [Google Earth](https://blog.chromium.org/2019/06/webassembly-brings-google-earth-to-more.html). | |
| It can probably port your codebase, too! | |
| While Emscripten mostly focuses on compiling C and C++ using | |
| [Clang](https://clang.llvm.org/), it can be integrated with other LLVM-using | |
| compilers (for example, Rust has Emscripten integration, with the | |
| `wasm32-unknown-emscripten` target). | |
| # Getting Started | |
| For detailed instructions and tutorials, visit the [Emscripten Website](https://emscripten.org). | |
| ## Installation | |
| There are two primary ways to install Emscripten: | |
| 1. **Using the Emscripten SDK (emsdk) (Recommended)** | |
| The easiest way to get started is by using the Emscripten SDK. Follow the instructions on the [downloads page](https://emscripten.org/docs/getting_started/downloads.html) to install it. | |
| 2. **From a Git Checkout (Manual Installation)** | |
| If you have cloned the repository from Git, you can install the dependencies manually and then run the bootstrap script: | |
| ```bash | |
| ./bootstrap.py | |
| ``` | |
| For more details, see the [developer guide](https://emscripten.org/docs/contributing/developers_guide.html). | |
| ## Using the compiler | |
| Run `emcc` like you would `gcc` or `clang`: | |
| ```bash | |
| $ emcc hello.c -o hello.js | |
| $ node hello.js | |
| Hello, world! | |
| ``` | |
| Emscripten will compile your code into a WebAssembly module along with a | |
| JavaScript file that can load and run it. You can then run the resulting | |
| JavaScript in your browser or under [Node.js](https://nodejs.org/) (or | |
| [Deno](https://deno.com/) or [Bun](https://bun.sh/)). | |
| Emscripten can also generate a sample HTML page that then loads the JavaScript: | |
| ```bash | |
| $ emcc hello.c -o hello.html | |
| ``` | |
| You can then serve the generated `hello.html` using the `emrun` tool, or a | |
| web server of your choosing. | |
| # Contributing | |
| For information on how to contribute to the project, see | |
| [CONTRIBUTING.md](CONTRIBUTING.md) and the [Contributing section on the | |
| website](https://emscripten.org/docs/contributing/contributing.html). | |
| # License | |
| Emscripten is available under 2 licenses, the MIT license and the | |
| University of Illinois/NCSA Open Source License. | |
| Both are permissive open source licenses, with little if any | |
| practical difference between them. | |
| The reason for offering both is that (1) the MIT license is | |
| well-known and suitable for a compiler toolchain, while | |
| (2) LLVM's original license, the University of Illinois/NCSA Open Source | |
| License, was also offered to allow Emscripten's code to be integrated | |
| upstream into LLVM. The second reason became less important after | |
| Emscripten switched to the LLVM wasm backend, at which point there | |
| isn't any code we expect to move back and forth between the projects; | |
| also, LLVM relicensed to Apache 2.0 + exceptions meanwhile. In practice you | |
| can just consider Emscripten as MIT licensed (which allows | |
| you to do pretty much anything you want with a compiler, including | |
| commercial and non-commercial use). | |
| See `LICENSE` for the full content of the licenses. |