remote: Support building x86_64-linux-musl proxy in nix-darwin (#41291)

This change adds two things to our remote server build
process:
1. It now checks if all required tooling is installed before using it or installing it on demand. This includes checks for `rustup` and `cargo-zigbuild` in your `PATH`.
2. Next, if `ZED_BUILD_REMOTE_SERVER` contains `musl` and `ZED_ZSTD_MUSL_LIB`
is set, we will pass its value (the path) to `cargo-zigbuild` as `-C
link-arg=-L{path}`.

Release Notes:

- N/A
This commit is contained in:
Jakub Konka
2025-10-28 06:58:09 +01:00
committed by GitHub
parent c94536a2d6
commit fdf5bf7e6a
2 changed files with 49 additions and 22 deletions

View File

@@ -176,6 +176,10 @@ async fn build_remote_server_from_source(
};
if platform.os == "linux" && use_musl {
rust_flags.push_str(" -C target-feature=+crt-static");
if let Ok(path) = std::env::var("ZED_ZSTD_MUSL_LIB") {
rust_flags.push_str(&format!(" -C link-arg=-L{path}"));
}
}
if build_remote_server.contains("mold") {
rust_flags.push_str(" -C link-arg=-fuse-ld=mold");
@@ -202,32 +206,26 @@ async fn build_remote_server_from_source(
)
.await?;
} else {
let which = cx
.background_spawn(async move { which::which("zig") })
.await;
if which.is_err() {
#[cfg(not(target_os = "windows"))]
{
anyhow::bail!(
"zig not found on $PATH, install zig (see https://ziglang.org/learn/getting-started or use zigup)"
)
}
#[cfg(target_os = "windows")]
{
anyhow::bail!(
"zig not found on $PATH, install zig (use `winget install -e --id zig.zig` or see https://ziglang.org/learn/getting-started or use zigup)"
)
}
if which("zig", cx).await?.is_none() {
anyhow::bail!(if cfg!(not(windows)) {
"zig not found on $PATH, install zig (see https://ziglang.org/learn/getting-started or use zigup)"
} else {
"zig not found on $PATH, install zig (use `winget install -e --id zig.zig` or see https://ziglang.org/learn/getting-started or use zigup)"
});
}
let rustup = which("rustup", cx)
.await?
.context("rustup not found on $PATH, install rustup (see https://rustup.rs/)")?;
delegate.set_status(Some("Adding rustup target for cross-compilation"), cx);
log::info!("adding rustup target");
run_cmd(Command::new("rustup").args(["target", "add"]).arg(&triple)).await?;
run_cmd(Command::new(rustup).args(["target", "add"]).arg(&triple)).await?;
delegate.set_status(Some("Installing cargo-zigbuild for cross-compilation"), cx);
log::info!("installing cargo-zigbuild");
run_cmd(Command::new("cargo").args(["install", "--locked", "cargo-zigbuild"])).await?;
if which("cargo-zigbuild", cx).await?.is_none() {
delegate.set_status(Some("Installing cargo-zigbuild for cross-compilation"), cx);
log::info!("installing cargo-zigbuild");
run_cmd(Command::new("cargo").args(["install", "--locked", "cargo-zigbuild"])).await?;
}
delegate.set_status(
Some(&format!(
@@ -270,7 +268,9 @@ async fn build_remote_server_from_source(
#[cfg(target_os = "windows")]
{
// On Windows, we use 7z to compress the binary
let seven_zip = which::which("7z.exe").context("7z.exe not found on $PATH, install it (e.g. with `winget install -e --id 7zip.7zip`) or, if you don't want this behaviour, set $env:ZED_BUILD_REMOTE_SERVER=\"nocompress\"")?;
let seven_zip = which("7z.exe",cx)
.await?
.context("7z.exe not found on $PATH, install it (e.g. with `winget install -e --id 7zip.7zip`) or, if you don't want this behaviour, set $env:ZED_BUILD_REMOTE_SERVER=\"nocompress\"")?;
let gz_path = format!("target/remote_server/{}/debug/remote_server.gz", triple);
if smol::fs::metadata(&gz_path).await.is_ok() {
smol::fs::remove_file(&gz_path).await?;
@@ -293,3 +293,22 @@ async fn build_remote_server_from_source(
Ok(Some(path))
}
#[cfg(debug_assertions)]
async fn which(
binary_name: impl AsRef<str>,
cx: &mut AsyncApp,
) -> Result<Option<std::path::PathBuf>> {
let binary_name = binary_name.as_ref().to_string();
let binary_name_cloned = binary_name.clone();
let res = cx
.background_spawn(async move { which::which(binary_name_cloned) })
.await;
match res {
Ok(path) => Ok(Some(path)),
Err(which::Error::CannotFindBinaryPath) => Ok(None),
Err(err) => Err(anyhow::anyhow!(
"Failed to run 'which' to find the binary '{binary_name}': {err}"
)),
}
}

View File

@@ -1,24 +1,30 @@
{
mkShell,
makeFontsConf,
pkgsCross,
zed-editor,
rust-analyzer,
rustup,
cargo-nextest,
cargo-hakari,
cargo-machete,
cargo-zigbuild,
nixfmt-rfc-style,
protobuf,
nodejs_22,
zig,
}:
(mkShell.override { inherit (zed-editor) stdenv; }) {
inputsFrom = [ zed-editor ];
packages = [
rust-analyzer
rustup
cargo-nextest
cargo-hakari
cargo-machete
cargo-zigbuild
nixfmt-rfc-style
# TODO: package protobuf-language-server for editing zed.proto
# TODO: add other tools used in our scripts
@@ -26,6 +32,7 @@
# `build.nix` adds this to the `zed-editor` wrapper (see `postFixup`)
# we'll just put it on `$PATH`:
nodejs_22
zig
];
env =
@@ -51,5 +58,6 @@
];
};
PROTOC = "${protobuf}/bin/protoc";
ZED_ZSTD_MUSL_LIB = "${pkgsCross.musl64.pkgsStatic.zstd.out}/lib";
};
}