@@ -153,28 +153,36 @@ impl BpfObjBuilder {
153
153
f ( & compiler_args)
154
154
}
155
155
156
- /// Build a BPF object file.
157
- pub fn build ( & mut self , src : & Path , dst : & Path ) -> Result < CompilationOutput > {
156
+ /// Build a BPF object file from a set of input files.
157
+ pub fn build_many < S , P > ( & mut self , srcs : S , dst : & Path ) -> Result < Vec < CompilationOutput > >
158
+ where
159
+ S : IntoIterator < Item = P > ,
160
+ P : AsRef < Path > ,
161
+ {
158
162
let obj_dir = tempdir ( ) . context ( "failed to create temporary directory" ) ?;
159
163
let mut linker = libbpf_rs:: Linker :: new ( dst)
160
164
. context ( "failed to instantiate libbpf object file linker" ) ?;
161
165
162
166
let output = self . with_compiler_args ( |compiler_args| {
163
- let tmp_dst = obj_dir. path ( ) . join ( src. file_name ( ) . with_context ( || {
164
- format ! (
165
- "input path `{}` does not have a proper file name" ,
166
- src. display( )
167
- )
168
- } ) ?) ;
169
-
170
- let output = Self :: compile_single ( src, & tmp_dst, & self . compiler , compiler_args)
171
- . with_context ( || format ! ( "failed to compile `{}`" , src. display( ) ) ) ?;
172
-
173
- linker
174
- . add_file ( tmp_dst)
175
- . context ( "failed to add object file to BPF linker" ) ?;
176
-
177
- Ok ( output)
167
+ srcs. into_iter ( )
168
+ . map ( |src| {
169
+ let src = src. as_ref ( ) ;
170
+ let tmp_dst = obj_dir. path ( ) . join ( src. file_name ( ) . with_context ( || {
171
+ format ! (
172
+ "input path `{}` does not have a proper file name" ,
173
+ src. display( )
174
+ )
175
+ } ) ?) ;
176
+
177
+ let output = Self :: compile_single ( src, & tmp_dst, & self . compiler , compiler_args)
178
+ . with_context ( || format ! ( "failed to compile `{}`" , src. display( ) ) ) ?;
179
+
180
+ linker
181
+ . add_file ( tmp_dst)
182
+ . context ( "failed to add object file to BPF linker" ) ?;
183
+ Ok ( output)
184
+ } )
185
+ . collect :: < Result < _ , _ > > ( )
178
186
} ) ?;
179
187
180
188
// The resulting object file may contain DWARF information
@@ -187,6 +195,16 @@ impl BpfObjBuilder {
187
195
188
196
Ok ( output)
189
197
}
198
+
199
+ /// Build a BPF object file.
200
+ pub fn build ( & mut self , src : & Path , dst : & Path ) -> Result < CompilationOutput > {
201
+ self . build_many ( [ src] , dst) . map ( |vec| {
202
+ // SANITY: We pass in a single file we `build_many` is
203
+ // guaranteed to produce as many outputs as input
204
+ // files; so there must be one.
205
+ vec. into_iter ( ) . next ( ) . unwrap ( )
206
+ } )
207
+ }
190
208
}
191
209
192
210
impl Default for BpfObjBuilder {
0 commit comments