Rollup merge of #138404 - bjorn3:sysroot_handling_cleanup, r=petrochenkov,jieyouxu
Cleanup sysroot locating a bit All commits should preserve existing behavior.
This commit is contained in:
commit
ad23e9d705
12 changed files with 42 additions and 51 deletions
|
@ -1286,8 +1286,7 @@ fn link_sanitizer_runtime(
|
||||||
if path.exists() {
|
if path.exists() {
|
||||||
sess.target_tlib_path.dir.clone()
|
sess.target_tlib_path.dir.clone()
|
||||||
} else {
|
} else {
|
||||||
let default_sysroot =
|
let default_sysroot = filesearch::get_or_default_sysroot();
|
||||||
filesearch::get_or_default_sysroot().expect("Failed finding sysroot");
|
|
||||||
let default_tlib =
|
let default_tlib =
|
||||||
filesearch::make_target_lib_path(&default_sysroot, sess.opts.target_triple.tuple());
|
filesearch::make_target_lib_path(&default_sysroot, sess.opts.target_triple.tuple());
|
||||||
default_tlib
|
default_tlib
|
||||||
|
|
|
@ -106,8 +106,8 @@ impl From<Vec<FluentError>> for TranslationBundleError {
|
||||||
/// (overriding any conflicting messages).
|
/// (overriding any conflicting messages).
|
||||||
#[instrument(level = "trace")]
|
#[instrument(level = "trace")]
|
||||||
pub fn fluent_bundle(
|
pub fn fluent_bundle(
|
||||||
mut user_provided_sysroot: Option<PathBuf>,
|
sysroot: PathBuf,
|
||||||
mut sysroot_candidates: Vec<PathBuf>,
|
sysroot_candidates: Vec<PathBuf>,
|
||||||
requested_locale: Option<LanguageIdentifier>,
|
requested_locale: Option<LanguageIdentifier>,
|
||||||
additional_ftl_path: Option<&Path>,
|
additional_ftl_path: Option<&Path>,
|
||||||
with_directionality_markers: bool,
|
with_directionality_markers: bool,
|
||||||
|
@ -141,7 +141,7 @@ pub fn fluent_bundle(
|
||||||
// If the user requests the default locale then don't try to load anything.
|
// If the user requests the default locale then don't try to load anything.
|
||||||
if let Some(requested_locale) = requested_locale {
|
if let Some(requested_locale) = requested_locale {
|
||||||
let mut found_resources = false;
|
let mut found_resources = false;
|
||||||
for sysroot in user_provided_sysroot.iter_mut().chain(sysroot_candidates.iter_mut()) {
|
for mut sysroot in Some(sysroot).into_iter().chain(sysroot_candidates.into_iter()) {
|
||||||
sysroot.push("share");
|
sysroot.push("share");
|
||||||
sysroot.push("locale");
|
sysroot.push("locale");
|
||||||
sysroot.push(requested_locale.to_string());
|
sysroot.push(requested_locale.to_string());
|
||||||
|
|
|
@ -18,7 +18,7 @@ use rustc_parse::parser::attr::AllowLeadingUnsafe;
|
||||||
use rustc_query_impl::QueryCtxt;
|
use rustc_query_impl::QueryCtxt;
|
||||||
use rustc_query_system::query::print_query_stack;
|
use rustc_query_system::query::print_query_stack;
|
||||||
use rustc_session::config::{self, Cfg, CheckCfg, ExpectedValues, Input, OutFileName};
|
use rustc_session::config::{self, Cfg, CheckCfg, ExpectedValues, Input, OutFileName};
|
||||||
use rustc_session::filesearch::{self, sysroot_candidates};
|
use rustc_session::filesearch::sysroot_candidates;
|
||||||
use rustc_session::parse::ParseSess;
|
use rustc_session::parse::ParseSess;
|
||||||
use rustc_session::{CompilerIO, EarlyDiagCtxt, Session, lint};
|
use rustc_session::{CompilerIO, EarlyDiagCtxt, Session, lint};
|
||||||
use rustc_span::source_map::{FileLoader, RealFileLoader, SourceMapInputs};
|
use rustc_span::source_map::{FileLoader, RealFileLoader, SourceMapInputs};
|
||||||
|
@ -390,7 +390,7 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
|
||||||
|
|
||||||
crate::callbacks::setup_callbacks();
|
crate::callbacks::setup_callbacks();
|
||||||
|
|
||||||
let sysroot = filesearch::materialize_sysroot(config.opts.maybe_sysroot.clone());
|
let sysroot = config.opts.sysroot.clone();
|
||||||
let target = config::build_target_config(&early_dcx, &config.opts.target_triple, &sysroot);
|
let target = config::build_target_config(&early_dcx, &config.opts.target_triple, &sysroot);
|
||||||
let file_loader = config.file_loader.unwrap_or_else(|| Box::new(RealFileLoader));
|
let file_loader = config.file_loader.unwrap_or_else(|| Box::new(RealFileLoader));
|
||||||
let path_mapping = config.opts.file_path_mapping();
|
let path_mapping = config.opts.file_path_mapping();
|
||||||
|
@ -424,7 +424,7 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
|
||||||
let temps_dir = config.opts.unstable_opts.temps_dir.as_deref().map(PathBuf::from);
|
let temps_dir = config.opts.unstable_opts.temps_dir.as_deref().map(PathBuf::from);
|
||||||
|
|
||||||
let bundle = match rustc_errors::fluent_bundle(
|
let bundle = match rustc_errors::fluent_bundle(
|
||||||
config.opts.maybe_sysroot.clone(),
|
config.opts.sysroot.clone(),
|
||||||
sysroot_candidates().to_vec(),
|
sysroot_candidates().to_vec(),
|
||||||
config.opts.unstable_opts.translate_lang.clone(),
|
config.opts.unstable_opts.translate_lang.clone(),
|
||||||
config.opts.unstable_opts.translate_additional_ftl.as_deref(),
|
config.opts.unstable_opts.translate_additional_ftl.as_deref(),
|
||||||
|
|
|
@ -21,7 +21,7 @@ use rustc_session::config::{
|
||||||
use rustc_session::lint::Level;
|
use rustc_session::lint::Level;
|
||||||
use rustc_session::search_paths::SearchPath;
|
use rustc_session::search_paths::SearchPath;
|
||||||
use rustc_session::utils::{CanonicalizedPath, NativeLib, NativeLibKind};
|
use rustc_session::utils::{CanonicalizedPath, NativeLib, NativeLibKind};
|
||||||
use rustc_session::{CompilerIO, EarlyDiagCtxt, Session, build_session, filesearch, getopts};
|
use rustc_session::{CompilerIO, EarlyDiagCtxt, Session, build_session, getopts};
|
||||||
use rustc_span::edition::{DEFAULT_EDITION, Edition};
|
use rustc_span::edition::{DEFAULT_EDITION, Edition};
|
||||||
use rustc_span::source_map::{RealFileLoader, SourceMapInputs};
|
use rustc_span::source_map::{RealFileLoader, SourceMapInputs};
|
||||||
use rustc_span::{FileName, SourceFileHashAlgorithm, sym};
|
use rustc_span::{FileName, SourceFileHashAlgorithm, sym};
|
||||||
|
@ -41,7 +41,7 @@ where
|
||||||
|
|
||||||
let matches = optgroups().parse(args).unwrap();
|
let matches = optgroups().parse(args).unwrap();
|
||||||
let sessopts = build_session_options(&mut early_dcx, &matches);
|
let sessopts = build_session_options(&mut early_dcx, &matches);
|
||||||
let sysroot = filesearch::materialize_sysroot(sessopts.maybe_sysroot.clone());
|
let sysroot = sessopts.sysroot.clone();
|
||||||
let target =
|
let target =
|
||||||
rustc_session::config::build_target_config(&early_dcx, &sessopts.target_triple, &sysroot);
|
rustc_session::config::build_target_config(&early_dcx, &sessopts.target_triple, &sysroot);
|
||||||
let hash_kind = sessopts.unstable_opts.src_hash_algorithm(&target);
|
let hash_kind = sessopts.unstable_opts.src_hash_algorithm(&target);
|
||||||
|
|
|
@ -1214,7 +1214,7 @@ impl Default for Options {
|
||||||
describe_lints: false,
|
describe_lints: false,
|
||||||
output_types: OutputTypes(BTreeMap::new()),
|
output_types: OutputTypes(BTreeMap::new()),
|
||||||
search_paths: vec![],
|
search_paths: vec![],
|
||||||
maybe_sysroot: None,
|
sysroot: filesearch::materialize_sysroot(None),
|
||||||
target_triple: TargetTuple::from_tuple(host_tuple()),
|
target_triple: TargetTuple::from_tuple(host_tuple()),
|
||||||
test: false,
|
test: false,
|
||||||
incremental: None,
|
incremental: None,
|
||||||
|
@ -2618,7 +2618,7 @@ pub fn build_session_options(early_dcx: &mut EarlyDiagCtxt, matches: &getopts::M
|
||||||
describe_lints,
|
describe_lints,
|
||||||
output_types,
|
output_types,
|
||||||
search_paths,
|
search_paths,
|
||||||
maybe_sysroot: Some(sysroot),
|
sysroot,
|
||||||
target_triple,
|
target_triple,
|
||||||
test,
|
test,
|
||||||
incremental,
|
incremental,
|
||||||
|
|
|
@ -160,8 +160,7 @@ fn current_dll_path() -> Result<PathBuf, String> {
|
||||||
|
|
||||||
pub fn sysroot_candidates() -> SmallVec<[PathBuf; 2]> {
|
pub fn sysroot_candidates() -> SmallVec<[PathBuf; 2]> {
|
||||||
let target = crate::config::host_tuple();
|
let target = crate::config::host_tuple();
|
||||||
let mut sysroot_candidates: SmallVec<[PathBuf; 2]> =
|
let mut sysroot_candidates: SmallVec<[PathBuf; 2]> = smallvec![get_or_default_sysroot()];
|
||||||
smallvec![get_or_default_sysroot().expect("Failed finding sysroot")];
|
|
||||||
let path = current_dll_path().and_then(|s| try_canonicalize(s).map_err(|e| e.to_string()));
|
let path = current_dll_path().and_then(|s| try_canonicalize(s).map_err(|e| e.to_string()));
|
||||||
if let Ok(dll) = path {
|
if let Ok(dll) = path {
|
||||||
// use `parent` twice to chop off the file name and then also the
|
// use `parent` twice to chop off the file name and then also the
|
||||||
|
@ -195,12 +194,12 @@ pub fn sysroot_candidates() -> SmallVec<[PathBuf; 2]> {
|
||||||
/// Returns the provided sysroot or calls [`get_or_default_sysroot`] if it's none.
|
/// Returns the provided sysroot or calls [`get_or_default_sysroot`] if it's none.
|
||||||
/// Panics if [`get_or_default_sysroot`] returns an error.
|
/// Panics if [`get_or_default_sysroot`] returns an error.
|
||||||
pub fn materialize_sysroot(maybe_sysroot: Option<PathBuf>) -> PathBuf {
|
pub fn materialize_sysroot(maybe_sysroot: Option<PathBuf>) -> PathBuf {
|
||||||
maybe_sysroot.unwrap_or_else(|| get_or_default_sysroot().expect("Failed finding sysroot"))
|
maybe_sysroot.unwrap_or_else(|| get_or_default_sysroot())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This function checks if sysroot is found using env::args().next(), and if it
|
/// This function checks if sysroot is found using env::args().next(), and if it
|
||||||
/// is not found, finds sysroot from current rustc_driver dll.
|
/// is not found, finds sysroot from current rustc_driver dll.
|
||||||
pub fn get_or_default_sysroot() -> Result<PathBuf, String> {
|
pub fn get_or_default_sysroot() -> PathBuf {
|
||||||
// Follow symlinks. If the resolved path is relative, make it absolute.
|
// Follow symlinks. If the resolved path is relative, make it absolute.
|
||||||
fn canonicalize(path: PathBuf) -> PathBuf {
|
fn canonicalize(path: PathBuf) -> PathBuf {
|
||||||
let path = try_canonicalize(&path).unwrap_or(path);
|
let path = try_canonicalize(&path).unwrap_or(path);
|
||||||
|
@ -255,9 +254,7 @@ pub fn get_or_default_sysroot() -> Result<PathBuf, String> {
|
||||||
// binary able to locate Rust libraries in systems using content-addressable
|
// binary able to locate Rust libraries in systems using content-addressable
|
||||||
// storage (CAS).
|
// storage (CAS).
|
||||||
fn from_env_args_next() -> Option<PathBuf> {
|
fn from_env_args_next() -> Option<PathBuf> {
|
||||||
match env::args_os().next() {
|
let mut p = PathBuf::from(env::args_os().next()?);
|
||||||
Some(first_arg) => {
|
|
||||||
let mut p = PathBuf::from(first_arg);
|
|
||||||
|
|
||||||
// Check if sysroot is found using env::args().next() only if the rustc in argv[0]
|
// Check if sysroot is found using env::args().next() only if the rustc in argv[0]
|
||||||
// is a symlink (see #79253). We might want to change/remove it to conform with
|
// is a symlink (see #79253). We might want to change/remove it to conform with
|
||||||
|
@ -276,9 +273,6 @@ pub fn get_or_default_sysroot() -> Result<PathBuf, String> {
|
||||||
rustlib_path.pop(); // pop off the dummy target.
|
rustlib_path.pop(); // pop off the dummy target.
|
||||||
rustlib_path.exists().then_some(p)
|
rustlib_path.exists().then_some(p)
|
||||||
}
|
}
|
||||||
None => None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(from_env_args_next().unwrap_or(default_from_rustc_driver_dll()?))
|
from_env_args_next().unwrap_or(default_from_rustc_driver_dll().expect("Failed finding sysroot"))
|
||||||
}
|
}
|
||||||
|
|
|
@ -333,7 +333,7 @@ top_level_options!(
|
||||||
output_types: OutputTypes [TRACKED],
|
output_types: OutputTypes [TRACKED],
|
||||||
search_paths: Vec<SearchPath> [UNTRACKED],
|
search_paths: Vec<SearchPath> [UNTRACKED],
|
||||||
libs: Vec<NativeLib> [TRACKED],
|
libs: Vec<NativeLib> [TRACKED],
|
||||||
maybe_sysroot: Option<PathBuf> [UNTRACKED],
|
sysroot: PathBuf [UNTRACKED],
|
||||||
|
|
||||||
target_triple: TargetTuple [TRACKED],
|
target_triple: TargetTuple [TRACKED],
|
||||||
|
|
||||||
|
|
|
@ -143,7 +143,6 @@ pub struct Session {
|
||||||
pub target: Target,
|
pub target: Target,
|
||||||
pub host: Target,
|
pub host: Target,
|
||||||
pub opts: config::Options,
|
pub opts: config::Options,
|
||||||
pub host_tlib_path: Arc<SearchPath>,
|
|
||||||
pub target_tlib_path: Arc<SearchPath>,
|
pub target_tlib_path: Arc<SearchPath>,
|
||||||
pub psess: ParseSess,
|
pub psess: ParseSess,
|
||||||
pub sysroot: PathBuf,
|
pub sysroot: PathBuf,
|
||||||
|
@ -1042,6 +1041,7 @@ pub fn build_session(
|
||||||
|
|
||||||
let host_triple = config::host_tuple();
|
let host_triple = config::host_tuple();
|
||||||
let target_triple = sopts.target_triple.tuple();
|
let target_triple = sopts.target_triple.tuple();
|
||||||
|
// FIXME use host sysroot?
|
||||||
let host_tlib_path = Arc::new(SearchPath::from_sysroot_and_triple(&sysroot, host_triple));
|
let host_tlib_path = Arc::new(SearchPath::from_sysroot_and_triple(&sysroot, host_triple));
|
||||||
let target_tlib_path = if host_triple == target_triple {
|
let target_tlib_path = if host_triple == target_triple {
|
||||||
// Use the same `SearchPath` if host and target triple are identical to avoid unnecessary
|
// Use the same `SearchPath` if host and target triple are identical to avoid unnecessary
|
||||||
|
@ -1070,7 +1070,6 @@ pub fn build_session(
|
||||||
target,
|
target,
|
||||||
host,
|
host,
|
||||||
opts: sopts,
|
opts: sopts,
|
||||||
host_tlib_path,
|
|
||||||
target_tlib_path,
|
target_tlib_path,
|
||||||
psess,
|
psess,
|
||||||
sysroot,
|
sysroot,
|
||||||
|
|
|
@ -103,6 +103,8 @@ pub(crate) struct Options {
|
||||||
/// compiling doctests from the crate.
|
/// compiling doctests from the crate.
|
||||||
pub(crate) edition: Edition,
|
pub(crate) edition: Edition,
|
||||||
/// The path to the sysroot. Used during the compilation process.
|
/// The path to the sysroot. Used during the compilation process.
|
||||||
|
pub(crate) sysroot: PathBuf,
|
||||||
|
/// Has the same value as `sysroot` except is `None` when the user didn't pass `---sysroot`.
|
||||||
pub(crate) maybe_sysroot: Option<PathBuf>,
|
pub(crate) maybe_sysroot: Option<PathBuf>,
|
||||||
/// Lint information passed over the command-line.
|
/// Lint information passed over the command-line.
|
||||||
pub(crate) lint_opts: Vec<(String, Level)>,
|
pub(crate) lint_opts: Vec<(String, Level)>,
|
||||||
|
@ -202,6 +204,7 @@ impl fmt::Debug for Options {
|
||||||
.field("unstable_options", &"...")
|
.field("unstable_options", &"...")
|
||||||
.field("target", &self.target)
|
.field("target", &self.target)
|
||||||
.field("edition", &self.edition)
|
.field("edition", &self.edition)
|
||||||
|
.field("sysroot", &self.sysroot)
|
||||||
.field("maybe_sysroot", &self.maybe_sysroot)
|
.field("maybe_sysroot", &self.maybe_sysroot)
|
||||||
.field("lint_opts", &self.lint_opts)
|
.field("lint_opts", &self.lint_opts)
|
||||||
.field("describe_lints", &self.describe_lints)
|
.field("describe_lints", &self.describe_lints)
|
||||||
|
@ -729,12 +732,7 @@ impl Options {
|
||||||
let target = parse_target_triple(early_dcx, matches);
|
let target = parse_target_triple(early_dcx, matches);
|
||||||
let maybe_sysroot = matches.opt_str("sysroot").map(PathBuf::from);
|
let maybe_sysroot = matches.opt_str("sysroot").map(PathBuf::from);
|
||||||
|
|
||||||
let sysroot = match &maybe_sysroot {
|
let sysroot = rustc_session::filesearch::materialize_sysroot(maybe_sysroot.clone());
|
||||||
Some(s) => s.clone(),
|
|
||||||
None => {
|
|
||||||
rustc_session::filesearch::get_or_default_sysroot().expect("Failed finding sysroot")
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let libs = matches
|
let libs = matches
|
||||||
.opt_strs("L")
|
.opt_strs("L")
|
||||||
|
@ -834,6 +832,7 @@ impl Options {
|
||||||
unstable_opts_strs,
|
unstable_opts_strs,
|
||||||
target,
|
target,
|
||||||
edition,
|
edition,
|
||||||
|
sysroot,
|
||||||
maybe_sysroot,
|
maybe_sysroot,
|
||||||
lint_opts,
|
lint_opts,
|
||||||
describe_lints,
|
describe_lints,
|
||||||
|
|
|
@ -210,7 +210,7 @@ pub(crate) fn create_config(
|
||||||
unstable_opts,
|
unstable_opts,
|
||||||
target,
|
target,
|
||||||
edition,
|
edition,
|
||||||
maybe_sysroot,
|
sysroot,
|
||||||
lint_opts,
|
lint_opts,
|
||||||
describe_lints,
|
describe_lints,
|
||||||
lint_cap,
|
lint_cap,
|
||||||
|
@ -253,7 +253,7 @@ pub(crate) fn create_config(
|
||||||
let test = scrape_examples_options.map(|opts| opts.scrape_tests).unwrap_or(false);
|
let test = scrape_examples_options.map(|opts| opts.scrape_tests).unwrap_or(false);
|
||||||
// plays with error output here!
|
// plays with error output here!
|
||||||
let sessopts = config::Options {
|
let sessopts = config::Options {
|
||||||
maybe_sysroot,
|
sysroot,
|
||||||
search_paths: libs,
|
search_paths: libs,
|
||||||
crate_types,
|
crate_types,
|
||||||
lint_opts,
|
lint_opts,
|
||||||
|
|
|
@ -158,7 +158,7 @@ pub(crate) fn run(dcx: DiagCtxtHandle<'_>, input: Input, options: RustdocOptions
|
||||||
if options.proc_macro_crate { vec![CrateType::ProcMacro] } else { vec![CrateType::Rlib] };
|
if options.proc_macro_crate { vec![CrateType::ProcMacro] } else { vec![CrateType::Rlib] };
|
||||||
|
|
||||||
let sessopts = config::Options {
|
let sessopts = config::Options {
|
||||||
maybe_sysroot: options.maybe_sysroot.clone(),
|
sysroot: options.sysroot.clone(),
|
||||||
search_paths: options.libs.clone(),
|
search_paths: options.libs.clone(),
|
||||||
crate_types,
|
crate_types,
|
||||||
lint_opts,
|
lint_opts,
|
||||||
|
|
|
@ -46,7 +46,7 @@ fn main() {
|
||||||
fn compile(code: String, output: PathBuf, sysroot: PathBuf, linker: Option<&Path>) {
|
fn compile(code: String, output: PathBuf, sysroot: PathBuf, linker: Option<&Path>) {
|
||||||
let mut opts = Options::default();
|
let mut opts = Options::default();
|
||||||
opts.output_types = OutputTypes::new(&[(OutputType::Exe, None)]);
|
opts.output_types = OutputTypes::new(&[(OutputType::Exe, None)]);
|
||||||
opts.maybe_sysroot = Some(sysroot);
|
opts.sysroot = sysroot;
|
||||||
|
|
||||||
if let Some(linker) = linker {
|
if let Some(linker) = linker {
|
||||||
opts.cg.linker = Some(linker.to_owned());
|
opts.cg.linker = Some(linker.to_owned());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue