Merge pull request #4 from EasyTier/fix-riscv64gc-bindgen

fix: support riscv64gc bindgen target
This commit is contained in:
fanyang
2026-05-22 23:58:41 +08:00
committed by GitHub
parent e9042b87c5
commit d7427c22d7
2 changed files with 46 additions and 13 deletions
+5 -1
View File
@@ -141,7 +141,7 @@ jobs:
# ──────────────────────────────────────────────
# Cross-compilation via zigbuild (musl targets)
# 2 targets × 2 profiles = 4 jobs
# 3 targets × 2 profiles = 6 jobs
# ──────────────────────────────────────────────
cross:
name: Cross ${{ matrix.target }} (${{ matrix.profile }})
@@ -158,6 +158,10 @@ jobs:
profile: debug
- target: x86_64-unknown-linux-musl
profile: release
- target: riscv64gc-unknown-linux-musl
profile: debug
- target: riscv64gc-unknown-linux-musl
profile: release
steps:
- uses: actions/checkout@v4
+41 -12
View File
@@ -4,7 +4,7 @@ use std::process::{Command, Stdio};
fn zig_target(target: &str) -> String {
let mut parts = target.split('-');
let arch = parts.next().unwrap_or(target);
let arch = clang_arch(parts.next().unwrap_or(target));
let _vendor = parts.next();
let rest = parts.collect::<Vec<_>>();
@@ -15,17 +15,46 @@ fn zig_target(target: &str) -> String {
}
}
fn clang_arch(arch: &str) -> &str {
match arch {
"riscv64gc" => "riscv64",
_ => arch,
}
}
fn clang_target(target: &str) -> String {
let mut parts = target.split('-');
let arch = clang_arch(parts.next().unwrap_or(target));
let rest = parts.collect::<Vec<_>>();
if rest.is_empty() {
arch.to_owned()
} else {
format!("{arch}-{}", rest.join("-"))
}
}
fn clang_target_args(target: &str) -> Vec<String> {
let mut args = vec![format!("--target={}", clang_target(target))];
if target.starts_with("riscv64gc-") {
args.push("-march=rv64gc".to_owned());
}
args
}
fn zig_include_dirs(target: &str) -> Option<Vec<String>> {
let args = [
"cc".to_owned(),
format!("--target={}", zig_target(target)),
"-E".to_owned(),
"-x".to_owned(),
"c".to_owned(),
"-".to_owned(),
"-v".to_owned(),
];
let output = Command::new("zig")
.args([
"cc",
&format!("--target={}", zig_target(target)),
"-E",
"-x",
"c",
"-",
"-v",
])
.args(args)
.stdin(Stdio::null())
.output()
.ok()?;
@@ -79,7 +108,7 @@ fn generate_bindings(target: &str) {
let host = env::var("HOST").unwrap();
if target != host {
if is_zigbuild(target) {
bindings = bindings.clang_arg(format!("--target={}", zig_target(target)));
bindings = bindings.clang_args(clang_target_args(target));
if let Some(include_dirs) = zig_include_dirs(target) {
for include_dir in include_dirs {
@@ -87,7 +116,7 @@ fn generate_bindings(target: &str) {
}
}
} else {
bindings = bindings.clang_arg(format!("--target={target}"));
bindings = bindings.clang_args(clang_target_args(target));
}
}