@@ -4,7 +4,6 @@ use shlex;
44
55use std:: io:: { BufRead , BufReader } ;
66use std:: path:: PathBuf ;
7- use std:: process:: Command ;
87use std:: { env, fs} ;
98
109const INCLUDED_TYPES : & [ & str ] = & [ "file_system_type" , "mode_t" , "umode_t" , "ctl_table" ] ;
@@ -85,32 +84,43 @@ fn handle_kernel_version_cfg(bindings_path: &PathBuf) {
8584 }
8685}
8786
87+ fn prepare_cflags ( cflags : & str , kernel_dir : & str ) -> Vec < String > {
88+ let cflag_parts = shlex:: split ( & cflags) . unwrap ( ) ;
89+ let mut cflag_iter = cflag_parts. iter ( ) ;
90+ let mut kernel_args = vec ! [ ] ;
91+ while let Some ( arg) = cflag_iter. next ( ) {
92+ if arg. starts_with ( "-I" ) {
93+ kernel_args. push ( format ! ( "-I{}/{}" , kernel_dir, & arg[ 2 ..] ) ) ;
94+ } else if arg == "-include" {
95+ kernel_args. push ( arg. to_string ( ) ) ;
96+ kernel_args. push ( format ! ( "{}/{}" , kernel_dir, cflag_iter. next( ) . unwrap( ) ) ) ;
97+ } else {
98+ kernel_args. push ( arg. to_string ( ) ) ;
99+ }
100+ }
101+ return kernel_args;
102+ }
103+
88104fn main ( ) {
89105 println ! ( "cargo:rerun-if-env-changed=KDIR" ) ;
90106 println ! ( "cargo:rerun-if-env-changed=CLANG" ) ;
107+ println ! ( "cargo:rerun-if-env-changed=KERNEL_CLFAGS" ) ;
91108 println ! ( "cargo:rerun-if-changed=kernel-cflags-finder/Makefile" ) ;
92- let output = Command :: new ( "make" )
93- . arg ( "-C" )
94- . arg ( "kernel-cflags-finder" )
95- . arg ( "-s" )
96- . output ( )
97- . unwrap ( ) ;
98- if !output. status . success ( ) {
99- eprintln ! ( "kernel-cflags-finder did not succeed" ) ;
100- eprintln ! ( "stdout: {}" , std:: str :: from_utf8( & output. stdout) . unwrap( ) ) ;
101- eprintln ! ( "stderr: {}" , std:: str :: from_utf8( & output. stderr) . unwrap( ) ) ;
102- std:: process:: exit ( 1 ) ;
103- }
109+
110+ let kernel_cflags = env:: var ( "KERNEL_CLFAGS" ) . expect ( "Must be invoked from kernel makefile" ) ;
111+ let kernel_dir = env:: var ( "KDIR" ) . expect ( "Must be invoked from kernel makefile" ) ;
112+ let kernel_args = prepare_cflags ( & kernel_cflags, & kernel_dir) ;
104113
105114 let mut builder = bindgen:: Builder :: default ( )
106115 . use_core ( )
107116 . ctypes_prefix ( "c_types" )
108117 . derive_default ( true )
109118 . rustfmt_bindings ( true ) ;
110119
120+ // TODO: parameterize
111121 builder = builder. clang_arg ( "--target=x86_64-linux-kernel" ) ;
112- for arg in shlex :: split ( std :: str :: from_utf8 ( & output . stdout ) . unwrap ( ) ) . unwrap ( ) {
113- builder = builder. clang_arg ( arg. to_string ( ) ) ;
122+ for arg in kernel_args . iter ( ) {
123+ builder = builder. clang_arg ( arg. clone ( ) ) ;
114124 }
115125
116126 println ! ( "cargo:rerun-if-changed=src/bindings_helper.h" ) ;
@@ -138,12 +148,11 @@ fn main() {
138148 handle_kernel_version_cfg ( & out_path. join ( "bindings.rs" ) ) ;
139149
140150 let mut builder = cc:: Build :: new ( ) ;
141- println ! ( "cargo:rerun-if-env-changed=CLANG" ) ;
142151 builder. compiler ( env:: var ( "CLANG" ) . unwrap_or ( "clang" . to_string ( ) ) ) ;
143152 builder. target ( "x86_64-linux-kernel" ) ;
144153 builder. warnings ( false ) ;
145154 builder. file ( "src/helpers.c" ) ;
146- for arg in shlex :: split ( std :: str :: from_utf8 ( & output . stdout ) . unwrap ( ) ) . unwrap ( ) {
155+ for arg in kernel_args . iter ( ) {
147156 builder. flag ( & arg) ;
148157 }
149158 builder. compile ( "helpers" ) ;
0 commit comments