@@ -53,6 +53,14 @@ const OPAQUE_TYPES: &[&str] = &[
53
53
// and https://github.com/rust-lang/rust-bindgen/issues/1538
54
54
"desc_struct" ,
55
55
"xregs_state" ,
56
+ "xsave_struct" ,
57
+ ] ;
58
+ const CLANG_ARGS_BLACKLIST : [ & ' static str ; 5 ] = [
59
+ "-maccumulate-outgoing-args" ,
60
+ "-mpreferred-stack-boundary=3" ,
61
+ "-mindirect-branch=thunk-extern" ,
62
+ "-mindirect-branch-register" ,
63
+ "-fconserve-stack" ,
56
64
] ;
57
65
58
66
fn handle_kernel_version_cfg ( bindings_path : & PathBuf ) {
@@ -86,10 +94,25 @@ fn handle_kernel_version_cfg(bindings_path: &PathBuf) {
86
94
}
87
95
if major >= 4 {
88
96
// We don't currently support anything older than 4.4
89
- for x in 4 ..=if major > 4 { 20 } else { minor } {
97
+ for x in 1 ..=if major > 4 { 20 } else { minor } {
90
98
println ! ( "cargo:rustc-cfg=kernel_4_{}_0_or_greater" , x) ;
91
99
}
92
100
}
101
+ if major >= 3 {
102
+ for x in 1 ..=if major > 3 { 19 } else { minor } {
103
+ println ! ( "cargo:rustc-cfg=kernel_3_{}_0_or_greater" , x) ;
104
+ }
105
+ }
106
+ }
107
+
108
+ fn handle_kernel_rhel_kabi ( fs_ops_path : & PathBuf ) {
109
+ let f = BufReader :: new ( fs:: File :: open ( fs_ops_path) . unwrap ( ) ) ;
110
+ for line in f. lines ( ) {
111
+ if line. unwrap ( ) . contains ( "RH_KABI_REPLACE" ) {
112
+ println ! ( "cargo:rustc-cfg=kernel_rh_kabi" ) ;
113
+ break ;
114
+ }
115
+ }
93
116
}
94
117
95
118
fn handle_kernel_symbols_cfg ( symvers_path : & PathBuf ) {
@@ -153,6 +176,12 @@ fn main() {
153
176
154
177
builder = builder. clang_arg ( format ! ( "--target={}" , target) ) ;
155
178
for arg in kernel_args. iter ( ) {
179
+ if CLANG_ARGS_BLACKLIST . contains ( & arg. as_str ( ) ) {
180
+ continue ;
181
+ }
182
+ if arg. as_str ( ) == "-DOS_CENTOS" {
183
+ println ! ( "cargo:rustc-cfg=os_centos" )
184
+ }
156
185
builder = builder. clang_arg ( arg. clone ( ) ) ;
157
186
}
158
187
@@ -179,16 +208,26 @@ fn main() {
179
208
. expect ( "Couldn't write bindings!" ) ;
180
209
181
210
handle_kernel_version_cfg ( & out_path. join ( "bindings.rs" ) ) ;
211
+ handle_kernel_rhel_kabi (
212
+ & PathBuf :: from ( & kernel_dir)
213
+ . parent ( )
214
+ . unwrap ( )
215
+ . join ( "source/include/linux/fs.h" ) ,
216
+ ) ;
182
217
handle_kernel_symbols_cfg ( & PathBuf :: from ( & kernel_dir) . join ( "Module.symvers" ) ) ;
183
218
184
219
let mut builder = cc:: Build :: new ( ) ;
185
- builder. compiler ( env:: var ( "CC" ) . unwrap_or_else ( |_| "clang" . to_string ( ) ) ) ;
220
+ let compiler = env:: var ( "CC" ) . unwrap_or_else ( |_| "clang" . to_string ( ) ) ;
221
+ builder. compiler ( & compiler) ;
186
222
builder. target ( & target) ;
187
223
builder. warnings ( false ) ;
188
224
println ! ( "cargo:rerun-if-changed=src/helpers.c" ) ;
189
225
builder. file ( "src/helpers.c" ) ;
190
226
for arg in kernel_args. iter ( ) {
191
227
builder. flag ( & arg) ;
192
228
}
229
+ if & compiler == "gcc" {
230
+ builder. flag ( "-fno-pie" ) ;
231
+ }
193
232
builder. compile ( "helpers" ) ;
194
233
}
0 commit comments