Skip to content

Commit

Permalink
Update linux binary expectations
Browse files Browse the repository at this point in the history
Fixes #12585
  • Loading branch information
ConradIrwin committed Jun 4, 2024
1 parent 3cd6719 commit 8566b14
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 28 deletions.
19 changes: 9 additions & 10 deletions crates/cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -191,13 +191,14 @@ mod linux {
let cli = env::current_exe()?;
let dir = cli
.parent()
.and_then(Dir::parent)
.ok_or_else(|| anyhow!("no parent path for cli"))?;

match dir.join("zed").canonicalize() {
match dir.join("libexec").join("zed-editor").canonicalize() {
Ok(path) => Ok(path),
// development builds have Zed capitalized
Err(e) => match dir.join("Zed").canonicalize() {
Ok(path) => Ok(path),
// In development cli and zed are in the ./target/ directory together
Err(e) => match cli.parent().unwrap().join("zed").canonicalize() {
Ok(path) if path != cli => Ok(path),
Err(_) => Err(e),
},
}
Expand Down Expand Up @@ -254,10 +255,8 @@ mod linux {
eprintln!("failed to setsid: {}", std::io::Error::last_os_error());
process::exit(1);
}
if std::env::var("ZED_KEEP_FD").is_err() {
if let Err(_) = fork::close_fd() {
eprintln!("failed to close_fd: {}", std::io::Error::last_os_error());
}
if let Err(_) = fork::close_fd() {
eprintln!("failed to close_fd: {}", std::io::Error::last_os_error());
}
let error =
exec::execvp(path.clone(), &[path.as_os_str(), &OsString::from(ipc_url)]);
Expand Down Expand Up @@ -333,7 +332,7 @@ mod flatpak {

if !is_app_location_set {
args.push("--zed".into());
args.push(flatpak_dir.join("bin").join("zed-app").into());
args.push(flatpak_dir.join("libexec").join("zed-editor").into());
}

let error = exec::execvp("/usr/bin/flatpak-spawn", args);
Expand All @@ -347,7 +346,7 @@ mod flatpak {
&& env::var("FLATPAK_ID").map_or(false, |id| id.starts_with("dev.zed.Zed"))
{
if args.zed.is_none() {
args.zed = Some("/app/bin/zed-app".into());
args.zed = Some("/app/libexec/zed-editor".into());
env::set_var("ZED_IS_FLATPAK_INSTALL", "1");
}
}
Expand Down
2 changes: 1 addition & 1 deletion crates/zed/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ authors = ["Zed Team <hi@zed.dev>"]
workspace = true

[[bin]]
name = "Zed"
name = "zed"
path = "src/main.rs"

[dependencies]
Expand Down
23 changes: 22 additions & 1 deletion docs/src/development/linux.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,31 @@ cargo test --workspace

Zed has basic support for both modes. The mode is selected at runtime. If you're on wayland and want to run in X11 mode, you can set `WAYLAND_DISPLAY='' cargo run` to do so.

## Notes for packaging Zed

Thank you for taking on the task of packaging Zed! There are a few things to note to make things work smoothly:

* Zed is a *very* fast moving project. We typically ship 2-3 [releases per week](/docs/development/releases) to fix user-reported issues and major new features. Please make sure that you are packaging in a way where updates will be available to users within a few hours or days.
* If at all possible we recommend starting from the tarball that we [build](https://github.com/zed-industries/zed/releases) and release (currently only for "preview" versions) rather than building your own copy. This ensures you're running the same code and configuration that we support and test.
* If that is not possible, read through [script/bundle-linux](https://github.com/zed-industries/zed/blob/main/script/bundle-linux) to see what is involved.

The minimal technical requirements are (probably) that:
* You will need to take the built package for `crates/cli` and put it in `$PATH` with the name `zed`.
* You will need to take the built binary for `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`.
* You will need to ensure that the necessary libraries are installed. You can get the current list from the lib directory of the tarball we provide, or by [inspecting the built binary](https://github.com/zed-industries/zed/blob/059a4141b756cf4afac4c977afc488539aec6470/script/bundle-linux#L65-L70) on your system.

Also, beware! Zed does a number of things that are required to build a good IDE, but which are a bit "out there" from the point of view of package managers and linux distributions:
* We automatically install the correct version of developer tools. Like rustup/rbenv/pyenv, etc. we've found that "one system-wide version" does not work well for many professional development environments. Users expect us to support multiple projects running on multiple versions of the toolchain out of the box.
* We allow users to install extensions which may install further tooling as needed.
* We include a number of online tools and services by default (copilot, zed collaboration, telemetry). These can all be disabled in settings by the user as desired.
* We automatically install updates by default (though we do want a way to work better with package managers here, ideas welcome).

Although this may present some tension, we'd prefer for you to package Zed in a way that ensures that it continues to "just work" out of the box. That way users of your package get to benefit from the work we've put into making Zed work for as many projects as possible.

## Flatpak

> [!WARNING]
> Zed's current Flatpak integration simply exits the sandbox on startup. Workflows that rely on Flatpak's sandboxing may not work as expected.
> Zed's current Flatpak integration simply 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:

Expand Down
6 changes: 3 additions & 3 deletions script/bundle-linux
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,9 @@ temp_dir=$(mktemp -d)
zed_dir="${temp_dir}/zed$suffix.app"

# Binary
mkdir -p "${zed_dir}/bin"
cp "target/${target_triple}/release/Zed" "${zed_dir}/bin/zed"
cp "target/${target_triple}/release/cli" "${zed_dir}/bin/cli"
mkdir -p "${zed_dir}/bin" "${zed_dir}/libexec"
cp "target/${target_triple}/release/zed" "${zed_dir}/libexec/zed-editor"
cp "target/${target_triple}/release/cli" "${zed_dir}/bin/zed"

# Libs
find_libs() {
Expand Down
22 changes: 10 additions & 12 deletions script/bundle-mac
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ local_arch=false
local_only=false
local_install=false
bundle_name=""
zed_crate="zed"
binary_name="Zed"

# This must match the team in the provisioning profile.
APPLE_NOTORIZATION_TEAM="MQ55VZLNZQ"
Expand Down Expand Up @@ -80,18 +78,18 @@ local_target_triple=${host_line#*: }

if [ "$local_arch" = true ]; then
echo "Building for local target only."
cargo build ${build_flag} --package ${zed_crate} --package cli
cargo build ${build_flag} --package zed --package cli
else
echo "Compiling zed binaries"
cargo build ${build_flag} --package ${zed_crate} --package cli --target aarch64-apple-darwin --target x86_64-apple-darwin
cargo build ${build_flag} --package zed --package cli --target aarch64-apple-darwin --target x86_64-apple-darwin
fi

echo "Creating application bundle"
pushd crates/zed
channel=$(<RELEASE_CHANNEL)
popd

pushd crates/${zed_crate}
pushd crates/zed
cp Cargo.toml Cargo.toml.backup
sed \
-i .backup \
Expand Down Expand Up @@ -186,7 +184,7 @@ function prepare_binaries() {
target/${architecture}/${target_dir}/Zed.dwarf.gz \
"$channel/Zed-$version-${architecture}.dwarf.gz"

cp target/${architecture}/${target_dir}/${binary_name} "${app_path}/Contents/MacOS/${zed_crate}"
cp target/${architecture}/${target_dir}/zed "${app_path}/Contents/MacOS/zed"
cp target/${architecture}/${target_dir}/cli "${app_path}/Contents/MacOS/cli"
}

Expand All @@ -207,7 +205,7 @@ function sign_binaries() {
download_git "${architecture}" "${app_path}/Contents/MacOS/git"

# Note: The app identifier for our development builds is the same as the app identifier for nightly.
cp crates/${zed_crate}/contents/$channel/embedded.provisionprofile "${app_path}/Contents/"
cp crates/zed/contents/$channel/embedded.provisionprofile "${app_path}/Contents/"

if [[ -n "${MACOS_CERTIFICATE:-}" && -n "${MACOS_CERTIFICATE_PASSWORD:-}" && -n "${APPLE_NOTARIZATION_USERNAME:-}" && -n "${APPLE_NOTARIZATION_PASSWORD:-}" ]]; then
echo "Signing bundle with Apple-issued certificate"
Expand All @@ -223,8 +221,8 @@ function sign_binaries() {
/usr/bin/codesign --deep --force --timestamp --sign "Zed Industries, Inc." "${app_path}/Contents/Frameworks/WebRTC.framework" -v
/usr/bin/codesign --deep --force --timestamp --options runtime --sign "Zed Industries, Inc." "${app_path}/Contents/MacOS/cli" -v
/usr/bin/codesign --deep --force --timestamp --options runtime --sign "Zed Industries, Inc." "${app_path}/Contents/MacOS/git" -v
/usr/bin/codesign --deep --force --timestamp --options runtime --entitlements crates/${zed_crate}/resources/zed.entitlements --sign "Zed Industries, Inc." "${app_path}/Contents/MacOS/${zed_crate}" -v
/usr/bin/codesign --force --timestamp --options runtime --entitlements crates/${zed_crate}/resources/zed.entitlements --sign "Zed Industries, Inc." "${app_path}" -v
/usr/bin/codesign --deep --force --timestamp --options runtime --entitlements crates/zed/resources/zed.entitlements --sign "Zed Industries, Inc." "${app_path}/Contents/MacOS/zed" -v
/usr/bin/codesign --force --timestamp --options runtime --entitlements crates/zed/resources/zed.entitlements --sign "Zed Industries, Inc." "${app_path}" -v

security default-keychain -s login.keychain
else
Expand All @@ -243,7 +241,7 @@ function sign_binaries() {
# - get a signing key for the MQ55VZLNZQ team from Nathan.
# - create your own signing key, and update references to MQ55VZLNZQ to your own team ID
# then comment out this line.
cat crates/${zed_crate}/resources/zed.entitlements | sed '/com.apple.developer.associated-domains/,+1d' > "${app_path}/Contents/Resources/zed.entitlements"
cat crates/zed/resources/zed.entitlements | sed '/com.apple.developer.associated-domains/,+1d' > "${app_path}/Contents/Resources/zed.entitlements"

codesign --force --deep --entitlements "${app_path}/Contents/Resources/zed.entitlements" --sign ${MACOS_SIGNING_KEY:- -} "${app_path}" -v
fi
Expand Down Expand Up @@ -364,9 +362,9 @@ else
app_path=target/release/$(basename "$app_path_x64")
lipo \
-create \
target/{x86_64-apple-darwin,aarch64-apple-darwin}/${target_dir}/${binary_name} \
target/{x86_64-apple-darwin,aarch64-apple-darwin}/${target_dir}/zed \
-output \
"${app_path}/Contents/MacOS/${zed_crate}"
"${app_path}/Contents/MacOS/zed"
lipo \
-create \
target/{x86_64-apple-darwin,aarch64-apple-darwin}/${target_dir}/cli \
Expand Down
2 changes: 1 addition & 1 deletion script/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ linux() {
mkdir -p "$HOME/.local/bin" "$HOME/.local/share/applications"

# Link the binary
ln -sf ~/.local/zed$suffix.app/bin/cli "$HOME/.local/bin/zed"
ln -sf ~/.local/zed$suffix.app/bin/zed "$HOME/.local/bin/zed"

# Copy .desktop file
desktop_file_path="$HOME/.local/share/applications/${appid}.desktop"
Expand Down

0 comments on commit 8566b14

Please sign in to comment.