@@ -284,54 +284,33 @@ fn make_zlib(compiler: &cc::Tool, src_dir: &path::Path) {
284
284
emit_rerun_directives_for_contents ( & src_dir) ;
285
285
}
286
286
287
- fn make_elfutils ( compiler : & cc:: Tool , src_dir : & path:: Path , out_dir : & path:: Path ) {
287
+ fn make_elfutils ( compiler : & cc:: Tool , src_dir : & path:: Path , _ : & path:: Path ) {
288
288
// lock README such that if two crates are trying to compile
289
289
// this at the same time (eg libbpf-rs libbpf-cargo)
290
290
// they wont trample each other
291
- let file = std:: fs:: File :: open ( src_dir. join ( "elfutils/README" ) ) . unwrap ( ) ;
292
- let _lock = fcntl:: Flock :: lock ( file, fcntl:: FlockArg :: LockExclusive ) . unwrap ( ) ;
293
-
294
- let flags = compiler
295
- . cflags_env ( )
296
- . into_string ( )
297
- . expect ( "failed to get cflags" ) ;
298
- let mut cflags: String = flags
299
- . split_whitespace ( )
300
- . filter_map ( |arg| {
301
- if arg != "-static" {
302
- // compilation fails with -static flag
303
- Some ( format ! ( " {arg}" ) )
304
- } else {
305
- None
306
- }
307
- } )
308
- . collect ( ) ;
291
+ let project_dir = src_dir. join ( "elfutils" ) ;
309
292
310
- #[ cfg( target_arch = "aarch64" ) ]
311
- cflags. push_str ( " -Wno-error=stringop-overflow" ) ;
312
- cflags. push_str ( & format ! ( " -I{}/zlib/" , src_dir. display( ) ) ) ;
313
-
314
- let status = process:: Command :: new ( "autoreconf" )
315
- . arg ( "--install" )
316
- . arg ( "--force" )
317
- . current_dir ( src_dir. join ( "elfutils" ) )
318
- . status ( )
319
- . expect ( "could not execute make" ) ;
293
+ let file = std:: fs:: File :: open ( project_dir. join ( "README" ) ) . unwrap ( ) ;
294
+ let _lock = fcntl:: Flock :: lock ( file, fcntl:: FlockArg :: LockExclusive ) . unwrap ( ) ;
320
295
321
- assert ! ( status. success( ) , "make failed" ) ;
296
+ let libelf_dir = project_dir. join ( "libelf" ) ;
297
+ let project_dir = project_dir. to_str ( ) . unwrap ( ) ;
322
298
323
- // location of libz.a
324
- let out_lib = format ! ( "-L{}" , out_dir. display( ) ) ;
325
- let status = process:: Command :: new ( "./configure" )
326
- . arg ( "--enable-maintainer-mode" )
327
- . arg ( "--disable-debuginfod" )
328
- . arg ( "--disable-libdebuginfod" )
329
- . arg ( "--disable-demangler" )
330
- . arg ( "--without-zstd" )
331
- . arg ( "--prefix" )
332
- . arg ( src_dir. join ( "elfutils/prefix_dir" ) )
333
- . arg ( "--host" )
334
- . arg ( {
299
+ let mut build_options = vec ! [
300
+ "--enable-maintainer-mode" ,
301
+ "--disable-debuginfod" ,
302
+ "--disable-libdebuginfod" ,
303
+ "--without-lzma" ,
304
+ "--without-bzlib" ,
305
+ "--without-zstd" ,
306
+ ]
307
+ . into_iter ( )
308
+ . map ( |s| s. to_string ( ) )
309
+ . collect :: < Vec < String > > ( ) ;
310
+
311
+ if !build_android ( ) {
312
+ build_options. push ( "--host" . to_owned ( ) ) ;
313
+ build_options. push ( {
335
314
let arch = env:: var ( "CARGO_CFG_TARGET_ARCH" ) . unwrap ( ) ;
336
315
let arch = match arch. as_str ( ) {
337
316
"riscv64gc" => "riscv64" ,
@@ -342,50 +321,58 @@ fn make_elfutils(compiler: &cc::Tool, src_dir: &path::Path, out_dir: &path::Path
342
321
let env = env:: var ( "CARGO_CFG_TARGET_ENV" ) . unwrap ( ) ;
343
322
let os = env:: var ( "CARGO_CFG_TARGET_OS" ) . unwrap ( ) ;
344
323
format ! ( "{arch}-{vendor}-{os}-{env}" )
345
- } )
346
- . arg ( "--libdir" )
347
- . arg ( out_dir)
348
- . env ( "CC" , compiler. path ( ) )
349
- . env ( "CXX" , compiler. path ( ) )
350
- . env ( "CFLAGS" , & cflags)
351
- . env ( "CXXFLAGS" , & cflags)
352
- . env ( "LDFLAGS" , & out_lib)
353
- . current_dir ( src_dir. join ( "elfutils" ) )
354
- . status ( )
355
- . expect ( "could not execute make" ) ;
324
+ } ) ;
325
+ }
356
326
357
- assert ! ( status . success ( ) , "make failed" ) ;
327
+ autoconf ( project_dir ) ;
358
328
359
- // Build in elfutils/lib because building libelf requires it.
360
- let status = process:: Command :: new ( "make" )
361
- . arg ( "-j" )
362
- . arg ( format ! ( "{}" , num_cpus( ) ) )
363
- . arg ( "BUILD_STATIC_ONLY=y" )
364
- . current_dir ( src_dir. join ( "elfutils/lib" ) )
365
- . status ( )
366
- . expect ( "could not execute make" ) ;
329
+ configure ( project_dir, build_options. iter ( ) . map ( |s| s. as_str ( ) ) ) ;
367
330
368
- assert ! ( status . success ( ) , "make failed" ) ;
331
+ let mut builder = cc :: Build :: new ( ) ;
369
332
370
- // Build libelf only
371
- let status = process:: Command :: new ( "make" )
372
- . arg ( "install" )
373
- . arg ( "-j" )
374
- . arg ( format ! ( "{}" , num_cpus( ) ) )
375
- . arg ( "BUILD_STATIC_ONLY=y" )
376
- . current_dir ( src_dir. join ( "elfutils/libelf" ) )
377
- . status ( )
378
- . expect ( "could not execute make" ) ;
333
+ builder
334
+ . flag ( "-DHAVE_CONFIG_H" )
335
+ . flag ( "-D_GNU_SOURCE" )
336
+ . include ( project_dir)
337
+ . include ( src_dir. join ( "zlib" ) )
338
+ . include ( format ! ( "{project_dir}/lib" ) )
339
+ . include ( format ! ( "{project_dir}/include" ) )
340
+ . include ( format ! ( "{project_dir}/libelf" ) ) ;
379
341
380
- assert ! ( status. success( ) , "make failed" ) ;
342
+ if build_android ( ) {
343
+ builder
344
+ . flag ( "-DNAMES=1000" )
345
+ . flag ( "-std=gnu99" )
346
+ . flag ( "-D_FILE_OFFSET_BITS=64" )
347
+ . flag ( "-includeAndroidFixup.h" )
348
+ . include ( src_dir. join ( "android" ) ) ;
349
+ } else {
350
+ #[ cfg( target_arch = "aarch64" ) ]
351
+ builder. flag ( "-Wno-error=stringop-overflow" ) ;
381
352
382
- let status = process:: Command :: new ( "make" )
383
- . arg ( "distclean" )
384
- . current_dir ( src_dir. join ( "elfutils" ) )
385
- . status ( )
386
- . expect ( "could not execute make" ) ;
353
+ builder. compiler ( compiler. path ( ) ) ;
354
+
355
+ for flag in compiler. args ( ) {
356
+ if flag. ne ( "-static" ) {
357
+ builder. flag ( flag) ;
358
+ }
359
+ }
360
+ }
361
+
362
+ for entry in std:: fs:: read_dir ( libelf_dir) . expect ( "Failed to `read_dir`" ) {
363
+ let entry = entry. expect ( "Failed to `read_dir`" ) ;
364
+ if entry. file_type ( ) . unwrap ( ) . is_file ( )
365
+ && entry. file_name ( ) . to_str ( ) . unwrap ( ) . ends_with ( ".c" )
366
+ {
367
+ builder. file ( entry. path ( ) ) ;
368
+ }
369
+ }
370
+
371
+ builder
372
+ . flag_if_supported ( "-w" )
373
+ . warnings ( false )
374
+ . compile ( "elf" ) ;
387
375
388
- assert ! ( status. success( ) , "make failed" ) ;
389
376
emit_rerun_directives_for_contents ( & src_dir. join ( "elfutils" ) . join ( "src" ) ) ;
390
377
}
391
378
@@ -472,3 +459,19 @@ where
472
459
. status ( )
473
460
. expect ( & format ! ( "could not execute `{}`" , prog. as_ref( ) ) )
474
461
}
462
+
463
+ fn autoconf < P > ( project_dir : P )
464
+ where
465
+ P : AsRef < str > ,
466
+ {
467
+ let project_dir = project_dir. as_ref ( ) ;
468
+
469
+ let status = subproc ( "autoreconf" , project_dir, [ "--install" , "--force" ] ) ;
470
+
471
+ assert ! (
472
+ status. success( ) ,
473
+ "autoreconf({}) failed: {}" ,
474
+ project_dir,
475
+ status
476
+ ) ;
477
+ }
0 commit comments