diff --git a/src/librustc/driver/driver.rs b/src/librustc/driver/driver.rs index d2b0dad80f6..8aba36370d0 100644 --- a/src/librustc/driver/driver.rs +++ b/src/librustc/driver/driver.rs @@ -757,7 +757,9 @@ pub fn build_session_options(binary: @str, 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_args = matches.opt_strs("link-args").flat_map( |a| { a.split_iter(' ').map(|arg| arg.to_owned()).collect() diff --git a/src/librustc/driver/session.rs b/src/librustc/driver/session.rs index 6c176f04fe8..8c1693935c7 100644 --- a/src/librustc/driver/session.rs +++ b/src/librustc/driver/session.rs @@ -29,7 +29,7 @@ use syntax::parse::token; use syntax; use std::int; -use std::hashmap::HashMap; +use std::hashmap::{HashMap,HashSet}; #[deriving(Eq)] pub enum Os { OsWin32, OsMacos, OsLinux, OsAndroid, OsFreebsd, } @@ -158,9 +158,9 @@ pub struct options { save_temps: bool, jit: bool, output_type: back::link::output_type, - addl_lib_search_paths: @mut ~[Path], // This is mutable for rustpkg, which - // updates search paths based on the - // parsed code + addl_lib_search_paths: @mut HashSet, // This is mutable for rustpkg, which + // updates search paths based on the + // parsed code linker: Option<~str>, linker_args: ~[~str], maybe_sysroot: Option<@Path>, @@ -366,7 +366,7 @@ pub fn basic_options() -> @options { save_temps: false, jit: false, output_type: link::output_type_exe, - addl_lib_search_paths: @mut ~[], + addl_lib_search_paths: @mut HashSet::new(), linker: None, linker_args: ~[], maybe_sysroot: None, diff --git a/src/librustc/metadata/filesearch.rs b/src/librustc/metadata/filesearch.rs index 4b679072bba..94dfc006076 100644 --- a/src/librustc/metadata/filesearch.rs +++ b/src/librustc/metadata/filesearch.rs @@ -40,11 +40,11 @@ pub trait FileSearch { pub fn mk_filesearch(maybe_sysroot: &Option<@Path>, target_triple: &str, - addl_lib_search_paths: @mut ~[Path]) + addl_lib_search_paths: @mut HashSet) -> @FileSearch { struct FileSearchImpl { sysroot: @Path, - addl_lib_search_paths: @mut ~[Path], + addl_lib_search_paths: @mut HashSet, target_triple: ~str } impl FileSearch for FileSearchImpl { diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index b6e16720459..0a30978db2b 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -20,7 +20,7 @@ use syntax; use std::os; use std::local_data; -use std::hashmap::HashMap; +use std::hashmap::{HashMap,HashSet}; use visit_ast::RustdocVisitor; use clean; @@ -39,7 +39,7 @@ pub struct CrateAnalysis { /// Parses, resolves, and typechecks the given crate fn get_ast_and_resolve(cpath: &Path, - libs: ~[Path]) -> (DocContext, CrateAnalysis) { + libs: HashSet) -> (DocContext, CrateAnalysis) { use syntax::codemap::dummy_spanned; use rustc::driver::driver::{file_input, build_configuration, phase_1_parse_input, @@ -89,7 +89,7 @@ fn get_ast_and_resolve(cpath: &Path, 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) -> (clean::Crate, CrateAnalysis) { let (ctxt, analysis) = get_ast_and_resolve(path, libs); let ctxt = @ctxt; debug!("defmap:"); diff --git a/src/librustdoc/rustdoc.rs b/src/librustdoc/rustdoc.rs index c0fab1ad98f..770d535c6ea 100644 --- a/src/librustdoc/rustdoc.rs +++ b/src/librustdoc/rustdoc.rs @@ -198,7 +198,7 @@ fn rust_input(cratefile: &str, matches: &getopts::Matches) -> Output { info!("starting to run rustc"); let (crate, analysis) = do std::task::try { let cr = cr.take(); - core::run_core(libs.take(), &cr) + core::run_core(libs.take().move_iter().collect(), &cr) }.unwrap(); info!("finished with rustc"); local_data::set(analysiskey, analysis); diff --git a/src/librustpkg/context.rs b/src/librustpkg/context.rs index bee21d70b2d..77fe2ae8f70 100644 --- a/src/librustpkg/context.rs +++ b/src/librustpkg/context.rs @@ -10,10 +10,12 @@ // Context data structure used by rustpkg -use std::os; use extra::workcache; use rustc::driver::session::{OptLevel, No}; +use std::hashmap::HashSet; +use std::os; + #[deriving(Clone)] pub struct Context { // Config strings that the user passed in with --cfg @@ -60,7 +62,7 @@ impl BuildContext { self.context.add_library_path(p); } - pub fn additional_library_paths(&self) -> ~[Path] { + pub fn additional_library_paths(&self) -> HashSet { self.context.rustc_flags.additional_library_paths.clone() } } @@ -96,7 +98,7 @@ pub struct RustcFlags { target_cpu: Option<~str>, // Additional library directories, which get passed with the -L flag // This can't be set with a rustpkg flag, only from package scripts - additional_library_paths: ~[Path], + additional_library_paths: HashSet, // Any -Z features experimental_features: Option<~[~str]> } @@ -163,7 +165,7 @@ impl Context { } 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, target: None, target_cpu: None, - additional_library_paths: ~[], + additional_library_paths: HashSet::new(), experimental_features: None } } diff --git a/src/librustpkg/rustpkg.rs b/src/librustpkg/rustpkg.rs index 95a2c5b1702..1711dc99235 100644 --- a/src/librustpkg/rustpkg.rs +++ b/src/librustpkg/rustpkg.rs @@ -25,6 +25,7 @@ extern mod rustc; extern mod syntax; use std::{os, result, run, str, task}; +use std::hashmap::HashSet; pub use std::path::Path; use extra::workcache; @@ -841,7 +842,8 @@ pub fn main_args(args: &[~str]) -> int { save_temps: save_temps, target: target, 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 }; diff --git a/src/librustpkg/util.rs b/src/librustpkg/util.rs index 3824f6d38de..026f443ec79 100644 --- a/src/librustpkg/util.rs +++ b/src/librustpkg/util.rs @@ -285,11 +285,7 @@ pub fn compile_input(context: &BuildContext, debug!("a dependency: {}", p.display()); // Pass the directory containing a dependency // as an additional lib search path - if !addl_lib_search_paths.contains(&p) { - // Might be inefficient, but this set probably - // won't get too large -- tjc - addl_lib_search_paths.push(p); - } + addl_lib_search_paths.insert(p); }); // Inject the link attributes so we get the right package name and version diff --git a/src/test/run-pass/duplicated-external-mods.rs b/src/test/run-pass/duplicated-external-mods.rs new file mode 100644 index 00000000000..4eaae8b0ef4 --- /dev/null +++ b/src/test/run-pass/duplicated-external-mods.rs @@ -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 or the MIT license +// , 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() { } +