summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_metadata/src/dependency_format.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_metadata/src/dependency_format.rs')
-rw-r--r--compiler/rustc_metadata/src/dependency_format.rs31
1 files changed, 21 insertions, 10 deletions
diff --git a/compiler/rustc_metadata/src/dependency_format.rs b/compiler/rustc_metadata/src/dependency_format.rs
index 39ef4276f..72b208a71 100644
--- a/compiler/rustc_metadata/src/dependency_format.rs
+++ b/compiler/rustc_metadata/src/dependency_format.rs
@@ -89,11 +89,25 @@ fn calculate_type(tcx: TyCtxt<'_>, ty: CrateType) -> DependencyList {
// to try to eagerly statically link all dependencies. This is normally
// done for end-product dylibs, not intermediate products.
//
- // Treat cdylibs similarly. If `-C prefer-dynamic` is set, the caller may
- // be code-size conscious, but without it, it makes sense to statically
- // link a cdylib.
- CrateType::Dylib | CrateType::Cdylib if !sess.opts.cg.prefer_dynamic => Linkage::Static,
- CrateType::Dylib | CrateType::Cdylib => Linkage::Dynamic,
+ // Treat cdylibs and staticlibs similarly. If `-C prefer-dynamic` is set,
+ // the caller may be code-size conscious, but without it, it makes sense
+ // to statically link a cdylib or staticlib. For staticlibs we use
+ // `-Z staticlib-prefer-dynamic` for now. This may be merged into
+ // `-C prefer-dynamic` in the future.
+ CrateType::Dylib | CrateType::Cdylib => {
+ if sess.opts.cg.prefer_dynamic {
+ Linkage::Dynamic
+ } else {
+ Linkage::Static
+ }
+ }
+ CrateType::Staticlib => {
+ if sess.opts.unstable_opts.staticlib_prefer_dynamic {
+ Linkage::Dynamic
+ } else {
+ Linkage::Static
+ }
+ }
// If the global prefer_dynamic switch is turned off, or the final
// executable will be statically linked, prefer static crate linkage.
@@ -108,9 +122,6 @@ fn calculate_type(tcx: TyCtxt<'_>, ty: CrateType) -> DependencyList {
// No linkage happens with rlibs, we just needed the metadata (which we
// got long ago), so don't bother with anything.
CrateType::Rlib => Linkage::NotLinked,
-
- // staticlibs must have all static dependencies.
- CrateType::Staticlib => Linkage::Static,
};
match preferred_linkage {
@@ -123,9 +134,9 @@ fn calculate_type(tcx: TyCtxt<'_>, ty: CrateType) -> DependencyList {
return v;
}
- // Staticlibs and static executables must have all static dependencies.
+ // Static executables must have all static dependencies.
// If any are not found, generate some nice pretty errors.
- if ty == CrateType::Staticlib
+ if (ty == CrateType::Staticlib && !sess.opts.unstable_opts.staticlib_allow_rdylib_deps)
|| (ty == CrateType::Executable
&& sess.crt_static(Some(ty))
&& !sess.target.crt_static_allows_dylibs)