Make addl_lib_search_paths a HashSet (Closes #7718).

This commit is contained in:
Joshua Yanovski 2013-10-25 22:13:23 -07:00
parent 950add4e49
commit a239c0ed66
9 changed files with 42 additions and 23 deletions

View File

@ -757,7 +757,9 @@ pub fn build_session_options(binary: @str,
let statik = debugging_opts & session::statik != 0; let statik = debugging_opts & session::statik != 0;
let addl_lib_search_paths = matches.opt_strs("L").map(|s| Path::new(s.as_slice())); let addl_lib_search_paths = matches.opt_strs("L").map(|s| {
Path::new(s.as_slice())
}).move_iter().collect();
let linker = matches.opt_str("linker"); let linker = matches.opt_str("linker");
let linker_args = matches.opt_strs("link-args").flat_map( |a| { let linker_args = matches.opt_strs("link-args").flat_map( |a| {
a.split_iter(' ').map(|arg| arg.to_owned()).collect() a.split_iter(' ').map(|arg| arg.to_owned()).collect()

View File

@ -29,7 +29,7 @@ use syntax::parse::token;
use syntax; use syntax;
use std::int; use std::int;
use std::hashmap::HashMap; use std::hashmap::{HashMap,HashSet};
#[deriving(Eq)] #[deriving(Eq)]
pub enum Os { OsWin32, OsMacos, OsLinux, OsAndroid, OsFreebsd, } pub enum Os { OsWin32, OsMacos, OsLinux, OsAndroid, OsFreebsd, }
@ -158,9 +158,9 @@ pub struct options {
save_temps: bool, save_temps: bool,
jit: bool, jit: bool,
output_type: back::link::output_type, output_type: back::link::output_type,
addl_lib_search_paths: @mut ~[Path], // This is mutable for rustpkg, which addl_lib_search_paths: @mut HashSet<Path>, // This is mutable for rustpkg, which
// updates search paths based on the // updates search paths based on the
// parsed code // parsed code
linker: Option<~str>, linker: Option<~str>,
linker_args: ~[~str], linker_args: ~[~str],
maybe_sysroot: Option<@Path>, maybe_sysroot: Option<@Path>,
@ -366,7 +366,7 @@ pub fn basic_options() -> @options {
save_temps: false, save_temps: false,
jit: false, jit: false,
output_type: link::output_type_exe, output_type: link::output_type_exe,
addl_lib_search_paths: @mut ~[], addl_lib_search_paths: @mut HashSet::new(),
linker: None, linker: None,
linker_args: ~[], linker_args: ~[],
maybe_sysroot: None, maybe_sysroot: None,

View File

@ -40,11 +40,11 @@ pub trait FileSearch {
pub fn mk_filesearch(maybe_sysroot: &Option<@Path>, pub fn mk_filesearch(maybe_sysroot: &Option<@Path>,
target_triple: &str, target_triple: &str,
addl_lib_search_paths: @mut ~[Path]) addl_lib_search_paths: @mut HashSet<Path>)
-> @FileSearch { -> @FileSearch {
struct FileSearchImpl { struct FileSearchImpl {
sysroot: @Path, sysroot: @Path,
addl_lib_search_paths: @mut ~[Path], addl_lib_search_paths: @mut HashSet<Path>,
target_triple: ~str target_triple: ~str
} }
impl FileSearch for FileSearchImpl { impl FileSearch for FileSearchImpl {

View File

@ -20,7 +20,7 @@ use syntax;
use std::os; use std::os;
use std::local_data; use std::local_data;
use std::hashmap::HashMap; use std::hashmap::{HashMap,HashSet};
use visit_ast::RustdocVisitor; use visit_ast::RustdocVisitor;
use clean; use clean;
@ -39,7 +39,7 @@ pub struct CrateAnalysis {
/// Parses, resolves, and typechecks the given crate /// Parses, resolves, and typechecks the given crate
fn get_ast_and_resolve(cpath: &Path, fn get_ast_and_resolve(cpath: &Path,
libs: ~[Path]) -> (DocContext, CrateAnalysis) { libs: HashSet<Path>) -> (DocContext, CrateAnalysis) {
use syntax::codemap::dummy_spanned; use syntax::codemap::dummy_spanned;
use rustc::driver::driver::{file_input, build_configuration, use rustc::driver::driver::{file_input, build_configuration,
phase_1_parse_input, phase_1_parse_input,
@ -89,7 +89,7 @@ fn get_ast_and_resolve(cpath: &Path,
CrateAnalysis { reexports: reexports, exported_items: exported_items }); CrateAnalysis { reexports: reexports, exported_items: exported_items });
} }
pub fn run_core (libs: ~[Path], path: &Path) -> (clean::Crate, CrateAnalysis) { pub fn run_core (libs: HashSet<Path>, path: &Path) -> (clean::Crate, CrateAnalysis) {
let (ctxt, analysis) = get_ast_and_resolve(path, libs); let (ctxt, analysis) = get_ast_and_resolve(path, libs);
let ctxt = @ctxt; let ctxt = @ctxt;
debug!("defmap:"); debug!("defmap:");

View File

@ -198,7 +198,7 @@ fn rust_input(cratefile: &str, matches: &getopts::Matches) -> Output {
info!("starting to run rustc"); info!("starting to run rustc");
let (crate, analysis) = do std::task::try { let (crate, analysis) = do std::task::try {
let cr = cr.take(); let cr = cr.take();
core::run_core(libs.take(), &cr) core::run_core(libs.take().move_iter().collect(), &cr)
}.unwrap(); }.unwrap();
info!("finished with rustc"); info!("finished with rustc");
local_data::set(analysiskey, analysis); local_data::set(analysiskey, analysis);

View File

@ -10,10 +10,12 @@
// Context data structure used by rustpkg // Context data structure used by rustpkg
use std::os;
use extra::workcache; use extra::workcache;
use rustc::driver::session::{OptLevel, No}; use rustc::driver::session::{OptLevel, No};
use std::hashmap::HashSet;
use std::os;
#[deriving(Clone)] #[deriving(Clone)]
pub struct Context { pub struct Context {
// Config strings that the user passed in with --cfg // Config strings that the user passed in with --cfg
@ -60,7 +62,7 @@ impl BuildContext {
self.context.add_library_path(p); self.context.add_library_path(p);
} }
pub fn additional_library_paths(&self) -> ~[Path] { pub fn additional_library_paths(&self) -> HashSet<Path> {
self.context.rustc_flags.additional_library_paths.clone() self.context.rustc_flags.additional_library_paths.clone()
} }
} }
@ -96,7 +98,7 @@ pub struct RustcFlags {
target_cpu: Option<~str>, target_cpu: Option<~str>,
// Additional library directories, which get passed with the -L flag // Additional library directories, which get passed with the -L flag
// This can't be set with a rustpkg flag, only from package scripts // This can't be set with a rustpkg flag, only from package scripts
additional_library_paths: ~[Path], additional_library_paths: HashSet<Path>,
// Any -Z features // Any -Z features
experimental_features: Option<~[~str]> experimental_features: Option<~[~str]>
} }
@ -163,7 +165,7 @@ impl Context {
} }
pub fn add_library_path(&mut self, p: Path) { pub fn add_library_path(&mut self, p: Path) {
self.rustc_flags.additional_library_paths.push(p); self.rustc_flags.additional_library_paths.insert(p);
} }
} }
@ -227,7 +229,7 @@ impl RustcFlags {
save_temps: false, save_temps: false,
target: None, target: None,
target_cpu: None, target_cpu: None,
additional_library_paths: ~[], additional_library_paths: HashSet::new(),
experimental_features: None experimental_features: None
} }
} }

View File

@ -25,6 +25,7 @@ extern mod rustc;
extern mod syntax; extern mod syntax;
use std::{os, result, run, str, task}; use std::{os, result, run, str, task};
use std::hashmap::HashSet;
pub use std::path::Path; pub use std::path::Path;
use extra::workcache; use extra::workcache;
@ -840,7 +841,8 @@ pub fn main_args(args: &[~str]) -> int {
save_temps: save_temps, save_temps: save_temps,
target: target, target: target,
target_cpu: target_cpu, target_cpu: target_cpu,
additional_library_paths: ~[], // No way to set this from the rustpkg command line additional_library_paths:
HashSet::new(), // No way to set this from the rustpkg command line
experimental_features: experimental_features experimental_features: experimental_features
}; };

View File

@ -285,11 +285,7 @@ pub fn compile_input(context: &BuildContext,
debug!("a dependency: {}", p.display()); debug!("a dependency: {}", p.display());
// Pass the directory containing a dependency // Pass the directory containing a dependency
// as an additional lib search path // as an additional lib search path
if !addl_lib_search_paths.contains(&p) { addl_lib_search_paths.insert(p);
// Might be inefficient, but this set probably
// won't get too large -- tjc
addl_lib_search_paths.push(p);
}
}); });
// Inject the link attributes so we get the right package name and version // Inject the link attributes so we get the right package name and version

View File

@ -0,0 +1,17 @@
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// xfail-fast
// aux-build:anon-extern-mod-cross-crate-1.rs
// aux-build:anon-extern-mod-cross-crate-1.rs
extern mod anonexternmod;
pub fn main() { }