linux.md

  1# Building Zed for Linux
  2
  3## Repository
  4
  5Clone down the [Zed repository](https://github.com/zed-industries/zed).
  6
  7## Dependencies
  8
  9- Install [rustup](https://www.rust-lang.org/tools/install)
 10
 11- Install the necessary system libraries:
 12
 13  ```sh
 14  script/linux
 15  ```
 16
 17  If you prefer to install the system libraries manually, you can find the list of required packages in the `script/linux` file.
 18
 19### Linkers {#linker}
 20
 21On 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.
 22
 23At 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.
 24
 25These linkers can be installed with `script/install-mold` and `script/install-wild`.
 26
 27To use Wild as your default, add these lines to your `~/.cargo/config.toml`:
 28
 29```toml
 30[target.x86_64-unknown-linux-gnu]
 31linker = "clang"
 32rustflags = ["-C", "link-arg=--ld-path=wild"]
 33
 34[target.aarch64-unknown-linux-gnu]
 35linker = "clang"
 36rustflags = ["-C", "link-arg=--ld-path=wild"]
 37```
 38
 39To use Mold as your default:
 40
 41```toml
 42[target.'cfg(target_os = "linux")']
 43rustflags = ["-C", "link-arg=-fuse-ld=mold"]
 44```
 45
 46## Building from source
 47
 48Once the dependencies are installed, you can build Zed using [Cargo](https://doc.rust-lang.org/cargo/).
 49
 50For a debug build of the editor:
 51
 52```sh
 53cargo run
 54```
 55
 56And to run the tests:
 57
 58```sh
 59cargo test --workspace
 60```
 61
 62In release mode, the primary user interface is the `cli` crate. You can run it in development with:
 63
 64```sh
 65cargo run -p cli
 66```
 67
 68## Installing a development build
 69
 70You can install a local build on your machine with:
 71
 72```sh
 73./script/install-linux
 74```
 75
 76This will build zed and the cli in release mode and make them available at `~/.local/bin/zed`, installing .desktop files to `~/.local/share`.
 77
 78> **_Note_**: If you encounter linker errors similar to the following:
 79>
 80> ```bash
 81> error: linking with `cc` failed: exit status: 1 ...
 82> = note: /usr/bin/ld: /tmp/rustcISMaod/libaws_lc_sys-79f08eb6d32e546e.rlib(f8e4fd781484bd36-bcm.o): in function `aws_lc_0_25_0_handle_cpu_env':
 83>           /aws-lc/crypto/fipsmodule/cpucap/cpu_intel.c:(.text.aws_lc_0_25_0_handle_cpu_env+0x63): undefined reference to `__isoc23_sscanf'
 84>           /usr/bin/ld: /tmp/rustcISMaod/libaws_lc_sys-79f08eb6d32e546e.rlib(f8e4fd781484bd36-bcm.o): in function `pkey_rsa_ctrl_str':
 85>           /aws-lc/crypto/fipsmodule/evp/p_rsa.c:741:(.text.pkey_rsa_ctrl_str+0x20d): undefined reference to `__isoc23_strtol'
 86>           /usr/bin/ld: /aws-lc/crypto/fipsmodule/evp/p_rsa.c:752:(.text.pkey_rsa_ctrl_str+0x258): undefined reference to `__isoc23_strtol'
 87>           collect2: error: ld returned 1 exit status
 88>   = note: some `extern` functions couldn't be found; some native libraries may need to be installed or have their path specified
 89>   = note: use the `-l` flag to specify native libraries to link
 90>   = 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)
 91> error: could not compile `remote_server` (bin "remote_server") due to 1 previous error
 92> ```
 93>
 94> **Cause**:
 95> this is caused by known bugs in aws-lc-rs(doesn't support GCC >= 14): [FIPS fails to build with GCC >= 14](https://github.com/aws/aws-lc-rs/issues/569)
 96> & [GCC-14 - build failure for FIPS module](https://github.com/aws/aws-lc/issues/2010)
 97>
 98> You can refer to [linux: Linker error for remote_server when using script/install-linux](https://github.com/zed-industries/zed/issues/24880) for more information.
 99>
100> **Workarounds**:
101> 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`
102
103## Wayland & X11
104
105Zed 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=''`.
106
107## Notes for packaging Zed
108
109Thank you for taking on the task of packaging Zed!
110
111### Technical requirements
112
113Zed has two main binaries:
114
115- You will need to build `crates/cli` and make its binary available in `$PATH` with the name `zed`.
116- You will need to build `crates/zed` and put it at `$PATH/to/cli/../../libexec/zed-editor`. For example, if you are going to put the cli at `~/.local/bin/zed` put zed at `~/.local/libexec/zed-editor`. As some linux distributions (notably Arch) discourage the use of `libexec`, you can also put this binary at `$PATH/to/cli/../../lib/zed/zed-editor` (e.g. `~/.local/lib/zed/zed-editor`) instead.
117- If you are going to provide a `.desktop` file you can find a template in `crates/zed/resources/zed.desktop.in`, and use `envsubst` to populate it with the values required. This file should also be renamed to `$APP_ID.desktop` so that the file [follows the FreeDesktop standards](https://github.com/zed-industries/zed/issues/12707#issuecomment-2168742761). You should also make this desktop file executable (`chmod 755`).
118- You will need to ensure that the necessary libraries are installed. You can get the current list by [inspecting the built binary](https://github.com/zed-industries/zed/blob/935cf542aebf55122ce6ed1c91d0fe8711970c82/script/bundle-linux#L65-L67) on your system.
119- For an example of a complete build script, see [script/bundle-linux](https://github.com/zed-industries/zed/blob/935cf542aebf55122ce6ed1c91d0fe8711970c82/script/bundle-linux).
120- 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."`.
121- Make sure to update the contents of the `crates/zed/RELEASE_CHANNEL` file to 'nightly', 'preview', or 'stable', with no newline. This will cause Zed to use the credentials manager to remember a user's login.
122
123### Other things to note
124
125At 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.
126
127However, 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:
128
129- 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.
130- There are a couple of other `zed` binaries that may be present on Linux systems ([1](https://openzfs.github.io/openzfs-docs/man/v2.2/8/zed.8.html), [2](https://zed.brimdata.io/docs/commands/zed)). If you want to rename our CLI binary because of these issues, we suggest `zedit`, `zeditor`, or `zed-cli`.
131- 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](https://github.com/zed-industries/zed/issues/12589).
132- We allow users to install extensions locally and from [zed-industries/extensions](https://github.com/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](https://github.com/zed-industries/zed/issues/12358).
133- 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](https://github.com/zed-industries/zed/blob/main/assets/settings/default.json).
134- As a result of the above issues, zed currently does not play nice with sandboxes, [see here](https://github.com/zed-industries/zed/pull/12006#issuecomment-2130421220)
135
136## Flatpak
137
138> Zed's current Flatpak integration exits the sandbox on startup. Workflows that rely on Flatpak's sandboxing may not work as expected.
139
140To build & install the Flatpak package locally follow the steps below:
141
1421. Install Flatpak for your distribution as outlined [here](https://flathub.org/setup).
1432. Run the `script/flatpak/deps` script to install the required dependencies.
1443. Run `script/flatpak/bundle-flatpak`.
1454. Now the package has been installed and has a bundle available at `target/release/{app-id}.flatpak`.
146
147## Memory profiling
148
149[`heaptrack`](https://github.com/KDE/heaptrack) is quite useful for diagnosing memory leaks. To install it:
150
151```sh
152$ sudo apt install heaptrack heaptrack-gui
153$ cargo install cargo-heaptrack
154```
155
156Then, to build and run Zed with the profiler attached:
157
158```sh
159$ cargo heaptrack -b zed
160```
161
162When 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.
163
164## Perf recording
165
166How to get a flamegraph with resolved symbols from a running zed instance. Use
167when zed is using a lot of CPU. Not useful for hangs.
168
169### During the incident
170
171- Find the PID (process ID) using:
172  `ps -eo size,pid,comm | grep zed | sort | head -n 1 | cut -d ' ' -f 2`
173  Or find the pid of the command zed-editor with the most ram usage in something
174  like htop/btop/top.
175
176- Install perf:
177  On Ubuntu (derivatives) run `sudo apt install linux-tools`.
178
179- Perf Record:
180  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
181
182- Make the output file user owned:
183  run `sudo chown $USER:$USER perf.data`
184
185- Get build info:
186  Run zed again and type `zed: about` in the command pallet to get the exact commit.
187
188The `data.perf` file can be send to zed together with the exact commit.
189
190### Later
191
192This can be done by Zed staff.
193
194- Build Zed with symbols:
195  Check out the commit found previously and modify `Cargo.toml`.
196  Apply the following diff then make a release build.
197
198```diff
199[profile.release]
200-debug = "limited"
201+debug = "full"
202```
203
204- Add the symbols to perf database:
205  `pref buildid-cache -v -a <path to release zed binary>`
206
207- Resolve the symbols from the db:
208  `perf inject -i perf.data -o perf_with_symbols.data`
209
210- Install flamegraph:
211  `cargo install cargo-flamegraph`
212
213- Render the flamegraph:
214  `flamegraph --perfdata perf_with_symbols.data`
215
216## Troubleshooting
217
218### Cargo errors claiming that a dependency is using unstable features
219
220Try `cargo clean` and `cargo build`.