| # Installation |
| |
| Most users can enable `std::autodiff` on their latest nightly toolchain by installing the `enzyme` component with rustup, if they are using one of these platforms: |
| |
| - **Linux**: with `x86_64-unknown-linux-gnu` or `aarch64-unknown-linux-gnu` |
| - **macOS**: with `aarch64-apple-darwin` or `x86_64-apple-darwin` |
| - **Windows**: with `x86_64-llvm-mingw` or `aarch64-llvm-mingw` |
| |
| As a rustc/enzyme/autodiff contributor, or if you need any other platform, you can build rustc including autodiff from source. |
| Please open an issue if you want help enabling automatic builds for your preferred target. |
| |
| ## Installation guide |
| |
| If you want to use `std::autodiff` on Linux, macOS, or Windows and don't plan to contribute PR's to the project, then we recommend to just use your existing nightly installation and download the missing component. |
| Please run: |
| |
| ```console |
| rustup +nightly component add enzyme |
| ``` |
| |
| Older rustup versions are not aware of this component, so if you run into issues try updating rustup itself: |
| ```console |
| rustup self update |
| rustup +nightly component add enzyme |
| ``` |
| |
| ## Installation guide for Nix |
| |
| On [Nix], you can declare a nightly Rust toolchain with the Enzyme component using the [oxalica rust-overlay]. |
| |
| For example: |
| |
| ```nix |
| rust-bin.selectLatestNightlyWith (toolchain: toolchain.default.override { |
| extensions = [ "enzyme" ]; |
| }) |
| ``` |
| |
| Alternatively, you can create a [toolchain file] that declares the Enzyme component such as |
| |
| ```toml |
| [toolchain] |
| channel = "nightly-2026-06-23" |
| components = [ "enzyme" ] |
| ``` |
| |
| and consume it in the overlay |
| |
| ```nix |
| rust-bin.fromRustupToolchainFile ./rust-toolchain.toml |
| ``` |
| |
| ## Build instructions |
| |
| First you need to clone and configure the Rust repository. |
| Based on your preferences, you might also want to `--enable-clang` or `--enable-lld`. |
| ```console |
| git clone git@github.com:rust-lang/rust |
| cd rust |
| ./configure --release-channel=nightly --enable-llvm-enzyme --enable-llvm-link-shared --enable-llvm-assertions --enable-ninja --enable-option-checking --disable-docs --set llvm.download-ci-llvm=false |
| ``` |
| |
| Afterwards you can build rustc using: |
| ```console |
| ./x build --stage 1 library |
| ``` |
| |
| Afterwards rustc toolchain link will allow you to use it through cargo: |
| ```console |
| rustup toolchain link enzyme build/host/stage1 |
| rustup toolchain install nightly # enables -Z unstable-options |
| ``` |
| |
| You can then run our test cases: |
| |
| ```console |
| ./x test --stage 1 tests/codegen-llvm/autodiff |
| ./x test --stage 1 tests/pretty/autodiff |
| ./x test --stage 1 tests/ui/autodiff |
| ./x test --stage 1 tests/run-make/autodiff |
| ./x test --stage 1 tests/ui/feature-gates/feature-gate-autodiff.rs |
| ``` |
| |
| Autodiff is still experimental, so if you want to use it in your own projects, you will need to add `lto="fat"` to your Cargo.toml |
| and use `RUSTFLAGS="-Zautodiff=Enable" cargo +enzyme` instead of `cargo` or `cargo +nightly`. |
| |
| ## Compiler Explorer and dist builds |
| |
| Our compiler explorer instance can be updated to a newer rustc in a similar way. |
| First, prepare a docker instance. |
| ```console |
| docker run -it ubuntu:22.04 |
| export CC=clang CXX=clang++ |
| apt update |
| apt install wget vim python3 git curl libssl-dev pkg-config lld ninja-build cmake clang build-essential |
| ``` |
| Then build rustc in a slightly altered way: |
| ```console |
| git clone https://github.com/rust-lang/rust |
| cd rust |
| ./configure --release-channel=nightly --enable-llvm-enzyme --enable-llvm-link-shared --enable-llvm-assertions --enable-ninja --enable-option-checking --disable-docs --set llvm.download-ci-llvm=false |
| ./x dist |
| ``` |
| We then copy the tarball to our host. |
| The dockerid is the newest entry under `docker ps -a`. |
| ```console |
| docker cp <dockerid>:/rust/build/dist/rust-nightly-x86_64-unknown-linux-gnu.tar.gz rust-nightly-x86_64-unknown-linux-gnu.tar.gz |
| ``` |
| Afterwards we can create a new (pre-release) tag on the EnzymeAD/rust repository and make a PR against the EnzymeAD/enzyme-explorer repository to update the tag. |
| Remember to ping `tgymnich` on the PR to run his update script. |
| Note: We should archive EnzymeAD/rust and update the instructions here. |
| The explorer should soon be able to get the rustc toolchain from the official rust servers. |
| |
| |
| ## Build instruction for Enzyme itself |
| |
| Following the Rust build instruction above will build LLVMEnzyme, LLDEnzyme, and ClangEnzyme along with the Rust compiler. |
| We recommend that approach, if you just want to use any of them and have no experience with cmake. |
| However, if you prefer to just build Enzyme without Rust, then these instructions might help. |
| |
| ```console |
| git clone git@github.com:llvm/llvm-project |
| cd llvm-project |
| mkdir build |
| cd build |
| cmake -G Ninja ../llvm -DLLVM_TARGETS_TO_BUILD="host" -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_ENABLE_PROJECTS="clang;lld" -DLLVM_ENABLE_RUNTIMES="openmp" -DLLVM_ENABLE_PLUGINS=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=. |
| ninja |
| ninja install |
| ``` |
| This gives you a working LLVM build, now we can continue with building Enzyme. |
| Leave the `llvm-project` folder, and execute the following commands: |
| ```console |
| git clone git@github.com:EnzymeAD/Enzyme |
| cd Enzyme/enzyme |
| mkdir build |
| cd build |
| cmake .. -G Ninja -DLLVM_DIR=<YourLocalPath>/llvm-project/build/lib/cmake/llvm/ -DLLVM_EXTERNAL_LIT=<YourLocalPath>/llvm-project/llvm/utils/lit/lit.py -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXPORT_COMPILE_COMMANDS=YES -DBUILD_SHARED_LIBS=ON |
| ninja |
| ``` |
| This will build Enzyme, and you can find it in `Enzyme/enzyme/build/lib/<LLD/Clang/LLVM/lib>Enzyme.so`. |
| (Endings might differ based on your OS). |
| |
| [`Repo`]: https://github.com/rust-lang/rust/ |
| [Nix]: https://nixos.org/ |
| [oxalica rust-overlay]: https://github.com/oxalica/rust-overlay |
| [toolchain file]: https://rust-lang.github.io/rustup/overrides.html#the-toolchain-file |