Skip to content

Commit e268550

Browse files
claude: use the glibc Linux build, not musl (#15)
## What Switch the `claude` plugin's Linux download from the `musl` build to the glibc build (`linux-{arch}/claude`). ## Why The upstream `linux-x64-musl` binary is **not static**: it is dynamically linked against `/lib/ld-musl-x86_64.so.1`. On a glibc host (e.g. the `ubuntu-24.04` CI runners) that loader is absent, so executing it fails with `No such file or directory (os error 2)` (ENOENT from the missing interpreter). This surfaced when [claude-marketplace#1](Genesis-Embodied-AI/claude-marketplace#1) CI ran `proto run claude -- plugin validate` on ubuntu and failed even though install succeeded. ``` $ file linux-x64-musl/claude → interpreter /lib/ld-musl-x86_64.so.1 # fails on glibc $ file linux-x64/claude → interpreter /lib64/ld-linux-x86-64.so.2 # runs on ubuntu ``` The glibc build runs on standard Linux distros and CI. (The musl build remains the right choice only on musl/Alpine hosts, which this repo's CI and consumers are not.) ## Note on the smoke test `scripts/smoke-test.sh` did not catch this: it asserts `proto bin claude` is a `-x` file but never executes it, so a binary built for the wrong libc still passes. The original [#14](#14) CI was green for that reason. Linear: PLAT-1014
1 parent f2f44cd commit e268550

2 files changed

Lines changed: 8 additions & 5 deletions

File tree

claude/README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ also published at
2424
## Notes
2525

2626
- Binaries are served from `https://downloads.claude.ai/claude-code-releases/`
27-
as a single executable per platform (no archive). Linux uses the static
28-
`musl` build so it runs on both glibc and musl hosts.
27+
as a single executable per platform (no archive). Linux uses the glibc build:
28+
the upstream `musl` variant is dynamically linked against the musl loader (not
29+
static), so it fails on glibc hosts such as standard CI runners.
2930
- Upstream publishes checksums only inside a per-version `manifest.json`, which
3031
the TOML plugin format cannot parse, so installs are not checksum-verified.

claude/plugin.toml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@ aarch64 = "arm64"
99
x86_64 = "x64"
1010

1111
# Claude Code ships a single prebuilt binary per platform (no archive), served
12-
# from downloads.claude.ai under a {version}/{platform}/<binary> path. The Linux
13-
# build uses the static musl variant so it runs on both glibc and musl hosts.
12+
# from downloads.claude.ai under a {version}/{platform}/<binary> path. Linux uses
13+
# the glibc build: the upstream "musl" variant is not static (it is dynamically
14+
# linked against /lib/ld-musl-x86_64.so.1), so it fails with ENOENT on glibc hosts
15+
# such as the ubuntu CI runners; the glibc build runs on standard Linux and CI.
1416
# Per-version checksums exist only inside a manifest.json (keyed JSON), which the
1517
# TOML plugin format cannot parse, so no checksum-url is published here.
1618
[platform.linux]
17-
download-file = "linux-{arch}-musl/claude"
19+
download-file = "linux-{arch}/claude"
1820
exe-path = "claude"
1921

2022
[platform.macos]

0 commit comments

Comments
 (0)