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## Backend dependencies
20
21> This section is still in development. The instructions are not yet complete.
22
23If you are developing collaborative features of Zed, you'll need to install the dependencies of zed's `collab` server:
24
25- Install [Postgres](https://www.postgresql.org/download/linux/)
26- Install [Livekit](https://github.com/livekit/livekit-cli) and [Foreman](https://theforeman.org/manuals/3.9/quickstart_guide.html)
27
28Alternatively, if you have [Docker](https://www.docker.com/) installed you can bring up all the `collab` dependencies using Docker Compose:
29
30```sh
31docker compose up -d
32```
33
34## Building from source
35
36Once the dependencies are installed, you can build Zed using [Cargo](https://doc.rust-lang.org/cargo/).
37
38For a debug build of the editor:
39
40```sh
41cargo run
42```
43
44And to run the tests:
45
46```sh
47cargo test --workspace
48```
49
50In release mode, the primary user interface is the `cli` crate. You can run it in development with:
51
52```sh
53cargo run -p cli
54```
55
56## Installing a development build
57
58You can install a local build on your machine with:
59
60```sh
61./script/install-linux
62```
63
64This will build zed and the cli in release mode and make them available at `~/.local/bin/zed`, installing .desktop files to `~/.local/share`.
65
66> **_Note_**: If you encounter linker errors similar to the following:
67>
68> ```bash
69> error: linking with `cc` failed: exit status: 1 ...
70> = note: /usr/bin/ld: /tmp/rustcISMaod/libaws_lc_sys-79f08eb6d32e546e.rlib(f8e4fd781484bd36-bcm.o): in function `aws_lc_0_25_0_handle_cpu_env':
71> /aws-lc/crypto/fipsmodule/cpucap/cpu_intel.c:(.text.aws_lc_0_25_0_handle_cpu_env+0x63): undefined reference to `__isoc23_sscanf'
72> /usr/bin/ld: /tmp/rustcISMaod/libaws_lc_sys-79f08eb6d32e546e.rlib(f8e4fd781484bd36-bcm.o): in function `pkey_rsa_ctrl_str':
73> /aws-lc/crypto/fipsmodule/evp/p_rsa.c:741:(.text.pkey_rsa_ctrl_str+0x20d): undefined reference to `__isoc23_strtol'
74> /usr/bin/ld: /aws-lc/crypto/fipsmodule/evp/p_rsa.c:752:(.text.pkey_rsa_ctrl_str+0x258): undefined reference to `__isoc23_strtol'
75> collect2: error: ld returned 1 exit status
76> = note: some `extern` functions couldn't be found; some native libraries may need to be installed or have their path specified
77> = note: use the `-l` flag to specify native libraries to link
78> = 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)
79> error: could not compile `remote_server` (bin "remote_server") due to 1 previous error
80> ```
81>
82> **Cause**:
83> 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)
84> & [GCC-14 - build failure for FIPS module](https://github.com/aws/aws-lc/issues/2010)
85>
86> 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.
87>
88> **Workarounds**:
89> 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`
90
91## Wayland & X11
92
93Zed 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=''`.
94
95## Notes for packaging Zed
96
97Thank you for taking on the task of packaging Zed!
98
99### Technical requirements
100
101Zed has two main binaries:
102
103- You will need to build `crates/cli` and make its binary available in `$PATH` with the name `zed`.
104- 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.
105- 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).
106- 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.
107- For an example of a complete build script, see [script/bundle-linux](https://github.com/zed-industries/zed/blob/935cf542aebf55122ce6ed1c91d0fe8711970c82/script/bundle-linux).
108- 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."`.
109- 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.
110
111### Other things to note
112
113At 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.
114
115However, 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:
116
117- 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.
118- 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`.
119- 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).
120- 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).
121- 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).
122- 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)
123
124## Flatpak
125
126> Zed's current Flatpak integration exits the sandbox on startup. Workflows that rely on Flatpak's sandboxing may not work as expected.
127
128To build & install the Flatpak package locally follow the steps below:
129
1301. Install Flatpak for your distribution as outlined [here](https://flathub.org/setup).
1312. Run the `script/flatpak/deps` script to install the required dependencies.
1323. Run `script/flatpak/bundle-flatpak`.
1334. Now the package has been installed and has a bundle available at `target/release/{app-id}.flatpak`.
134
135## Memory profiling
136
137[`heaptrack`](https://github.com/KDE/heaptrack) is quite useful for diagnosing memory leaks. To install it:
138
139```sh
140$ sudo apt install heaptrack heaptrack-gui
141$ cargo install cargo-heaptrack
142```
143
144Then, to build and run Zed with the profiler attached:
145
146```sh
147$ cargo heaptrack -b zed
148```
149
150When 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.
151
152## Troubleshooting
153
154### Cargo errors claiming that a dependency is using unstable features
155
156Try `cargo clean` and `cargo build`.
157
158### Vulkan/GPU issues
159
160If Zed crashes at runtime due to GPU or vulkan issues, you can try running [vkcube](https://github.com/krh/vkcube) (usually available as part of the `vulkaninfo` package on various distributions) to try to troubleshoot where the issue is coming from. Try running in both X11 and wayland modes by running `vkcube -m [x11|wayland]`. Some versions of `vkcube` use `vkcube` to run in X11 and `vkcube-wayland` to run in wayland.
161
162If you have multiple GPUs, you can also try running Zed on a different one to figure out where the issue comes from. You can do so a couple different ways:
163Option A: with [vkdevicechooser](https://github.com/jiriks74/vkdevicechooser))
164Or Option B: By using the `ZED_DEVICE_ID={device_id}` environment variable to specify the device ID.
165
166You can obtain the device ID of your GPU by running `lspci -nn | grep VGA` which will output each GPU on one line like:
167
168```
16908:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA104 [GeForce RTX 3070] [10de:2484] (rev a1)
170```
171
172where the device ID here is `2484`. This value is in hexadecimal, so to force Zed to use this specific GPU you would set the environment variable like so:
173
174```
175ZED_DEVICE_ID=0x2484
176```
177
178Make sure to export the variable if you choose to define it globally in a `.bashrc` or similar
179
180#### Reporting Vulkan/GPU issues
181
182When reporting issues where Zed fails to start due to graphics initialization errors on GitHub, it can be impossible to run the `zed: copy system specs into clipboard` command like we instruct you to in our issue template. We provide an alternative way to collect the system specs specifically for this situation.
183
184Passing the `--system-specs` flag to Zed like
185
186```sh
187zed --system-specs
188```
189
190will print the system specs to the terminal like so. It is strongly recommended to copy the output verbatim into the issue on GitHub, as it uses markdown formatting to ensure the output is readable.
191
192Additionally, it is extremely beneficial to provide the contents of your Zed log when reporting such issues. The log is usually stored at `~/.local/share/zed/logs/Zed.log`. The recommended process for producing a helpful log file is as follows:
193
194```sh
195truncate -s 0 ~/.local/share/zed/logs/Zed.log # Clear the log file
196ZED_LOG=blade_graphics=info zed .
197cat ~/.local/share/zed/logs/Zed.log
198# copy the output
199```
200
201Or, if you have the Zed cli setup, you can do
202
203```sh
204ZED_LOG=blade_graphics=info /path/to/zed/cli --foreground .
205# copy the output
206```
207
208It is also highly recommended when pasting the log into a github issue, to do so with the following template:
209
210> **_Note_**: The whitespace in the template is important, and will cause incorrect formatting if not preserved.
211
212````
213<details><summary>Zed Log</summary>
214
215```
216{zed log contents}
217```
218
219</details>
220````
221
222This will cause the logs to be collapsed by default, making it easier to read the issue.