@@ -53,6 +53,14 @@ const OPAQUE_TYPES: &[&str] = &[
5353 // and https://github.com/rust-lang/rust-bindgen/issues/1538
5454 "desc_struct" ,
5555 "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" ,
5664] ;
5765
5866fn handle_kernel_version_cfg ( bindings_path : & PathBuf ) {
@@ -86,10 +94,25 @@ fn handle_kernel_version_cfg(bindings_path: &PathBuf) {
8694 }
8795 if major >= 4 {
8896 // 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 } {
9098 println ! ( "cargo:rustc-cfg=kernel_4_{}_0_or_greater" , x) ;
9199 }
92100 }
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+ }
93116}
94117
95118fn handle_kernel_symbols_cfg ( symvers_path : & PathBuf ) {
@@ -153,6 +176,12 @@ fn main() {
153176
154177 builder = builder. clang_arg ( format ! ( "--target={}" , target) ) ;
155178 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+ }
156185 builder = builder. clang_arg ( arg. clone ( ) ) ;
157186 }
158187
@@ -179,16 +208,26 @@ fn main() {
179208 . expect ( "Couldn't write bindings!" ) ;
180209
181210 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+ ) ;
182217 handle_kernel_symbols_cfg ( & PathBuf :: from ( & kernel_dir) . join ( "Module.symvers" ) ) ;
183218
184219 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) ;
186222 builder. target ( & target) ;
187223 builder. warnings ( false ) ;
188224 println ! ( "cargo:rerun-if-changed=src/helpers.c" ) ;
189225 builder. file ( "src/helpers.c" ) ;
190226 for arg in kernel_args. iter ( ) {
191227 builder. flag ( & arg) ;
192228 }
229+ if & compiler == "gcc" {
230+ builder. flag ( "-fno-pie" ) ;
231+ }
193232 builder. compile ( "helpers" ) ;
194233}
0 commit comments