Building Zed for Linux
Repository
Clone down the Zed repository.
Dependencies
-
Install rustup
-
Install the necessary system libraries:
script/linuxIf you prefer to install the system libraries manually, you can find the list of required packages in the
script/linuxfile.
Backend Dependencies (optional) {#backend-dependencies}
If you are looking to develop Zed collaboration features using a local collaboration server, please see: Local Collaboration docs.
Linkers {#linker}
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 errorCause: 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-gnulike soexport 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:
- You will need to build
crates/cliand make its binary available in$PATHwith the namezed. - You will need to build
crates/zedand put it at$PATH/to/cli/../../libexec/zed-editor. For example, if you are going to put the cli at~/.local/bin/zedput zed at~/.local/libexec/zed-editor. As some linux distributions (notably Arch) discourage the use oflibexec, you can also put this binary at$PATH/to/cli/../../lib/zed/zed-editor(e.g.~/.local/lib/zed/zed-editor) instead. - If you are going to provide a
.desktopfile you can find a template incrates/zed/resources/zed.desktop.in, and useenvsubstto populate it with the values required. This file should also be renamed to$APP_ID.desktopso that the file follows the FreeDesktop standards. You should also make this desktop file executable (chmod 755). - You will need to ensure that the necessary libraries are installed. You can get the current list by inspecting the built binary on your system.
- For an example of a complete build script, see script/bundle-linux.
- You can disable Zed's auto updates and provide instructions for users who try to update Zed manually by building (or running) Zed with the environment variable
ZED_UPDATE_EXPLANATION. For example:ZED_UPDATE_EXPLANATION="Please use flatpak to update zed.". - Make sure to update the contents of the
crates/zed/RELEASE_CHANNELfile to 'nightly', 'preview', or 'stable', with no newline. This will cause Zed to use the credentials manager to remember a user's login.
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:
- Zed is a fast-moving early-phase project. We typically release 2-3 builds per week to fix user-reported issues and release major features.
- There are a couple of other
zedbinaries that may be present on Linux systems (1, 2). If you want to rename our CLI binary because of these issues, we suggestzedit,zeditor, orzed-cli. - Zed automatically installs the correct version of common developer tools in the same way as rustup/rbenv/pyenv, etc. We understand this is contentious, see here.
- We allow users to install extensions locally and from zed-industries/extensions. These extensions may install further tooling as needed, such as language servers. In the long run, we would like to make this safer, see here.
- Zed connects to several online services by default (AI, telemetry, collaboration). AI and our telemetry can be disabled by your users with their zed settings or by patching our default settings file.
- As a result of the above issues, zed currently does not play nice with sandboxes, see here
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:
- Install Flatpak for your distribution as outlined here.
- Run the
script/flatpak/depsscript to install the required dependencies. - Run
script/flatpak/bundle-flatpak. - 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
-
Find the PID (process ID) using:
ps -eo size,pid,comm | grep zed | sort | head -n 1 | cut -d ' ' -f 2Or find the pid of the command zed-editor with the most ram usage in something like htop/btop/top. -
Install perf: On Ubuntu (derivatives) run
sudo apt install linux-tools. -
Perf Record: run
sudo perf record -p <pid you just found>, wait a few seconds to gather data then press Ctrl+C. You should now have a perf.data file -
Make the output file user owned: run
sudo chown $USER:$USER perf.data -
Get build info: Run zed again and type
zed: aboutin the command pallet to get the exact commit.
The data.perf file can be send to zed together with the exact commit.
Later
This can be done by Zed staff.
- Build Zed with symbols:
Check out the commit found previously and modify
Cargo.toml. Apply the following diff then make a release build.
[profile.release]
-debug = "limited"
+debug = "full"
-
Add the symbols to perf database:
pref buildid-cache -v -a <path to release zed binary> -
Resolve the symbols from the db:
perf inject -i perf.data -o perf_with_symbols.data -
Install flamegraph:
cargo install cargo-flamegraph -
Render the flamegraph:
flamegraph --perfdata perf_with_symbols.data
Troubleshooting
Cargo errors claiming that a dependency is using unstable features
Try cargo clean and cargo build.