use std::str::FromStr;
use session::{early_error, early_warn, Session};
-use session::search_paths::SearchPaths;
+use session::search_paths::SearchPath;
use rustc_target::spec::{LinkerFlavor, PanicStrategy, RelroLevel};
use rustc_target::spec::{Target, TargetTriple};
lint_cap: Option<lint::Level> [TRACKED],
describe_lints: bool [UNTRACKED],
output_types: OutputTypes [TRACKED],
- search_paths: SearchPaths [UNTRACKED],
+ search_paths: Vec<SearchPath> [UNTRACKED],
libs: Vec<(String, Option<String>, Option<cstore::NativeLibraryKind>)> [TRACKED],
maybe_sysroot: Option<PathBuf> [TRACKED],
lint_cap: None,
describe_lints: false,
output_types: OutputTypes(BTreeMap::new()),
- search_paths: SearchPaths::new(),
+ search_paths: vec![],
maybe_sysroot: None,
target_triple: TargetTriple::from_triple(host_triple()),
test: false,
}
};
- let mut search_paths = SearchPaths::new();
+ let mut search_paths = vec![];
for s in &matches.opt_strs("L") {
- search_paths.add_path(&s[..], error_format);
+ search_paths.push(SearchPath::from_cli_opt(&s[..], error_format));
}
let libs = matches
use session::config::{build_configuration, build_session_options_and_crate_config};
use session::config::{LtoCli, CrossLangLto};
use session::build_session;
+ use session::search_paths::SearchPath;
use std::collections::{BTreeMap, BTreeSet};
use std::iter::FromIterator;
use std::path::PathBuf;
// Reference
v1.search_paths
- .add_path("native=abc", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("native=abc", super::ErrorOutputType::Json(false)));
v1.search_paths
- .add_path("crate=def", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("crate=def", super::ErrorOutputType::Json(false)));
v1.search_paths
- .add_path("dependency=ghi", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("dependency=ghi", super::ErrorOutputType::Json(false)));
v1.search_paths
- .add_path("framework=jkl", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("framework=jkl", super::ErrorOutputType::Json(false)));
v1.search_paths
- .add_path("all=mno", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("all=mno", super::ErrorOutputType::Json(false)));
v2.search_paths
- .add_path("native=abc", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("native=abc", super::ErrorOutputType::Json(false)));
v2.search_paths
- .add_path("dependency=ghi", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("dependency=ghi", super::ErrorOutputType::Json(false)));
v2.search_paths
- .add_path("crate=def", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("crate=def", super::ErrorOutputType::Json(false)));
v2.search_paths
- .add_path("framework=jkl", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("framework=jkl", super::ErrorOutputType::Json(false)));
v2.search_paths
- .add_path("all=mno", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("all=mno", super::ErrorOutputType::Json(false)));
v3.search_paths
- .add_path("crate=def", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("crate=def", super::ErrorOutputType::Json(false)));
v3.search_paths
- .add_path("framework=jkl", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("framework=jkl", super::ErrorOutputType::Json(false)));
v3.search_paths
- .add_path("native=abc", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("native=abc", super::ErrorOutputType::Json(false)));
v3.search_paths
- .add_path("dependency=ghi", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("dependency=ghi", super::ErrorOutputType::Json(false)));
v3.search_paths
- .add_path("all=mno", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("all=mno", super::ErrorOutputType::Json(false)));
v4.search_paths
- .add_path("all=mno", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("all=mno", super::ErrorOutputType::Json(false)));
v4.search_paths
- .add_path("native=abc", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("native=abc", super::ErrorOutputType::Json(false)));
v4.search_paths
- .add_path("crate=def", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("crate=def", super::ErrorOutputType::Json(false)));
v4.search_paths
- .add_path("dependency=ghi", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("dependency=ghi", super::ErrorOutputType::Json(false)));
v4.search_paths
- .add_path("framework=jkl", super::ErrorOutputType::Json(false));
+ .push(SearchPath::from_cli_opt("framework=jkl", super::ErrorOutputType::Json(false)));
assert!(v1.dep_tracking_hash() == v2.dep_tracking_hash());
assert!(v1.dep_tracking_hash() == v3.dep_tracking_hash());
use std::fs;
use std::path::{Path, PathBuf};
-use session::search_paths::{SearchPaths, PathKind};
+use session::search_paths::{SearchPath, PathKind};
use rustc_fs_util::fix_windows_verbatim_for_gcc;
#[derive(Copy, Clone)]
pub struct FileSearch<'a> {
pub sysroot: &'a Path,
- pub search_paths: &'a SearchPaths,
+ pub search_paths: &'a [SearchPath],
pub triple: &'a str,
pub kind: PathKind,
}
impl<'a> FileSearch<'a> {
pub fn for_each_lib_search_path<F>(&self, mut f: F) where
- F: FnMut(&Path, PathKind)
+ F: FnMut(&SearchPath)
{
let mut visited_dirs = FxHashSet::default();
- visited_dirs.reserve(self.search_paths.paths.len() + 1);
- for (path, kind) in self.search_paths.iter(self.kind) {
- f(path, kind);
- visited_dirs.insert(path.to_path_buf());
+ visited_dirs.reserve(self.search_paths.len() + 1);
+ let iter = self.search_paths.iter().filter(|sp| sp.kind.matches(self.kind));
+ for search_path in iter {
+ f(search_path);
+ visited_dirs.insert(search_path.dir.to_path_buf());
}
debug!("filesearch: searching lib path");
let tlib_path = make_target_lib_path(self.sysroot,
self.triple);
if !visited_dirs.contains(&tlib_path) {
- f(&tlib_path, PathKind::All);
+ f(&SearchPath { kind: PathKind::All, dir: tlib_path });
}
}
pub fn search<F>(&self, mut pick: F)
where F: FnMut(&Path, PathKind) -> FileMatch
{
- self.for_each_lib_search_path(|lib_search_path, kind| {
- debug!("searching {}", lib_search_path.display());
- let files = match fs::read_dir(lib_search_path) {
+ self.for_each_lib_search_path(|search_path| {
+ debug!("searching {}", search_path.dir.display());
+ let files = match fs::read_dir(&search_path.dir) {
Ok(files) => files,
Err(..) => return,
};
let files2 = files.iter().filter(|p| !is_rlib(p));
for path in files1.chain(files2) {
debug!("testing {}", path.display());
- let maybe_picked = pick(path, kind);
+ let maybe_picked = pick(path, search_path.kind);
match maybe_picked {
FileMatches => {
debug!("picked {}", path.display());
pub fn new(sysroot: &'a Path,
triple: &'a str,
- search_paths: &'a SearchPaths,
+ search_paths: &'a Vec<SearchPath>,
kind: PathKind) -> FileSearch<'a> {
debug!("using sysroot = {}, triple = {}", sysroot.display(), triple);
FileSearch {
// Returns a list of directories where target-specific dylibs might be located.
pub fn get_dylib_search_paths(&self) -> Vec<PathBuf> {
let mut paths = Vec::new();
- self.for_each_lib_search_path(|lib_search_path, _| {
- paths.push(lib_search_path.to_path_buf());
+ self.for_each_lib_search_path(|search_path| {
+ paths.push(search_path.dir.to_path_buf());
});
paths
}
p
}
-fn make_target_lib_path(sysroot: &Path,
+pub fn make_target_lib_path(sysroot: &Path,
target_triple: &str) -> PathBuf {
sysroot.join(&relative_target_lib_path(sysroot, target_triple))
}
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-use std::slice;
use std::path::{Path, PathBuf};
use session::{early_error, config};
+use session::filesearch::make_target_lib_path;
#[derive(Clone, Debug)]
-pub struct SearchPaths {
- crate paths: Vec<(PathKind, PathBuf)>,
-}
-
-pub struct Iter<'a> {
- kind: PathKind,
- iter: slice::Iter<'a, (PathKind, PathBuf)>,
+pub struct SearchPath {
+ pub kind: PathKind,
+ pub dir: PathBuf,
}
#[derive(Eq, PartialEq, Clone, Copy, Debug, PartialOrd, Ord, Hash)]
All,
}
-impl SearchPaths {
- pub fn new() -> SearchPaths {
- SearchPaths { paths: Vec::new() }
+impl PathKind {
+ pub fn matches(&self, kind: PathKind) -> bool {
+ match (self, kind) {
+ (PathKind::All, _) | (_, PathKind::All) => true,
+ _ => *self == kind,
+ }
}
+}
- pub fn add_path(&mut self, path: &str, output: config::ErrorOutputType) {
+impl SearchPath {
+ pub fn from_cli_opt(path: &str, output: config::ErrorOutputType) -> Self {
let (kind, path) = if path.starts_with("native=") {
(PathKind::Native, &path["native=".len()..])
} else if path.starts_with("crate=") {
if path.is_empty() {
early_error(output, "empty search path given via `-L`");
}
- self.paths.push((kind, PathBuf::from(path)));
- }
- pub fn iter(&self, kind: PathKind) -> Iter<'_> {
- Iter { kind: kind, iter: self.paths.iter() }
+ let dir = PathBuf::from(path);
+ Self::new(kind, dir)
}
-}
-
-impl<'a> Iterator for Iter<'a> {
- type Item = (&'a Path, PathKind);
- fn next(&mut self) -> Option<(&'a Path, PathKind)> {
- loop {
- match *self.iter.next()? {
- (kind, ref p) if self.kind == PathKind::All ||
- kind == PathKind::All ||
- kind == self.kind => {
- return Some((p, kind))
- }
- _ => {}
- }
- }
+ pub fn from_sysroot_and_triple(sysroot: &Path, triple: &str) -> Self {
+ Self::new(PathKind::All, make_target_lib_path(sysroot, triple))
}
- fn size_hint(&self) -> (usize, Option<usize>) {
- // This iterator will never return more elements than the base iterator;
- // but it can ignore all the remaining elements.
- let (_, upper) = self.iter.size_hint();
- (0, upper)
+ fn new(kind: PathKind, dir: PathBuf) -> Self {
+ SearchPath { kind, dir }
}
}
+
fn archive_search_paths(sess: &Session) -> Vec<PathBuf> {
let mut search = Vec::new();
- sess.target_filesearch(PathKind::Native).for_each_lib_search_path(|path, _| {
- search.push(path.to_path_buf());
+ sess.target_filesearch(PathKind::Native).for_each_lib_search_path(|search_path| {
+ search.push(search_path.dir.to_path_buf());
});
search
fn add_local_native_libraries(cmd: &mut dyn Linker,
sess: &Session,
codegen_results: &CodegenResults) {
- sess.target_filesearch(PathKind::All).for_each_lib_search_path(|path, k| {
- match k {
- PathKind::Framework => { cmd.framework_path(path); }
- _ => { cmd.include_path(&fix_windows_verbatim_for_gcc(path)); }
+ sess.target_filesearch(PathKind::All).for_each_lib_search_path(|search_path| {
+ match search_path.kind {
+ PathKind::Framework => { cmd.framework_path(&search_path.dir); }
+ _ => { cmd.include_path(&fix_windows_verbatim_for_gcc(&search_path.dir)); }
}
});
use rustc::session::config::{CodegenOptions, DebuggingOptions, ErrorOutputType, Externs};
use rustc::session::config::{nightly_options, build_codegen_options, build_debugging_options,
get_cmd_lint_options};
-use rustc::session::search_paths::SearchPaths;
+use rustc::session::search_paths::SearchPath;
use rustc_driver;
use rustc_target::spec::TargetTriple;
use syntax::edition::Edition;
/// How to format errors and warnings.
pub error_format: ErrorOutputType,
/// Library search paths to hand to the compiler.
- pub libs: SearchPaths,
+ pub libs: Vec<SearchPath>,
/// The list of external crates to link against.
pub externs: Externs,
/// List of `cfg` flags to hand to the compiler. Always includes `rustdoc`.
}
let input = PathBuf::from(&matches.free[0]);
- let mut libs = SearchPaths::new();
- for s in &matches.opt_strs("L") {
- libs.add_path(s, error_format);
- }
+ let libs = matches.opt_strs("L").iter()
+ .map(|s| SearchPath::from_cli_opt(s, error_format))
+ .collect();
let externs = match parse_externs(&matches) {
Ok(ex) => ex,
Err(err) => {
use passes;
pub use rustc::session::config::{Input, Options, CodegenOptions};
-pub use rustc::session::search_paths::SearchPaths;
+pub use rustc::session::search_paths::SearchPath;
pub type ExternalPaths = FxHashMap<DefId, (Vec<String>, clean::TypeKind)>;
use rustc::hir::intravisit;
use rustc::session::{self, CompileIncomplete, config};
use rustc::session::config::{OutputType, OutputTypes, Externs, CodegenOptions};
-use rustc::session::search_paths::{SearchPaths, PathKind};
+use rustc::session::search_paths::{SearchPath, PathKind};
use syntax::ast;
use syntax::source_map::SourceMap;
use syntax::edition::Edition;
}
fn run_test(test: &str, cratename: &str, filename: &FileName, line: usize,
- cfgs: Vec<String>, libs: SearchPaths,
+ cfgs: Vec<String>, libs: Vec<SearchPath>,
cg: CodegenOptions, externs: Externs,
should_panic: bool, no_run: bool, as_test_harness: bool,
compile_fail: bool, mut error_codes: Vec<String>, opts: &TestOptions,
names: Vec<String>,
cfgs: Vec<String>,
- libs: SearchPaths,
+ libs: Vec<SearchPath>,
cg: CodegenOptions,
externs: Externs,
use_headers: bool,
}
impl Collector {
- pub fn new(cratename: String, cfgs: Vec<String>, libs: SearchPaths, cg: CodegenOptions,
+ pub fn new(cratename: String, cfgs: Vec<String>, libs: Vec<SearchPath>, cg: CodegenOptions,
externs: Externs, use_headers: bool, opts: TestOptions,
maybe_sysroot: Option<PathBuf>, source_map: Option<Lrc<SourceMap>>,
filename: Option<PathBuf>, linker: Option<PathBuf>, edition: Edition) -> Collector {