Skip to content

Commit 8f5e879

Browse files
committed
Ask the user to use feature(rustc_private) when linking to rustc_driver
1 parent cb1319d commit 8f5e879

File tree

4 files changed

+16
-1
lines changed

4 files changed

+16
-1
lines changed

compiler/rustc_metadata/messages.ftl

+3
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ metadata_crate_dep_multiple =
4141
metadata_crate_dep_not_static =
4242
`{$crate_name}` was unavailable as a static crate, preventing fully static linking
4343
44+
metadata_crate_dep_rustc_driver =
45+
`feature(rustc_private)` is needed to link to the compiler's `rustc_driver` library
46+
4447
metadata_crate_location_unknown_type =
4548
extern location for {$crate_name} is of an unknown type: {$path}
4649

compiler/rustc_metadata/src/dependency_format.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@
5454
use crate::creader::CStore;
5555
use crate::errors::{
5656
BadPanicStrategy, CrateDepMultiple, IncompatiblePanicInDropStrategy, LibRequired,
57-
NonStaticCrateDep, RequiredPanicStrategy, RlibRequired, RustcLibRequired, TwoPanicRuntimes,
57+
NonStaticCrateDep, RequiredPanicStrategy, RlibRequired, RustcDriverHelp, RustcLibRequired,
58+
TwoPanicRuntimes,
5859
};
5960

6061
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
@@ -64,6 +65,7 @@ use rustc_middle::ty::TyCtxt;
6465
use rustc_session::config::CrateType;
6566
use rustc_session::cstore::CrateDepKind;
6667
use rustc_session::cstore::LinkagePreference::{self, RequireDynamic, RequireStatic};
68+
use rustc_span::sym;
6769

6870
pub(crate) fn calculate(tcx: TyCtxt<'_>) -> Dependencies {
6971
tcx.crate_types()
@@ -290,12 +292,15 @@ fn add_library(
290292
// This error is probably a little obscure, but I imagine that it
291293
// can be refined over time.
292294
if link2 != link || link == RequireStatic {
295+
let linking_to_rustc_driver = tcx.sess.psess.unstable_features.is_nightly_build()
296+
&& tcx.crates(()).iter().any(|&cnum| tcx.crate_name(cnum) == sym::rustc_driver);
293297
tcx.dcx().emit_err(CrateDepMultiple {
294298
crate_name: tcx.crate_name(cnum),
295299
non_static_deps: unavailable_as_static
296300
.drain(..)
297301
.map(|cnum| NonStaticCrateDep { crate_name: tcx.crate_name(cnum) })
298302
.collect(),
303+
rustc_driver_help: linking_to_rustc_driver.then_some(RustcDriverHelp),
299304
});
300305
}
301306
}

compiler/rustc_metadata/src/errors.rs

+6
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ pub struct CrateDepMultiple {
4040
pub crate_name: Symbol,
4141
#[subdiagnostic]
4242
pub non_static_deps: Vec<NonStaticCrateDep>,
43+
#[subdiagnostic]
44+
pub rustc_driver_help: Option<RustcDriverHelp>,
4345
}
4446

4547
#[derive(Subdiagnostic)]
@@ -48,6 +50,10 @@ pub struct NonStaticCrateDep {
4850
pub crate_name: Symbol,
4951
}
5052

53+
#[derive(Subdiagnostic)]
54+
#[help(metadata_crate_dep_rustc_driver)]
55+
pub struct RustcDriverHelp;
56+
5157
#[derive(Diagnostic)]
5258
#[diag(metadata_two_panic_runtimes)]
5359
pub struct TwoPanicRuntimes {

compiler/rustc_span/src/symbol.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1525,6 +1525,7 @@ symbols! {
15251525
rustc_dirty,
15261526
rustc_do_not_const_check,
15271527
rustc_doc_primitive,
1528+
rustc_driver,
15281529
rustc_dummy,
15291530
rustc_dump_env_program_clauses,
15301531
rustc_dump_program_clauses,

0 commit comments

Comments
 (0)