From 983cf0ba2621dc76912ecf17a423a97d45c522e7 Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Fri, 10 Jul 2026 14:40:30 +0100 Subject: [PATCH] feat: support ARM64 musl targets --- README.md | 2 ++ examples/targets/mod.test.ts | 32 ++++++++++++++++++++++++++++++++ ts/config.ts | 5 +++++ ts/lib.ts | 5 ++++- 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 examples/targets/mod.test.ts diff --git a/README.md b/README.md index dbf7f0a..a76ef6e 100644 --- a/README.md +++ b/README.md @@ -545,6 +545,7 @@ Add a `zapi` field to your `package.json`: "x86_64-unknown-linux-gnu", "x86_64-unknown-linux-musl", "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", "x86_64-apple-darwin", "aarch64-apple-darwin", "x86_64-pc-windows-msvc" @@ -560,6 +561,7 @@ Add a `zapi` field to your `package.json`: | `aarch64-apple-darwin` | macOS | arm64 | - | | `x86_64-apple-darwin` | macOS | x64 | - | | `aarch64-unknown-linux-gnu` | Linux | arm64 | glibc | +| `aarch64-unknown-linux-musl` | Linux | arm64 | musl | | `x86_64-unknown-linux-gnu` | Linux | x64 | glibc | | `x86_64-unknown-linux-musl` | Linux | x64 | musl | | `x86_64-pc-windows-msvc` | Windows | x64 | msvc | diff --git a/examples/targets/mod.test.ts b/examples/targets/mod.test.ts new file mode 100644 index 0000000..545f6b1 --- /dev/null +++ b/examples/targets/mod.test.ts @@ -0,0 +1,32 @@ +import {afterEach, describe, expect, it, vi} from "vitest"; + +afterEach(() => { + vi.doUnmock("node:fs"); + vi.resetModules(); +}); + +describe("aarch64 musl target", () => { + it("maps package and Zig target metadata", async () => { + const {getTargetParts} = await import("../../ts/config.js"); + const {TARGETS, getZigTriple} = await import("../../ts/lib.js"); + + expect(TARGETS).toContain("aarch64-unknown-linux-musl"); + expect(getZigTriple("aarch64-unknown-linux-musl")).toBe("aarch64-linux-musl"); + expect(getTargetParts("aarch64-unknown-linux-musl")).toEqual({ + abi: "musl", + arch: "arm64", + platform: "linux", + }); + }); + + it("selects the target on an ARM64 musl runtime", async () => { + vi.doMock("node:fs", async () => { + const fs = await vi.importActual("node:fs"); + return {...fs, readFileSync: vi.fn(() => "musl libc")}; + }); + + const {getTarget} = await import("../../ts/lib.js"); + + expect(getTarget("linux", "arm64")).toBe("aarch64-unknown-linux-musl"); + }); +}); diff --git a/ts/config.ts b/ts/config.ts index 11c1240..dfc29ae 100644 --- a/ts/config.ts +++ b/ts/config.ts @@ -100,6 +100,11 @@ export function getTargetParts(target: Target): {platform: NodeJS.Platform; arch arch = "arm64"; abi = "gnu"; break; + case "aarch64-unknown-linux-musl": + platform = "linux"; + arch = "arm64"; + abi = "musl"; + break; case "x86_64-apple-darwin": platform = "darwin"; arch = "x64"; diff --git a/ts/lib.ts b/ts/lib.ts index 940845e..cc72bfa 100644 --- a/ts/lib.ts +++ b/ts/lib.ts @@ -9,6 +9,7 @@ const require = createRequire(import.meta.url); export const TARGETS = [ "aarch64-apple-darwin", "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", "x86_64-apple-darwin", "x86_64-unknown-linux-gnu", "x86_64-unknown-linux-musl", @@ -121,6 +122,8 @@ export function getZigTriple(target: Target): string { return "x86_64-linux-musl"; case "aarch64-unknown-linux-gnu": return "aarch64-linux-gnu"; + case "aarch64-unknown-linux-musl": + return "aarch64-linux-musl"; case "x86_64-apple-darwin": return "x86_64-macos-none"; case "aarch64-apple-darwin": @@ -189,7 +192,7 @@ export function getTarget(platform: NodeJS.Platform, arch: NodeJS.Architecture): } } else if (platform === "linux") { const abi = isMusl() ? "musl" : "gnu"; - if (arch === "arm64" && abi === "gnu") { + if (arch === "arm64") { return `aarch64-unknown-linux-${abi}`; } if (arch === "x64") {