5
5
6
6
use std:: {
7
7
fs:: File ,
8
- path:: { Path , PathBuf } ,
8
+ io:: { Read , Seek } ,
9
+ path:: PathBuf ,
9
10
} ;
10
11
11
12
include ! ( "clang_info.rs" ) ;
@@ -26,6 +27,16 @@ impl Builder {
26
27
27
28
ar. follow_symlinks ( false ) ;
28
29
ar. append_dir_all ( "." , BPF_H ) . unwrap ( ) ;
30
+
31
+ let vmlinux_dir = tempfile:: tempdir ( ) . unwrap ( ) ;
32
+ let mut vmlinux_tar_zst = File :: open ( "vmlinux.tar.zst" ) . unwrap ( ) ;
33
+ let vmlinux_tar = ruzstd:: decoding:: StreamingDecoder :: new ( & mut vmlinux_tar_zst) . unwrap ( ) ;
34
+ tar:: Archive :: new ( vmlinux_tar)
35
+ . unpack ( vmlinux_dir. path ( ) )
36
+ . unwrap ( ) ;
37
+ ar. append_dir_all ( "." , vmlinux_dir. path ( ) . join ( "vmlinux" ) )
38
+ . unwrap ( ) ;
39
+
29
40
ar. finish ( ) . unwrap ( ) ;
30
41
31
42
for ent in walkdir:: WalkDir :: new ( BPF_H ) {
@@ -40,16 +51,43 @@ impl Builder {
40
51
let out_dir = env:: var ( "OUT_DIR" ) . unwrap ( ) ;
41
52
let clang = ClangInfo :: new ( ) . unwrap ( ) ;
42
53
let kernel_target = clang. kernel_target ( ) . unwrap ( ) ;
43
- let vmlinux_h = Path :: new ( & BPF_H )
44
- . join ( "arch" )
45
- . join ( kernel_target)
46
- . join ( "vmlinux.h" )
47
- . to_str ( )
54
+
55
+ let mut vmlinux_tar_zst = File :: open ( "vmlinux.tar.zst" ) . unwrap ( ) ;
56
+
57
+ let mut vmlinux_h = String :: new ( ) ;
58
+
59
+ // vmlinux.h is a symlink. dereference it here.
60
+ let search: PathBuf = format ! ( "vmlinux/arch/{kernel_target}/vmlinux.h" ) . into ( ) ;
61
+
62
+ let mut vmlinux_tar =
63
+ ruzstd:: decoding:: StreamingDecoder :: new ( & mut vmlinux_tar_zst) . unwrap ( ) ;
64
+ let mut archive = tar:: Archive :: new ( & mut vmlinux_tar) ;
65
+ let vmlinux_link_entry = archive
66
+ . entries ( )
67
+ . unwrap ( )
68
+ . find ( |x| x. as_ref ( ) . unwrap ( ) . path ( ) . unwrap ( ) == search. as_path ( ) )
69
+ . unwrap ( )
70
+ . unwrap ( ) ;
71
+
72
+ let vmlinux_path = PathBuf :: from ( vmlinux_link_entry. path ( ) . unwrap ( ) )
73
+ . parent ( )
74
+ . unwrap ( )
75
+ . join ( vmlinux_link_entry. link_name ( ) . unwrap ( ) . unwrap ( ) ) ;
76
+
77
+ vmlinux_tar_zst. rewind ( ) . unwrap ( ) ;
78
+ let vmlinux_tar = ruzstd:: decoding:: StreamingDecoder :: new ( & mut vmlinux_tar_zst) . unwrap ( ) ;
79
+
80
+ tar:: Archive :: new ( vmlinux_tar)
81
+ . entries ( )
82
+ . unwrap ( )
83
+ . find ( |x| x. as_ref ( ) . unwrap ( ) . path ( ) . unwrap ( ) == vmlinux_path. as_path ( ) )
84
+ . unwrap ( )
48
85
. unwrap ( )
49
- . to_string ( ) ;
86
+ . read_to_string ( & mut vmlinux_h)
87
+ . unwrap ( ) ;
50
88
51
89
let bindings = bindgen:: Builder :: default ( )
52
- . header ( vmlinux_h)
90
+ . header_contents ( & search . to_string_lossy ( ) , & vmlinux_h)
53
91
. allowlist_type ( "scx_exit_kind" )
54
92
. allowlist_type ( "scx_consts" )
55
93
. parse_callbacks ( Box :: new ( bindgen:: CargoCallbacks :: new ( ) ) )
0 commit comments