1
Fork 0

Ask the user to use feature(rustc_private) when linking to rustc_driver

This commit is contained in:
John Kåre Alsaker 2024-03-22 11:42:53 +01:00
parent 3ee43259ac
commit 736a249954
4 changed files with 23 additions and 8 deletions

View file

@ -41,6 +41,9 @@ metadata_crate_dep_multiple =
metadata_crate_dep_not_static = metadata_crate_dep_not_static =
`{$crate_name}` was unavailable as a static crate, preventing fully static linking `{$crate_name}` was unavailable as a static crate, preventing fully static linking
metadata_crate_dep_rustc_driver =
`feature(rustc_private)` is needed to link to the compiler's `rustc_driver` library
metadata_crate_location_unknown_type = metadata_crate_location_unknown_type =
extern location for {$crate_name} is of an unknown type: {$path} extern location for {$crate_name} is of an unknown type: {$path}

View file

@ -59,12 +59,14 @@ use rustc_middle::ty::TyCtxt;
use rustc_session::config::CrateType; use rustc_session::config::CrateType;
use rustc_session::cstore::CrateDepKind; use rustc_session::cstore::CrateDepKind;
use rustc_session::cstore::LinkagePreference::{self, RequireDynamic, RequireStatic}; use rustc_session::cstore::LinkagePreference::{self, RequireDynamic, RequireStatic};
use rustc_span::sym;
use tracing::info; use tracing::info;
use crate::creader::CStore; use crate::creader::CStore;
use crate::errors::{ use crate::errors::{
BadPanicStrategy, CrateDepMultiple, IncompatiblePanicInDropStrategy, LibRequired, BadPanicStrategy, CrateDepMultiple, IncompatiblePanicInDropStrategy, LibRequired,
NonStaticCrateDep, RequiredPanicStrategy, RlibRequired, RustcLibRequired, TwoPanicRuntimes, NonStaticCrateDep, RequiredPanicStrategy, RlibRequired, RustcDriverHelp, RustcLibRequired,
TwoPanicRuntimes,
}; };
pub(crate) fn calculate(tcx: TyCtxt<'_>) -> Dependencies { pub(crate) fn calculate(tcx: TyCtxt<'_>) -> Dependencies {
@ -197,14 +199,14 @@ fn calculate_type(tcx: TyCtxt<'_>, ty: CrateType) -> DependencyList {
} }
let name = tcx.crate_name(cnum); let name = tcx.crate_name(cnum);
info!("adding dylib: {}", name); info!("adding dylib: {}", name);
add_library(tcx, cnum, RequireDynamic, &mut formats, &mut unavailable_as_static); add_library(tcx, cnum, RequireDynamic, &mut formats, &mut unavailable_as_static);
let deps = tcx.dylib_dependency_formats(cnum); let deps = tcx.dylib_dependency_formats(cnum);
for &(depnum, style) in deps.iter() { for &(depnum, style) in deps.iter() {
info!("adding {:?}: {}", style, tcx.crate_name(depnum)); info!("adding {:?}: {}", style, tcx.crate_name(depnum));
add_library(tcx, depnum, style, &mut formats, &mut unavailable_as_static); add_library(tcx, depnum, style, &mut formats, &mut unavailable_as_static);
}
} }
}
// Collect what we've got so far in the return vector. // Collect what we've got so far in the return vector.
let last_crate = tcx.crates(()).len(); let last_crate = tcx.crates(()).len();
@ -292,12 +294,15 @@ fn add_library(
// This error is probably a little obscure, but I imagine that it // This error is probably a little obscure, but I imagine that it
// can be refined over time. // can be refined over time.
if link2 != link || link == RequireStatic { if link2 != link || link == RequireStatic {
let linking_to_rustc_driver = tcx.sess.psess.unstable_features.is_nightly_build()
&& tcx.crates(()).iter().any(|&cnum| tcx.crate_name(cnum) == sym::rustc_driver);
tcx.dcx().emit_err(CrateDepMultiple { tcx.dcx().emit_err(CrateDepMultiple {
crate_name: tcx.crate_name(cnum), crate_name: tcx.crate_name(cnum),
non_static_deps: unavailable_as_static non_static_deps: unavailable_as_static
.drain(..) .drain(..)
.map(|cnum| NonStaticCrateDep { crate_name: tcx.crate_name(cnum) }) .map(|cnum| NonStaticCrateDep { crate_name: tcx.crate_name(cnum) })
.collect(), .collect(),
rustc_driver_help: linking_to_rustc_driver.then_some(RustcDriverHelp),
}); });
} }
} }

View file

@ -38,6 +38,8 @@ pub struct CrateDepMultiple {
pub crate_name: Symbol, pub crate_name: Symbol,
#[subdiagnostic] #[subdiagnostic]
pub non_static_deps: Vec<NonStaticCrateDep>, pub non_static_deps: Vec<NonStaticCrateDep>,
#[subdiagnostic]
pub rustc_driver_help: Option<RustcDriverHelp>,
} }
#[derive(Subdiagnostic)] #[derive(Subdiagnostic)]
@ -46,6 +48,10 @@ pub struct NonStaticCrateDep {
pub crate_name: Symbol, pub crate_name: Symbol,
} }
#[derive(Subdiagnostic)]
#[help(metadata_crate_dep_rustc_driver)]
pub struct RustcDriverHelp;
#[derive(Diagnostic)] #[derive(Diagnostic)]
#[diag(metadata_two_panic_runtimes)] #[diag(metadata_two_panic_runtimes)]
pub struct TwoPanicRuntimes { pub struct TwoPanicRuntimes {

View file

@ -1619,6 +1619,7 @@ symbols! {
rustc_dirty, rustc_dirty,
rustc_do_not_const_check, rustc_do_not_const_check,
rustc_doc_primitive, rustc_doc_primitive,
rustc_driver,
rustc_dummy, rustc_dummy,
rustc_dump_def_parents, rustc_dump_def_parents,
rustc_dump_item_bounds, rustc_dump_item_bounds,