@@ -265,7 +265,7 @@ pub fn get_codegen_backend(sopts: &config::Options) -> Box<dyn CodegenBackend> {
265
265
266
266
let backend = match codegen_name {
267
267
filename if filename. contains ( '.' ) => load_backend_from_dylib ( filename. as_ref ( ) ) ,
268
- codegen_name => get_builtin_codegen_backend ( codegen_name) ,
268
+ codegen_name => get_builtin_codegen_backend ( & sopts . maybe_sysroot , codegen_name) ,
269
269
} ;
270
270
271
271
unsafe {
@@ -390,15 +390,21 @@ fn sysroot_candidates() -> Vec<PathBuf> {
390
390
}
391
391
}
392
392
393
- pub fn get_builtin_codegen_backend ( backend_name : & str ) -> fn ( ) -> Box < dyn CodegenBackend > {
393
+ pub fn get_builtin_codegen_backend (
394
+ maybe_sysroot : & Option < PathBuf > ,
395
+ backend_name : & str ,
396
+ ) -> fn ( ) -> Box < dyn CodegenBackend > {
394
397
match backend_name {
395
398
#[ cfg( feature = "llvm" ) ]
396
399
"llvm" => rustc_codegen_llvm:: LlvmCodegenBackend :: new,
397
- _ => get_codegen_sysroot ( backend_name) ,
400
+ _ => get_codegen_sysroot ( maybe_sysroot , backend_name) ,
398
401
}
399
402
}
400
403
401
- pub fn get_codegen_sysroot ( backend_name : & str ) -> fn ( ) -> Box < dyn CodegenBackend > {
404
+ pub fn get_codegen_sysroot (
405
+ maybe_sysroot : & Option < PathBuf > ,
406
+ backend_name : & str ,
407
+ ) -> fn ( ) -> Box < dyn CodegenBackend > {
402
408
// For now we only allow this function to be called once as it'll dlopen a
403
409
// few things, which seems to work best if we only do that once. In
404
410
// general this assertion never trips due to the once guard in `get_codegen_backend`,
@@ -413,8 +419,9 @@ pub fn get_codegen_sysroot(backend_name: &str) -> fn() -> Box<dyn CodegenBackend
413
419
let target = session:: config:: host_triple ( ) ;
414
420
let sysroot_candidates = sysroot_candidates ( ) ;
415
421
416
- let sysroot = sysroot_candidates
422
+ let sysroot = maybe_sysroot
417
423
. iter ( )
424
+ . chain ( sysroot_candidates. iter ( ) )
418
425
. map ( |sysroot| {
419
426
let libdir = filesearch:: relative_target_lib_path ( & sysroot, & target) ;
420
427
sysroot. join ( libdir) . with_file_name ( "codegen-backends" )
@@ -450,8 +457,10 @@ pub fn get_codegen_sysroot(backend_name: &str) -> fn() -> Box<dyn CodegenBackend
450
457
451
458
let mut file: Option < PathBuf > = None ;
452
459
453
- let expected_name =
454
- format ! ( "rustc_codegen_{}-{}" , backend_name, release_str( ) . expect( "CFG_RELEASE" ) ) ;
460
+ let expected_names = & [
461
+ format ! ( "rustc_codegen_{}-{}" , backend_name, release_str( ) . expect( "CFG_RELEASE" ) ) ,
462
+ format ! ( "rustc_codegen_{}" , backend_name) ,
463
+ ] ;
455
464
for entry in d. filter_map ( |e| e. ok ( ) ) {
456
465
let path = entry. path ( ) ;
457
466
let filename = match path. file_name ( ) . and_then ( |s| s. to_str ( ) ) {
@@ -462,7 +471,7 @@ pub fn get_codegen_sysroot(backend_name: &str) -> fn() -> Box<dyn CodegenBackend
462
471
continue ;
463
472
}
464
473
let name = & filename[ DLL_PREFIX . len ( ) ..filename. len ( ) - DLL_SUFFIX . len ( ) ] ;
465
- if name != expected_name {
474
+ if !expected_names . iter ( ) . any ( |expected| expected == name ) {
466
475
continue ;
467
476
}
468
477
if let Some ( ref prev) = file {
0 commit comments