@@ -317,37 +317,66 @@ fn link_rlib<'a, B: ArchiveBuilder<'a>>(
317
317
// loaded from the libraries found here and then encode that into the
318
318
// metadata of the rlib we're generating somehow.
319
319
for lib in codegen_results. crate_info . used_libraries . iter ( ) {
320
- match lib. kind {
321
- NativeLibKind :: Static { bundle : None | Some ( true ) , whole_archive : Some ( true ) }
322
- if flavor == RlibFlavor :: Normal =>
323
- {
324
- // Don't allow mixing +bundle with +whole_archive since an rlib may contain
325
- // multiple native libs, some of which are +whole-archive and some of which are
326
- // -whole-archive and it isn't clear how we can currently handle such a
327
- // situation correctly.
328
- // See https://github.com/rust-lang/rust/issues/88085#issuecomment-901050897
329
- sess. err (
330
- "the linking modifiers `+bundle` and `+whole-archive` are not compatible \
320
+ if !sess. opts . unstable_opts . split_bundled_libs {
321
+ match lib. kind {
322
+ NativeLibKind :: Static { bundle : None | Some ( true ) , whole_archive : Some ( true ) }
323
+ if flavor == RlibFlavor :: Normal =>
324
+ {
325
+ // Don't allow mixing +bundle with +whole_archive since an rlib may contain
326
+ // multiple native libs, some of which are +whole-archive and some of which are
327
+ // -whole-archive and it isn't clear how we can currently handle such a
328
+ // situation correctly.
329
+ // See https://github.com/rust-lang/rust/issues/88085#issuecomment-901050897
330
+ sess. err (
331
+ "the linking modifiers `+bundle` and `+whole-archive` are not compatible \
331
332
with each other when generating rlibs",
333
+ ) ;
334
+ }
335
+ NativeLibKind :: Static { bundle : None | Some ( true ) , .. } => { }
336
+ NativeLibKind :: Static { bundle : Some ( false ) , .. }
337
+ | NativeLibKind :: Dylib { .. }
338
+ | NativeLibKind :: Framework { .. }
339
+ | NativeLibKind :: RawDylib
340
+ | NativeLibKind :: Unspecified => continue ,
341
+ }
342
+ if let Some ( name) = lib. name {
343
+ let location = find_library (
344
+ name. as_str ( ) ,
345
+ lib. verbatim . unwrap_or ( false ) ,
346
+ & lib_search_paths,
347
+ sess,
332
348
) ;
349
+ ab. add_archive ( & location, |_| false ) . unwrap_or_else ( |e| {
350
+ sess. fatal ( & format ! (
351
+ "failed to add native library {}: {}" ,
352
+ location. to_string_lossy( ) ,
353
+ e
354
+ ) ) ;
355
+ } ) ;
356
+ }
357
+ } else {
358
+ match lib. kind {
359
+ NativeLibKind :: Static { bundle : None | Some ( true ) , .. }
360
+ if flavor == RlibFlavor :: Normal =>
361
+ {
362
+ let Some ( name) = lib. name else {
363
+ continue ;
364
+ } ;
365
+
366
+ let location = find_library (
367
+ name. as_str ( ) ,
368
+ lib. verbatim . unwrap_or ( false ) ,
369
+ & lib_search_paths,
370
+ sess,
371
+ ) ;
372
+
373
+ let suffix = & sess. target . staticlib_suffix ;
374
+ let crate_name = out_filename. to_str ( ) . unwrap ( ) ;
375
+ let bundle_lib = PathBuf :: from ( & format ! ( "{crate_name}.bundle.{name}{suffix}" ) ) ;
376
+ fs:: copy ( location, bundle_lib) . unwrap ( ) ;
377
+ }
378
+ _ => { }
333
379
}
334
- NativeLibKind :: Static { bundle : None | Some ( true ) , .. } => { }
335
- NativeLibKind :: Static { bundle : Some ( false ) , .. }
336
- | NativeLibKind :: Dylib { .. }
337
- | NativeLibKind :: Framework { .. }
338
- | NativeLibKind :: RawDylib
339
- | NativeLibKind :: Unspecified => continue ,
340
- }
341
- if let Some ( name) = lib. name {
342
- let location =
343
- find_library ( name. as_str ( ) , lib. verbatim . unwrap_or ( false ) , & lib_search_paths, sess) ;
344
- ab. add_archive ( & location, |_| false ) . unwrap_or_else ( |e| {
345
- sess. fatal ( & format ! (
346
- "failed to add native library {}: {}" ,
347
- location. to_string_lossy( ) ,
348
- e
349
- ) ) ;
350
- } ) ;
351
380
}
352
381
}
353
382
@@ -2362,7 +2391,24 @@ fn add_upstream_rust_crates<'a, B: ArchiveBuilder<'a>>(
2362
2391
( lib. name , lib. kind , lib. verbatim )
2363
2392
} ;
2364
2393
2365
- if let NativeLibKind :: Static { bundle : Some ( false ) , whole_archive } =
2394
+ if sess. opts . unstable_opts . split_bundled_libs {
2395
+ if let NativeLibKind :: Static {
2396
+ bundle : Some ( true ) | None ,
2397
+ whole_archive,
2398
+ } = lib. kind
2399
+ {
2400
+ let suffix = & sess. target . staticlib_suffix ;
2401
+ let crate_path = src. paths ( ) . next ( ) . unwrap ( ) . to_str ( ) . unwrap ( ) ;
2402
+ let bundle_lib =
2403
+ PathBuf :: from ( & format ! ( "{crate_path}.bundle.{name}{suffix}" ) ) ;
2404
+ if whole_archive == Some ( true ) {
2405
+ cmd. link_whole_rlib ( & bundle_lib) ;
2406
+ } else {
2407
+ cmd. link_rlib ( & bundle_lib) ;
2408
+ }
2409
+ }
2410
+ } else {
2411
+ if let NativeLibKind :: Static { bundle : Some ( false ) , whole_archive } =
2366
2412
lib. kind
2367
2413
{
2368
2414
let verbatim = lib. verbatim . unwrap_or ( false ) ;
@@ -2376,6 +2422,7 @@ fn add_upstream_rust_crates<'a, B: ArchiveBuilder<'a>>(
2376
2422
cmd. link_staticlib ( name, verbatim) ;
2377
2423
}
2378
2424
}
2425
+ }
2379
2426
}
2380
2427
}
2381
2428
}
0 commit comments