Skip to content

Commit 0bf4375

Browse files
authored
feat: support ARM64 musl targets (#47)
1 parent fe5f318 commit 0bf4375

4 files changed

Lines changed: 43 additions & 1 deletion

File tree

‎README.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,7 @@ Add a `zapi` field to your `package.json`:
545545
"x86_64-unknown-linux-gnu",
546546
"x86_64-unknown-linux-musl",
547547
"aarch64-unknown-linux-gnu",
548+
"aarch64-unknown-linux-musl",
548549
"x86_64-apple-darwin",
549550
"aarch64-apple-darwin",
550551
"x86_64-pc-windows-msvc"
@@ -560,6 +561,7 @@ Add a `zapi` field to your `package.json`:
560561
| `aarch64-apple-darwin` | macOS | arm64 | - |
561562
| `x86_64-apple-darwin` | macOS | x64 | - |
562563
| `aarch64-unknown-linux-gnu` | Linux | arm64 | glibc |
564+
| `aarch64-unknown-linux-musl` | Linux | arm64 | musl |
563565
| `x86_64-unknown-linux-gnu` | Linux | x64 | glibc |
564566
| `x86_64-unknown-linux-musl` | Linux | x64 | musl |
565567
| `x86_64-pc-windows-msvc` | Windows | x64 | msvc |

‎examples/targets/mod.test.ts‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import {afterEach, describe, expect, it, vi} from "vitest";
2+
3+
afterEach(() => {
4+
vi.doUnmock("node:fs");
5+
vi.resetModules();
6+
});
7+
8+
describe("aarch64 musl target", () => {
9+
it("maps package and Zig target metadata", async () => {
10+
const {getTargetParts} = await import("../../ts/config.js");
11+
const {TARGETS, getZigTriple} = await import("../../ts/lib.js");
12+
13+
expect(TARGETS).toContain("aarch64-unknown-linux-musl");
14+
expect(getZigTriple("aarch64-unknown-linux-musl")).toBe("aarch64-linux-musl");
15+
expect(getTargetParts("aarch64-unknown-linux-musl")).toEqual({
16+
abi: "musl",
17+
arch: "arm64",
18+
platform: "linux",
19+
});
20+
});
21+
22+
it("selects the target on an ARM64 musl runtime", async () => {
23+
vi.doMock("node:fs", async () => {
24+
const fs = await vi.importActual<typeof import("node:fs")>("node:fs");
25+
return {...fs, readFileSync: vi.fn(() => "musl libc")};
26+
});
27+
28+
const {getTarget} = await import("../../ts/lib.js");
29+
30+
expect(getTarget("linux", "arm64")).toBe("aarch64-unknown-linux-musl");
31+
});
32+
});

‎ts/config.ts‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,11 @@ export function getTargetParts(target: Target): {platform: NodeJS.Platform; arch
100100
arch = "arm64";
101101
abi = "gnu";
102102
break;
103+
case "aarch64-unknown-linux-musl":
104+
platform = "linux";
105+
arch = "arm64";
106+
abi = "musl";
107+
break;
103108
case "x86_64-apple-darwin":
104109
platform = "darwin";
105110
arch = "x64";

‎ts/lib.ts‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const require = createRequire(import.meta.url);
99
export const TARGETS = [
1010
"aarch64-apple-darwin",
1111
"aarch64-unknown-linux-gnu",
12+
"aarch64-unknown-linux-musl",
1213
"x86_64-apple-darwin",
1314
"x86_64-unknown-linux-gnu",
1415
"x86_64-unknown-linux-musl",
@@ -121,6 +122,8 @@ export function getZigTriple(target: Target): string {
121122
return "x86_64-linux-musl";
122123
case "aarch64-unknown-linux-gnu":
123124
return "aarch64-linux-gnu";
125+
case "aarch64-unknown-linux-musl":
126+
return "aarch64-linux-musl";
124127
case "x86_64-apple-darwin":
125128
return "x86_64-macos-none";
126129
case "aarch64-apple-darwin":
@@ -189,7 +192,7 @@ export function getTarget(platform: NodeJS.Platform, arch: NodeJS.Architecture):
189192
}
190193
} else if (platform === "linux") {
191194
const abi = isMusl() ? "musl" : "gnu";
192-
if (arch === "arm64" && abi === "gnu") {
195+
if (arch === "arm64") {
193196
return `aarch64-unknown-linux-${abi}`;
194197
}
195198
if (arch === "x64") {

0 commit comments

Comments
 (0)