mirror of
https://github.com/zed-industries/zed.git
synced 2026-08-23 16:04:45 +00:00
Bundled GLib shadowed the system libraries for host plugins dlopen'd into the process, like PipeWire's videoconvert on 1.6+, which would break Wayland screen sharing on newer distros. This PR makes Zed rely on system GLib instead, since the bundled version pulls from whatever is in CI (presently Ubuntu 20.04). Release Notes: - Removed GLib libraries from Linux release bundle, which could conflict with system plugins
214 lines
7.7 KiB
Bash
Executable file
214 lines
7.7 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
set -euxo pipefail
|
|
source script/lib/blob-store.sh
|
|
|
|
# Function for displaying help info
|
|
help_info() {
|
|
echo "
|
|
Usage: ${0##*/} [options]
|
|
Build a release .tar.gz for Linux.
|
|
|
|
Options:
|
|
-h, --help Display this help and exit.
|
|
--flatpak Set ZED_BUNDLE_TYPE=flatpak so that this can be included in system info
|
|
"
|
|
}
|
|
|
|
# Parse all arguments manually
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
-h|--help)
|
|
help_info
|
|
exit 0
|
|
;;
|
|
--flatpak)
|
|
export ZED_BUNDLE_TYPE=flatpak
|
|
shift
|
|
;;
|
|
--)
|
|
shift
|
|
break
|
|
;;
|
|
-*)
|
|
echo "Unknown option: $1" >&2
|
|
help_info
|
|
exit 1
|
|
;;
|
|
*)
|
|
echo "Error: Unexpected argument: $1" >&2
|
|
help_info
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
export ZED_BUNDLE=true
|
|
|
|
channel=$(<crates/zed/RELEASE_CHANNEL)
|
|
target_dir="${CARGO_TARGET_DIR:-target}"
|
|
|
|
version="$(script/get-crate-version zed)"
|
|
# Set RELEASE_VERSION so it's compiled into GPUI and it knows about the version.
|
|
export RELEASE_VERSION="${version}"
|
|
|
|
commit=$(git rev-parse HEAD | cut -c 1-7)
|
|
|
|
version_info=$(rustc --version --verbose)
|
|
host_line=$(echo "$version_info" | grep host)
|
|
target_triple=${host_line#*: }
|
|
musl_triple=${target_triple%-gnu}-musl
|
|
remote_server_triple=${REMOTE_SERVER_TARGET:-"${musl_triple}"}
|
|
rustup_installed=false
|
|
if command -v rustup >/dev/null 2>&1; then
|
|
rustup_installed=true
|
|
fi
|
|
|
|
# Generate the licenses first, so they can be baked into the binaries
|
|
script/generate-licenses
|
|
|
|
if "$rustup_installed"; then
|
|
rustup target add "$remote_server_triple"
|
|
fi
|
|
|
|
export CC=${CC:-$(which clang)}
|
|
|
|
# Build binary in release mode
|
|
# We need lld to link libwebrtc.a successfully on aarch64-linux.
|
|
# NOTE: Since RUSTFLAGS env var overrides all .cargo/config.toml rustflags
|
|
# (see https://github.com/rust-lang/cargo/issues/5376), the
|
|
# [target.aarch64-unknown-linux-gnu] section in config.toml has no effect here.
|
|
if [[ "$(uname -m)" == "aarch64" ]]; then
|
|
export RUSTFLAGS="${RUSTFLAGS:-} -C link-arg=-fuse-ld=lld -C link-args=-Wl,--disable-new-dtags,-rpath,\$ORIGIN/../lib"
|
|
else
|
|
export RUSTFLAGS="${RUSTFLAGS:-} -C link-args=-Wl,--disable-new-dtags,-rpath,\$ORIGIN/../lib"
|
|
fi
|
|
cargo build --release --target "${target_triple}" --package zed --package cli
|
|
# Build remote_server in separate invocation to prevent feature unification from other crates
|
|
# from influencing dynamic libraries required by it.
|
|
if [[ "$remote_server_triple" == "$musl_triple" ]]; then
|
|
export RUSTFLAGS="${RUSTFLAGS:-} -C target-feature=+crt-static"
|
|
musl_cc_var="CC_$(echo "$remote_server_triple" | tr '-' '_')"
|
|
export "$musl_cc_var"=musl-gcc
|
|
fi
|
|
cargo build --release --target "${remote_server_triple}" --package remote_server
|
|
|
|
# Upload debug info to sentry.io
|
|
if ! command -v sentry-cli >/dev/null 2>&1; then
|
|
echo "sentry-cli not found. skipping sentry upload."
|
|
echo "install with: 'curl -sL https://sentry.io/get-cli | bash'"
|
|
else
|
|
if [[ -n "${SENTRY_AUTH_TOKEN:-}" ]]; then
|
|
echo "Uploading zed debug symbols to sentry..."
|
|
# note: this uploads the unstripped binary which is needed because it contains
|
|
# .eh_frame data for stack unwinding. see https://github.com/getsentry/symbolic/issues/783
|
|
for attempt in 1 2 3; do
|
|
echo "Attempting sentry upload (attempt $attempt/3)..."
|
|
if sentry-cli debug-files upload --include-sources --wait -p zed -o zed-dev \
|
|
"${target_dir}/${target_triple}"/release/zed \
|
|
"${target_dir}/${remote_server_triple}"/release/remote_server; then
|
|
echo "Sentry upload successful on attempt $attempt"
|
|
break
|
|
else
|
|
echo "Sentry upload failed on attempt $attempt"
|
|
if [ $attempt -eq 3 ]; then
|
|
echo "All sentry upload attempts failed"
|
|
fi
|
|
fi
|
|
done
|
|
else
|
|
echo "missing SENTRY_AUTH_TOKEN. skipping sentry upload."
|
|
fi
|
|
fi
|
|
|
|
# Strip debug symbols and save them for upload to DigitalOcean.
|
|
# We use llvm-objcopy because GNU objcopy on older distros (e.g. Ubuntu 20.04)
|
|
# doesn't understand CREL sections produced by newer LLVM.
|
|
llvm-objcopy --strip-debug "${target_dir}/${target_triple}/release/zed"
|
|
llvm-objcopy --strip-debug "${target_dir}/${target_triple}/release/cli"
|
|
llvm-objcopy --strip-debug "${target_dir}/${remote_server_triple}/release/remote_server"
|
|
|
|
# Ensure that remote_server does not depend on libssl nor libcrypto, as we got rid of these deps.
|
|
if ldd "${target_dir}/${remote_server_triple}/release/remote_server" | grep -q 'libcrypto\|libssl'; then
|
|
if [[ "$remote_server_triple" == *-musl ]]; then
|
|
echo "Error: remote_server still depends on libssl or libcrypto" && exit 1
|
|
else
|
|
echo "Info: Using non-musl remote-server build."
|
|
fi
|
|
fi
|
|
|
|
suffix=""
|
|
if [ "$channel" != "stable" ]; then
|
|
suffix="-$channel"
|
|
fi
|
|
|
|
# Move everything that should end up in the final package
|
|
# into a temp directory.
|
|
temp_dir=$(mktemp -d)
|
|
zed_dir="${temp_dir}/zed$suffix.app"
|
|
|
|
# Binary
|
|
mkdir -p "${zed_dir}/bin" "${zed_dir}/libexec"
|
|
cp "${target_dir}/${target_triple}/release/zed" "${zed_dir}/libexec/zed-editor"
|
|
cp "${target_dir}/${target_triple}/release/cli" "${zed_dir}/bin/zed"
|
|
|
|
# Libs
|
|
# Bundle libstdc++ so older supported systems can run binaries built with our
|
|
# toolchain even when their system libstdc++.so.6 lacks required GLIBCXX symbols.
|
|
#
|
|
# Never bundle the GLib family or its private dependencies: host libraries that
|
|
# get dlopen'd are built against the system GLib, and resolving them against an
|
|
# older bundled copy fails with missing symbols.
|
|
find_libs() {
|
|
ldd ${target_dir}/${target_triple}/release/zed |\
|
|
cut -d' ' -f3 |\
|
|
grep -v '\<\(libc.so\|libgcc_s.so\|libm.so\|libpthread.so\|libdl.so\|libasound.so\)' |\
|
|
grep -v '\<\(libglib-2.0.so\|libgobject-2.0.so\|libgio-2.0.so\|libgmodule-2.0.so\|libpcre.so\|libpcre2-8.so\|libmount.so\|libblkid.so\|libselinux.so\|libffi.so\|libresolv.so\|libz.so\)'
|
|
}
|
|
|
|
mkdir -p "${zed_dir}/lib"
|
|
rm -rf "${zed_dir}/lib/*"
|
|
cp $(find_libs) "${zed_dir}/lib"
|
|
|
|
# Icons
|
|
mkdir -p "${zed_dir}/share/icons/hicolor/512x512/apps"
|
|
cp "crates/zed/resources/app-icon$suffix.png" "${zed_dir}/share/icons/hicolor/512x512/apps/zed.png"
|
|
mkdir -p "${zed_dir}/share/icons/hicolor/1024x1024/apps"
|
|
cp "crates/zed/resources/app-icon$suffix@2x.png" "${zed_dir}/share/icons/hicolor/1024x1024/apps/zed.png"
|
|
|
|
# .desktop
|
|
export DO_STARTUP_NOTIFY="true"
|
|
export APP_CLI="zed"
|
|
export APP_ICON="zed"
|
|
export APP_ARGS="%U"
|
|
if [[ "$channel" == "preview" ]]; then
|
|
export APP_NAME="Zed Preview"
|
|
APP_ID="dev.zed.Zed-Preview"
|
|
elif [[ "$channel" == "nightly" ]]; then
|
|
export APP_NAME="Zed Nightly"
|
|
APP_ID="dev.zed.Zed-Nightly"
|
|
elif [[ "$channel" == "dev" ]]; then
|
|
export APP_NAME="Zed Devel"
|
|
APP_ID="dev.zed.Zed-Dev"
|
|
else
|
|
export APP_NAME="Zed"
|
|
APP_ID="dev.zed.Zed"
|
|
fi
|
|
|
|
mkdir -p "${zed_dir}/share/applications"
|
|
envsubst < "crates/zed/resources/zed.desktop.in" > "${zed_dir}/share/applications/$APP_ID.desktop"
|
|
chmod +x "${zed_dir}/share/applications/$APP_ID.desktop"
|
|
|
|
# Copy generated licenses so they'll end up in archive too
|
|
cp "assets/licenses.md" "${zed_dir}/licenses.md"
|
|
|
|
# Create archive out of everything that's in the temp directory
|
|
arch=$(uname -m)
|
|
archive="zed-linux-${arch}.tar.gz"
|
|
|
|
rm -rf "${archive}"
|
|
remove_match="zed(-[a-zA-Z0-9]+)?-linux-$(uname -m)\.tar\.gz"
|
|
ls "${target_dir}/release" | grep -E ${remove_match} | xargs -d "\n" -I {} rm -f "${target_dir}/release/{}" || true
|
|
tar -czvf "${target_dir}/release/$archive" -C ${temp_dir} "zed$suffix.app"
|
|
|
|
gzip -f --stdout --best "${target_dir}/${remote_server_triple}/release/remote_server" > "${target_dir}/zed-remote-server-linux-${arch}.gz"
|