Skip to content

Commit d7427c2

Browse files
authored
Merge pull request #4 from EasyTier/fix-riscv64gc-bindgen
fix: support riscv64gc bindgen target
1 parent e9042b8 commit d7427c2

2 files changed

Lines changed: 46 additions & 13 deletions

File tree

.github/workflows/rust.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ jobs:
141141
142142
# ──────────────────────────────────────────────
143143
# Cross-compilation via zigbuild (musl targets)
144-
# 2 targets × 2 profiles = 4 jobs
144+
# 3 targets × 2 profiles = 6 jobs
145145
# ──────────────────────────────────────────────
146146
cross:
147147
name: Cross ${{ matrix.target }} (${{ matrix.profile }})
@@ -158,6 +158,10 @@ jobs:
158158
profile: debug
159159
- target: x86_64-unknown-linux-musl
160160
profile: release
161+
- target: riscv64gc-unknown-linux-musl
162+
profile: debug
163+
- target: riscv64gc-unknown-linux-musl
164+
profile: release
161165

162166
steps:
163167
- uses: actions/checkout@v4

build.rs

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::process::{Command, Stdio};
44

55
fn zig_target(target: &str) -> String {
66
let mut parts = target.split('-');
7-
let arch = parts.next().unwrap_or(target);
7+
let arch = clang_arch(parts.next().unwrap_or(target));
88
let _vendor = parts.next();
99
let rest = parts.collect::<Vec<_>>();
1010

@@ -15,17 +15,46 @@ fn zig_target(target: &str) -> String {
1515
}
1616
}
1717

18+
fn clang_arch(arch: &str) -> &str {
19+
match arch {
20+
"riscv64gc" => "riscv64",
21+
_ => arch,
22+
}
23+
}
24+
25+
fn clang_target(target: &str) -> String {
26+
let mut parts = target.split('-');
27+
let arch = clang_arch(parts.next().unwrap_or(target));
28+
let rest = parts.collect::<Vec<_>>();
29+
30+
if rest.is_empty() {
31+
arch.to_owned()
32+
} else {
33+
format!("{arch}-{}", rest.join("-"))
34+
}
35+
}
36+
37+
fn clang_target_args(target: &str) -> Vec<String> {
38+
let mut args = vec![format!("--target={}", clang_target(target))];
39+
if target.starts_with("riscv64gc-") {
40+
args.push("-march=rv64gc".to_owned());
41+
}
42+
args
43+
}
44+
1845
fn zig_include_dirs(target: &str) -> Option<Vec<String>> {
46+
let args = [
47+
"cc".to_owned(),
48+
format!("--target={}", zig_target(target)),
49+
"-E".to_owned(),
50+
"-x".to_owned(),
51+
"c".to_owned(),
52+
"-".to_owned(),
53+
"-v".to_owned(),
54+
];
55+
1956
let output = Command::new("zig")
20-
.args([
21-
"cc",
22-
&format!("--target={}", zig_target(target)),
23-
"-E",
24-
"-x",
25-
"c",
26-
"-",
27-
"-v",
28-
])
57+
.args(args)
2958
.stdin(Stdio::null())
3059
.output()
3160
.ok()?;
@@ -79,15 +108,15 @@ fn generate_bindings(target: &str) {
79108
let host = env::var("HOST").unwrap();
80109
if target != host {
81110
if is_zigbuild(target) {
82-
bindings = bindings.clang_arg(format!("--target={}", zig_target(target)));
111+
bindings = bindings.clang_args(clang_target_args(target));
83112

84113
if let Some(include_dirs) = zig_include_dirs(target) {
85114
for include_dir in include_dirs {
86115
bindings = bindings.clang_arg("-isystem").clang_arg(include_dir);
87116
}
88117
}
89118
} else {
90-
bindings = bindings.clang_arg(format!("--target={target}"));
119+
bindings = bindings.clang_args(clang_target_args(target));
91120
}
92121
}
93122

0 commit comments

Comments
 (0)