@@ -4,7 +4,7 @@ use std::process::{Command, Stdio};
44
55fn 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+
1845fn 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