@@ -4,7 +4,6 @@ use shlex;
4
4
5
5
use std:: io:: { BufRead , BufReader } ;
6
6
use std:: path:: PathBuf ;
7
- use std:: process:: Command ;
8
7
use std:: { env, fs} ;
9
8
10
9
const INCLUDED_TYPES : & [ & str ] = & [ "file_system_type" , "mode_t" , "umode_t" , "ctl_table" ] ;
@@ -85,32 +84,43 @@ fn handle_kernel_version_cfg(bindings_path: &PathBuf) {
85
84
}
86
85
}
87
86
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
+
88
104
fn main ( ) {
89
105
println ! ( "cargo:rerun-if-env-changed=KDIR" ) ;
90
106
println ! ( "cargo:rerun-if-env-changed=CLANG" ) ;
107
+ println ! ( "cargo:rerun-if-env-changed=KERNEL_CLFAGS" ) ;
91
108
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) ;
104
113
105
114
let mut builder = bindgen:: Builder :: default ( )
106
115
. use_core ( )
107
116
. ctypes_prefix ( "c_types" )
108
117
. derive_default ( true )
109
118
. rustfmt_bindings ( true ) ;
110
119
120
+ // TODO: parameterize
111
121
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 ( ) ) ;
114
124
}
115
125
116
126
println ! ( "cargo:rerun-if-changed=src/bindings_helper.h" ) ;
@@ -138,12 +148,11 @@ fn main() {
138
148
handle_kernel_version_cfg ( & out_path. join ( "bindings.rs" ) ) ;
139
149
140
150
let mut builder = cc:: Build :: new ( ) ;
141
- println ! ( "cargo:rerun-if-env-changed=CLANG" ) ;
142
151
builder. compiler ( env:: var ( "CLANG" ) . unwrap_or ( "clang" . to_string ( ) ) ) ;
143
152
builder. target ( "x86_64-linux-kernel" ) ;
144
153
builder. warnings ( false ) ;
145
154
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 ( ) {
147
156
builder. flag ( & arg) ;
148
157
}
149
158
builder. compile ( "helpers" ) ;
0 commit comments