Linux | Zed Code Editor Documentation (original) (raw)

Building Zed for Linux

Repository

Clone down the Zed repository.

Dependencies

script/linux  

If you prefer to install the system libraries manually, you can find the list of required packages in the script/linux file.

Backend Dependencies (optional)

If you are looking to develop Zed collaboration features using a local collaboration server, please see: Local Collaboration docs.

Linkers

On Linux, Rust's default linker is LLVM's lld. Alternative linkers, especially Wild and 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:

[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:

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

For a debug build of the editor:

cargo run

And to run the tests:

cargo test --workspace

In release mode, the primary user interface is the cli crate. You can run it in development with:

cargo run -p cli

Installing a development build

You can install a local build on your machine with:

./script/install-linux

This will build zed and the cli in release mode and make them available at ~/.local/bin/zed, installing .desktop files to ~/.local/share.

Note: If you encounter linker errors similar to the following:

error: linking with `cc` failed: exit status: 1 ...
= note: /usr/bin/ld: /tmp/rustcISMaod/libaws_lc_sys-79f08eb6d32e546e.rlib(f8e4fd781484bd36-bcm.o): in function `aws_lc_0_25_0_handle_cpu_env':
         /aws-lc/crypto/fipsmodule/cpucap/cpu_intel.c:(.text.aws_lc_0_25_0_handle_cpu_env+0x63): undefined reference to `__isoc23_sscanf'
         /usr/bin/ld: /tmp/rustcISMaod/libaws_lc_sys-79f08eb6d32e546e.rlib(f8e4fd781484bd36-bcm.o): in function `pkey_rsa_ctrl_str':
         /aws-lc/crypto/fipsmodule/evp/p_rsa.c:741:(.text.pkey_rsa_ctrl_str+0x20d): undefined reference to `__isoc23_strtol'
         /usr/bin/ld: /aws-lc/crypto/fipsmodule/evp/p_rsa.c:752:(.text.pkey_rsa_ctrl_str+0x258): undefined reference to `__isoc23_strtol'
         collect2: error: ld returned 1 exit status
 = note: some `extern` functions couldn't be found; some native libraries may need to be installed or have their path specified
 = note: use the `-l` flag to specify native libraries to link
 = note: use the `cargo:rustc-link-lib` directive to specify the native libraries to link with Cargo (see https://doc.rust-lang.org/cargo/reference/build-scripts.html#rustc-link-lib)
error: could not compile `remote_server` (bin "remote_server") due to 1 previous error

Cause: this is caused by known bugs in aws-lc-rs(doesn't support GCC >= 14): FIPS fails to build with GCC >= 14& GCC-14 - build failure for FIPS module

You can refer to linux: Linker error for remote_server when using script/install-linux for more information.

Workarounds: Set the remote server target to x86_64-unknown-linux-gnu like so export REMOTE_SERVER_TARGET=x86_64-unknown-linux-gnu; script/install-linux

Wayland & X11

Zed supports both X11 and Wayland. By default, we pick whichever we can find at runtime. If you're on Wayland and want to run in X11 mode, use the environment variable WAYLAND_DISPLAY=''.

Notes for packaging Zed

Thank you for taking on the task of packaging Zed!

Technical requirements

Zed has two main binaries:

Other things to note

At Zed, our priority has been to move fast and bring the latest technology to our users. We've long been frustrated at having software that is slow, out of date, or hard to configure, and so we've built our editor to those tastes.

However, we realize that many distros have other priorities. We want to work with everyone to bring Zed to their favorite platforms. But there is a long way to go:

Flatpak

Zed's current Flatpak integration exits the sandbox on startup. Workflows that rely on Flatpak's sandboxing may not work as expected.

To build & install the Flatpak package locally follow the steps below:

  1. Install Flatpak for your distribution as outlined here.
  2. Run the script/flatpak/deps script to install the required dependencies.
  3. Run script/flatpak/bundle-flatpak.
  4. Now the package has been installed and has a bundle available at target/release/{app-id}.flatpak.

Memory profiling

heaptrack is quite useful for diagnosing memory leaks. To install it:

$ sudo apt install heaptrack heaptrack-gui
$ cargo install cargo-heaptrack

Then, to build and run Zed with the profiler attached:

$ cargo heaptrack -b zed

When this zed instance is exited, terminal output will include a command to run heaptrack_interpret to convert the *.raw.zst profile to a *.zst file which can be passed to heaptrack_gui for viewing.

Perf recording

How to get a flamegraph with resolved symbols from a running zed instance. Use when zed is using a lot of CPU. Not useful for hangs.

During the incident

The data.perf file can be send to zed together with the exact commit.

Later

This can be done by Zed staff.

[profile.release]
-debug = "limited"
+debug = "full"

Troubleshooting

Cargo errors claiming that a dependency is using unstable features

Try cargo clean and cargo build.