diff --git a/.cargo/ci-config.toml b/.cargo/ci-config.toml index 09e1af5c18174f..d5e312c2429ad8 100644 --- a/.cargo/ci-config.toml +++ b/.cargo/ci-config.toml @@ -10,3 +10,15 @@ # Here, we opted to use `[target.'cfg(all())']` instead of `[build]` because `[target.'**']` is guaranteed to be cumulative. [target.'cfg(all())'] rustflags = ["-D", "warnings"] + +# Use Mold on Linux, because it's faster than GNU ld and LLD. +# +# We no longer set this in the default `config.toml` so that developers can opt in to Wild, which +# is faster than Mold, in their own ~/.cargo/config.toml. +[target.x86_64-unknown-linux-gnu] +linker = "clang" +rustflags = ["-C", "link-arg=-fuse-ld=mold"] + +[target.aarch64-unknown-linux-gnu] +linker = "clang" +rustflags = ["-C", "link-arg=-fuse-ld=mold"] diff --git a/.cargo/config.toml b/.cargo/config.toml index 717c5e18c8d294..0bb7b6cf930eba 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -5,14 +5,6 @@ rustflags = ["-C", "symbol-mangling-version=v0", "--cfg", "tokio_unstable"] [alias] xtask = "run --package xtask --" -[target.x86_64-unknown-linux-gnu] -linker = "clang" -rustflags = ["-C", "link-arg=-fuse-ld=mold"] - -[target.aarch64-unknown-linux-gnu] -linker = "clang" -rustflags = ["-C", "link-arg=-fuse-ld=mold"] - [target.'cfg(target_os = "windows")'] rustflags = [ "--cfg", diff --git a/docs/src/development/linux.md b/docs/src/development/linux.md index a0f9af5f264d7a..a6799378bc00b5 100644 --- a/docs/src/development/linux.md +++ b/docs/src/development/linux.md @@ -20,6 +20,33 @@ Clone down the [Zed repository](https://github.com/zed-industries/zed). If you are looking to develop Zed collaboration features using a local collaboration server, please see: [Local Collaboration](./local-collaboration.md) docs. +### Linkers {#linker} + +On Linux, Rust's default linker is [LLVM's `lld`](https://blog.rust-lang.org/2025/09/18/Rust-1.90.0/). Alternative linkers, especially [Wild](https://github.com/davidlattimore/wild) and [Mold](https://github.com/rui314/mold) can significantly improve clean and incremental build time. + +At present Zed uses Mold in CI because it's more mature. For local development Wild is recommended because it's 5-20% faster than Mold. + +These linkers can be installed with `script/install-mold` and `script/install-wild`. + +To use Wild as your default, add these lines to your `~/.cargo/config.toml`: + +```toml +[target.x86_64-unknown-linux-gnu] +linker = "clang" +rustflags = ["-C", "link-arg=--ld-path=wild"] + +[target.aarch64-unknown-linux-gnu] +linker = "clang" +rustflags = ["-C", "link-arg=--ld-path=wild"] +``` + +To use Mold as your default: + +```toml +[target.'cfg(target_os = "linux")'] +rustflags = ["-C", "link-arg=-fuse-ld=mold"] +``` + ## Building from source Once the dependencies are installed, you can build Zed using [Cargo](https://doc.rust-lang.org/cargo/). diff --git a/script/install-wild b/script/install-wild new file mode 100755 index 00000000000000..7e35452db7f627 --- /dev/null +++ b/script/install-wild @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +# Install wild-linker official binaries from GitHub Releases. + +set -euo pipefail + +WILD_VERSION="${WILD_VERSION:-${1:-0.6.0}}" +if [ "$(uname -s)" != "Linux" ]; then + echo "Error: This script is intended for Linux systems only." + exit 1 +elif [ -z "$WILD_VERSION" ]; then + echo "Usage: $0 [version]" + exit 1 +elif which -s wild && wild --version | grep -Fq "$WILD_VERSION" ; then + echo "Warning: existing wild $WILD_VERSION found at $(which wild). Skipping installation." + exit 0 +fi + +if [ "$(whoami)" = root ]; then SUDO=; else SUDO="$(command -v sudo || command -v doas || true)"; fi + +ARCH="$(uname -m)" +WILD_REPO="${WILD_REPO:-https://github.com/davidlattimore/wild}" +WILD_PACKAGE="wild-linker-${ARCH}-unknown-linux-gnu" +WILD_URL="${WILD_URL:-$WILD_REPO}/releases/download/$WILD_VERSION/${WILD_PACKAGE}.tar.gz" + +echo "Downloading from $WILD_URL" +curl -fsSL --output - "$WILD_URL" \ + | $SUDO tar -C /usr/local/bin --strip-components=1 --no-overwrite-dir -xJf - \ + "wild-linker-${ARCH}-unknown-linux-gnu/wild" diff --git a/script/linux b/script/linux index 5523d876871a1d..3d619858d1b042 100755 --- a/script/linux +++ b/script/linux @@ -11,12 +11,23 @@ fi function finalize { # after packages install (curl, etc), get the rust toolchain which rustup > /dev/null 2>&1 || curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y - # verify the mold situation - if ! command -v mold >/dev/null 2>&1; then - echo "Warning: Mold binaries are unavailable on your system." >&2 - echo " Builds will be slower without mold. Try: script/install-mold" >&2 - fi - echo "Finished installing Linux dependencies with script/linux" + cat <