@@ -241,7 +241,7 @@ pub fn get_codegen_backend(sopts: &config::Options) -> Box<dyn CodegenBackend> {
241
241
242
242
let backend = match codegen_name {
243
243
filename if filename. contains ( '.' ) => load_backend_from_dylib ( filename. as_ref ( ) ) ,
244
- codegen_name => get_builtin_codegen_backend ( codegen_name) ,
244
+ codegen_name => get_builtin_codegen_backend ( & sopts . maybe_sysroot , codegen_name) ,
245
245
} ;
246
246
247
247
unsafe {
@@ -366,15 +366,21 @@ fn sysroot_candidates() -> Vec<PathBuf> {
366
366
}
367
367
}
368
368
369
- pub fn get_builtin_codegen_backend ( backend_name : & str ) -> fn ( ) -> Box < dyn CodegenBackend > {
369
+ pub fn get_builtin_codegen_backend (
370
+ maybe_sysroot : & Option < PathBuf > ,
371
+ backend_name : & str ,
372
+ ) -> fn ( ) -> Box < dyn CodegenBackend > {
370
373
match backend_name {
371
374
#[ cfg( feature = "llvm" ) ]
372
375
"llvm" => rustc_codegen_llvm:: LlvmCodegenBackend :: new,
373
- _ => get_codegen_sysroot ( backend_name) ,
376
+ _ => get_codegen_sysroot ( maybe_sysroot , backend_name) ,
374
377
}
375
378
}
376
379
377
- pub fn get_codegen_sysroot ( backend_name : & str ) -> fn ( ) -> Box < dyn CodegenBackend > {
380
+ pub fn get_codegen_sysroot (
381
+ maybe_sysroot : & Option < PathBuf > ,
382
+ backend_name : & str ,
383
+ ) -> fn ( ) -> Box < dyn CodegenBackend > {
378
384
// For now we only allow this function to be called once as it'll dlopen a
379
385
// few things, which seems to work best if we only do that once. In
380
386
// general this assertion never trips due to the once guard in `get_codegen_backend`,
@@ -389,8 +395,9 @@ pub fn get_codegen_sysroot(backend_name: &str) -> fn() -> Box<dyn CodegenBackend
389
395
let target = session:: config:: host_triple ( ) ;
390
396
let sysroot_candidates = sysroot_candidates ( ) ;
391
397
392
- let sysroot = sysroot_candidates
398
+ let sysroot = maybe_sysroot
393
399
. iter ( )
400
+ . chain ( sysroot_candidates. iter ( ) )
394
401
. map ( |sysroot| {
395
402
let libdir = filesearch:: relative_target_lib_path ( & sysroot, & target) ;
396
403
sysroot. join ( libdir) . with_file_name ( "codegen-backends" )
@@ -426,8 +433,10 @@ pub fn get_codegen_sysroot(backend_name: &str) -> fn() -> Box<dyn CodegenBackend
426
433
427
434
let mut file: Option < PathBuf > = None ;
428
435
429
- let expected_name =
430
- format ! ( "rustc_codegen_{}-{}" , backend_name, release_str( ) . expect( "CFG_RELEASE" ) ) ;
436
+ let expected_names = & [
437
+ format ! ( "rustc_codegen_{}-{}" , backend_name, release_str( ) . expect( "CFG_RELEASE" ) ) ,
438
+ format ! ( "rustc_codegen_{}" , backend_name) ,
439
+ ] ;
431
440
for entry in d. filter_map ( |e| e. ok ( ) ) {
432
441
let path = entry. path ( ) ;
433
442
let filename = match path. file_name ( ) . and_then ( |s| s. to_str ( ) ) {
@@ -438,7 +447,7 @@ pub fn get_codegen_sysroot(backend_name: &str) -> fn() -> Box<dyn CodegenBackend
438
447
continue ;
439
448
}
440
449
let name = & filename[ DLL_PREFIX . len ( ) ..filename. len ( ) - DLL_SUFFIX . len ( ) ] ;
441
- if name != expected_name {
450
+ if !expected_names . iter ( ) . any ( |expected| expected == name ) {
442
451
continue ;
443
452
}
444
453
if let Some ( ref prev) = file {
0 commit comments