Skip to content

Add riscv64-linux-musl-gcc cross GCC toolchain package - #585

Merged
Sunrisepeak merged 3 commits into
openxlings:mainfrom
lildengzi:riscv64-linux-musl-gcc
Aug 9, 2026
Merged

Add riscv64-linux-musl-gcc cross GCC toolchain package#585
Sunrisepeak merged 3 commits into
openxlings:mainfrom
lildengzi:riscv64-linux-musl-gcc

Conversation

@lildengzi

@lildengzi lildengzi commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

内容

新增 riscv64-linux-musl-gcc 交叉工具链包(host → riscv64-linux-musl),与现有 aarch64-linux-musl-gcc 包对齐:

  • pkgs/r/riscv64-linux-musl-gcc.lua:新增包描述符(XLINGS_RES sentinel,gcc 16.1.0,host x86_64)。
  • pkgs/m/musl-cross-make.luatarget_list 增加 riscv64-linux-muslgcc_version_list 增加 16.1.0

资产

交叉工具链 riscv64-linux-musl-gcc-16.1.0-linux-x86_64.tar.gz(141MB)目前发布在 builder 分支 lildengzi/riscv64-linux-musl-gcc(release 16.1.0),由 musl-cross-make 构建(build=x86_64, host=x86_64, target=riscv64-linux-musl),全静态。

CI 已构建并验证:

  • 交叉编译 import std; hello,产物为 ELF 64-bit LSB executable, UCB RISC-V, RVC, double-float ABI, statically linked

范围 / 非目标

该目标属于 hosted RISC-V Linux 用户态 ABI(rv64gc/lp64d 基础 ISA,musl),与 aarch64-linux-musl 同构,用于:

  • RISC-V Linux 用户态程序交叉编译(静态 musl);
  • 在 RISC-V Linux 上自举 mcpp / xlings。

不是裸机 / freestanding 目标。mcpp 的嵌入式设计文档(2026-07-24-embedded-platform-support-design.md 决策 #15)已明确推迟裸机/freestanding,因此本包覆盖 RISC-V 内核 / 固件(riscv64-none-elf、自定义 link.ld、qemu -kernel 启动)。可选 ISA 扩展(V 向量、Zb* 位操作)不属于基础三元组,需在构建时用 -march=... 指定——本工具链支持 rv64gcvrv64gc_zba_zbb 等。

上游说明

若合入,建议把资产镜像到 xlings-res/riscv64-linux-musl-gcc(org 所有),与其他工具链包保持一致(如 xlings-res/aarch64-linux-musl-gcc)。

本包落地后,mcpp 即可把 riscv64-linux-muslplanned 提升为 verified

@lildengzi

Copy link
Copy Markdown
Contributor Author

补充工具链资源信息,以及本 PR 与 mcpp 侧的联动:

工具链资产(已构建并发布,CI 24min 全绿):

ISA 范围:默认基础集 rv64gcrv64imafdc_zicsr_zifencei_zmmul_zaamo_zalrsc_zca_zcd)+ lp64d ABI;可选扩展(V 向量、Zb* 位操作)工具链支持编译但默认不启用,需 -march= 显式指定。

本地端到端实测:工具链手动装入本机 xpkgs 后,mcpp build --target riscv64-linux-musl 在 RISC-V 64 freestanding 的 toy_kernel 上完整跑通(产物 ELF UCB RISC-V,qemu-riscv64 输出 "Hello from toy_kernel!")。

联动:本 PR 合入后,mcpp 侧 planned→verified 已就绪 —— mcpp-community/mcpp#402

XLINGS_RES would resolve to xlings-res/riscv64-linux-musl-gcc, which does
not exist yet. Pin the artifact to the builder repo release (16.1.0) with
explicit url + sha256 so xlings can fetch and verify it today; mirror to
xlings-res later.
@lildengzi

Copy link
Copy Markdown
Contributor Author

已更新描述符:资产改用显式 url + sha256 指向 builder 仓库 release,不再用 XLINGS_RES(因为 xlings-res/riscv64-linux-musl-gcc 尚未创建,XLINGS_RES 会解析到不存在的仓库导致 fetch 失败)。

现在合并后 xlings 可直接下载 + 校验 + 安装:

若合入后希望资产进 xlings-res,我可以把 release 资产同步过去,届时描述符可改回 XLINGS_RES。

@Sunrisepeak

Copy link
Copy Markdown
Member

@lildengzi 补充一下 工具链详细的构建参数 以及 可复现路径

@lildengzi

Copy link
Copy Markdown
Contributor Author

补充构建参数、可复现路径、以及端到端运行 RISC-V Linux 的实测

一、构建参数

musl-cross-make 源码构建,x86_64 宿主交叉产出 riscv64 全静态工具链。

组件版本

  • GCC:16.1.0(kernel.org 拉源码,sha1 由脚本自动注入 hashes/)
  • Binutils:2.44(musl-cross-make 默认)
  • musl:musl-cross-make 默认
  • TARGET:riscv64-linux-musl,ABI lp64d,默认 rv64gc

config.mak

GCC_VER = 16.1.0
GNU_SITE = https://mirrors.kernel.org/gnu
TARGET = riscv64-linux-musl
OUTPUT = riscv64-linux-musl-gcc-16.1.0-linux-x86_64
COMMON_CONFIG += CC="gcc -static --static" CXX="g++ -static --static"

然后 make -j$(nproc) + make -k install-k 容忍 libcc1 非必需组件)。

二、可复现路径

完整 workflow 在 lildengzi/riscv64-linux-musl-gcc 仓库的 Actions:build-cross-riscv64-toolchain(输入 gcc_ver=16.1.0),约 24 分钟,产出 tarball + sha256 自动传 release。逻辑全在 build-cross.yml

三、端到端实测:RISC-V Linux 里跑工具链产物

在 x86_64 宿主上,用本工具链交叉编译 import std 程序,然后在 distrobox 拉起的 riscv64 Alpine Linux(qemu binfmt 跨架构)里运行:

# 1) 交叉编译(import std 全链路)
TC=<toolchain>/bin
$TC/riscv64-linux-musl-g++ -std=c++23 -fmodules-ts -c <toolchain>/.../bits/std.cc -o std.o
$TC/riscv64-linux-musl-g++ -std=c++23 -fmodules-ts demo.cpp std.o -static -o demo_riscv
file demo_riscv  # ELF 64-bit UCB RISC-V, statically linked

# 2) 拉起 riscv64 Alpine(qemu-user binfmt)
podman pull --platform linux/riscv64 alpine:latest
distrobox create --name riscv-alpine --image alpine:latest
distrobox enter riscv-alpine -- uname -m   # → riscv64

# 3) 在 RISC-V Linux 里运行工具链产物
distrobox enter riscv-alpine -- $HOME/demo_riscv

实际输出:

RISC-V Linux via Miuzy toolchain (gcc 16.1.0, musl): hello from import std
arch=riscv64 bits=64

即:x86_64 上交叉编译 → riscv64 Linux(qemu)里运行成功import std 静态产物在真实 RISC-V Linux 环境可执行。这也是 mcpp build --target riscv64-linux-musl 的产物形态。

@Sunrisepeak

Sunrisepeak commented Aug 9, 2026

Copy link
Copy Markdown
Member

Review:资产完备性通过,镜像已按 xlings-res 规范落地

把资产拉下来做了实测(不是只核对描述),结论是完备,可以合。

一、资产验证

检查项 结果
sha256 三方一致(PR 描述 / .sha256 sidecar / lua 内联值) dc85b0a6…5aae5b2
tarball 顶层目录 == 资产 stem riscv64-linux-musl-gcc-16.1.0-linux-x86_64install()install_file() 推导 srcdir 成立
programs 声明的 17 个程序 ✅ 全部存在于 bin/
宿主 ELF 无 PT_INTERP / 无 NEEDED ✅ 全静态且已 strip → deps = {} 名副其实,冷 sandbox 可跑
ISA / ABI -march=rv64imafdc_zicsr_zifencei_zmmul_zaamo_zalrsc_zca_zcd(rv64gc)、-mabi=lp64d,与描述一致
交叉编译 ✅ C / C++23 / import stdbits/std.cc 随包)全部通过
产物可执行 ✅ 本机 qemu binfmt 下跑出 hello import std,退出码 0
musl-cross-make.lua 的两行 ✅ 只进 verify_and_choice_from_list 的展示列表,不改行为,零风险

二、xlings-res 镜像已上线(三方 sha256 复核通过)

xlings-res/aarch64-linux-musl-gcc 的既有规范建好了(tag = 版本,资产 <pkg>-<ver>-linux-<hostarch>.tar.gz + .sha256 sidecar,main 分支带 README):

从两个 forge 各自匿名回下完整 141MB 实测,builder release == GitHub == GitCode == dc85b0a6…5aae5b2

所以我直接在本分支补了一个 commit,让 ["16.1.0"] 走 xlings-res —— GLOBAL / CN 都由 sentinel 自动拼 URL,CN 用户不必翻墙拉 GitHub release。

用的是当前 spec 2 的写法url = "XLINGS_RES" + 逐 arch sha256,同 nasm / perl / mcpp),而不是老的 ["16.1.0"] = "XLINGS_RES" 裸字符串:

    spec = "2",
    ...
            ["16.1.0"] = {
                url = "XLINGS_RES",
                sha256 = {
                    x86_64 = "dc85b0a63a6e4582e3122d9f64025d324b1f69c8dc57bb093ceba40a25aae5b2",
                },
            },

裸字符串那种形式不带 checksum,等于让这个 141MB 工具链无校验安装 —— 这正是 spec 2 的 res 形态要堵的口子(见 docs/V2/xpackage-spec.md "Shape res")。spec 随之从 "1" 升到 "2",索引里已有 53 个 recipe 用 spec 2,compat floor 不动。

顺带一提,pkgs/a/aarch64-linux-musl-gcc.lua 目前还是裸 "XLINGS_RES"(同样无校验),可以另开 PR 一起补上 —— 不在本 PR 范围内。

三、顺带修正的注释(不影响功能)

原 xpm 注释是从 aarch64 复制的,描述了一个并没有发生的构建,同一 commit 里已改:

  1. 宿主二进制是 glibc-static,不是 musl-static。 注释称用 <host>-linux-musl-gcc + -g0 -Os/LDFLAGS=-s,但你贴出的 config.mak 实际是裸 CC="gcc -static --static",二进制里能 grep 到 Fatal glibc error实践上无害:完全静态、无 PT_INTERP/NEEDEDlibnss_/__nss 引用为 0,所以注释里担心的"冷 sandbox g++ exit 127"不会发生。代价只有体积 —— 141MB vs aarch64 的 114MB(-O2 而非 -Os)。下次重建建议切到 musl 宿主编译器 + strip flags 对齐其他工具链,但不阻塞本 PR。
  2. "BOTH host assets" 是残留措辞 —— 只有 x86_64 一个宿主资产,archs = {"x86_64"} 是对的。

另外 PR 正文里"XLINGS_RES sentinel"那句在第二个 commit 之后就过期了,现在又重新准确(且带上了 checksum)🙂

替换后的 recipe 与 pkgs/a/aarch64-linux-musl-gcc.lua 做归一化 diff(s/riscv64/aarch64/)只剩 archskeywords、版本这几处合理差异,结构完全对齐。

LGTM。

@Sunrisepeak
Sunrisepeak force-pushed the riscv64-linux-musl-gcc branch from b03ef7b to 0adcf48 Compare August 9, 2026 15:18
…c 2)

xlings-res/riscv64-linux-musl-gcc@16.1.0 is live on both forges (github +
gitcode) carrying the same bytes as the builder release — three-way sha256
dc85b0a63a6e4582e3122d9f64025d324b1f69c8dc57bb093ceba40a25aae5b2, checked by
downloading the asset back from each. So the explicit builder-repo URL is no
longer needed: XLINGS_RES auto-URLs the host-matching asset for GLOBAL and CN
alike, and CN users stop being routed at a GitHub release.

Use the current spec-2 entry shape (`url = "XLINGS_RES"` + per-arch `sha256`,
as in nasm/perl/mcpp) rather than the bare `["16.1.0"] = "XLINGS_RES"` string.
The bare form carries NO checksum — it would install a 141MB toolchain
unverified, which is the gap the spec-2 shape exists to close. spec bumped to
"2" accordingly; the index already floors at that (53 recipes use it), so this
moves no compat floor.

Also correct the xpm comment, which was copied from aarch64 and described a
build that did not happen: there is ONE host asset (x86_64), and it is
glibc-static, not musl-static — the builder used the plain glibc gcc with
`CC/CXX="gcc -static --static"` and no `-g0 -Os`/`LDFLAGS=-s`. Harmless here:
verified no PT_INTERP, no NEEDED, stripped, and zero libnss_/__nss references,
so "no deps / runs on a cold sandbox" still holds. The only cost is size
(141MB vs aarch64's 114MB), noted inline for the next rebuild.

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
@Sunrisepeak
Sunrisepeak force-pushed the riscv64-linux-musl-gcc branch from 0adcf48 to 7069124 Compare August 9, 2026 15:23
@Sunrisepeak
Sunrisepeak merged commit 66adc53 into openxlings:main Aug 9, 2026
8 checks passed
Sunrisepeak pushed a commit to lildengzi/mcpp that referenced this pull request Aug 10, 2026
- triple.cppm: mark riscv64-linux-musl verified, pin gcc@16.1.0
- cross-build-test.yml: add riscv64-linux-musl qemu matrix row
- 103_target_vocabulary.sh: use aarch64-linux-gnu as the planned-tier example
- test_linkmodel.cpp: assert riscv64 loader names (musl + glibc)
- README/README.zh-CN: riscv64-linux-musl now verified with rv64gc/lp64d note

Requires xim riscv64-linux-musl-gcc@16.1.0 (openxlings/xim-pkgindex#585).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants