From bb2d8649b2b344e0bb4b1cf94135378831735557 Mon Sep 17 00:00:00 2001 From: Cody P Schafer Date: Tue, 18 Nov 2014 01:40:21 -0500 Subject: [PATCH 01/10] Target: add default target.json path: $libdir/rust/targets --- src/librustc/session/config.rs | 6 +++--- src/librustc/session/mod.rs | 8 ++++++-- src/librustc_back/target/mod.rs | 13 +++++++++++-- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index e988ddc..563f3ac 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -42,7 +42,7 @@ use std::env; use std::fmt; use std::hash::{Hasher, SipHasher}; use std::iter::FromIterator; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; pub struct Config { pub target: Target, @@ -1011,8 +1011,8 @@ pub fn build_configuration(sess: &Session, v } -pub fn build_target_config(opts: &Options, sp: &Handler) -> Config { - let target = match Target::search(&opts.target_triple) { +pub fn build_target_config(sysroot: &Path, opts: &Options, sp: &Handler) -> Config { + let target = match Target::search(sysroot, &opts.target_triple[..]) { Ok(t) => t, Err(e) => { sp.struct_fatal(&format!("Error loading target specification: {}", e)) diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index c71253a..13b4e05 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -395,13 +395,17 @@ pub fn build_session_(sopts: config::Options, codemap: Rc, cstore: Rc CrateStore<'a>>) -> Session { - let host = match Target::search(config::host_triple()) { + let sysroot = match sopts.maybe_sysroot { + Some(ref x) => PathBuf::from(x), + None => filesearch::get_or_default_sysroot() + }; + let host = match Target::search(&sysroot, config::host_triple()) { Ok(t) => t, Err(e) => { panic!(span_diagnostic.fatal(&format!("Error loading host specification: {}", e))); } }; - let target_cfg = config::build_target_config(&sopts, &span_diagnostic); + let target_cfg = config::build_target_config(&sysroot, &sopts, &span_diagnostic); let p_s = parse::ParseSess::with_span_handler(span_diagnostic, codemap); let default_sysroot = match sopts.maybe_sysroot { Some(_) => None, diff --git a/src/librustc_back/target/mod.rs b/src/librustc_back/target/mod.rs index 18686e3..d439b59 100644 --- a/src/librustc_back/target/mod.rs +++ b/src/librustc_back/target/mod.rs @@ -49,6 +49,8 @@ use std::collections::BTreeMap; use std::default::Default; use std::io::prelude::*; use syntax::abi::Abi; +use std::borrow::ToOwned; +use std::path::Path; mod android_base; mod apple_base; @@ -541,12 +543,13 @@ impl Target { /// /// The error string could come from any of the APIs called, including /// filesystem access and JSON decoding. - pub fn search(target: &str) -> Result { + pub fn search(sysroot: &Path, target: &str) -> Result { use std::env; use std::ffi::OsString; use std::fs::File; use std::path::{Path, PathBuf}; use serialize::json; + use std::iter::IntoIterator; fn load_file(path: &Path) -> Result { let mut f = File::open(path).map_err(|e| e.to_string())?; @@ -577,8 +580,14 @@ impl Target { .unwrap_or(OsString::new()); // FIXME 16351: add a sane default search path? + let mut default_path = sysroot.to_owned(); + default_path.push(env!("CFG_LIBDIR_RELATIVE")); + default_path.push("rustlib"); - for dir in env::split_paths(&target_path) { + let paths = env::split_paths(&target_path) + .chain(Some(default_path).into_iter()); + + for dir in paths { let p = dir.join(&path); if p.is_file() { return load_file(&p); -- 2.10.0