auto merge of #10089 : pythonesque/rust/issue-7718, r=catamorphism

Seems pretty straightforward, but please let me know if I'm doing something wrong or the test needs to be rewritten.
This commit is contained in:
bors 2013-10-28 09:51:32 -07:00
commit 0a9a706b20
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 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()

View File

@ -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<Path>, // 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,

View File

@ -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<Path>)
-> @FileSearch {
struct FileSearchImpl {
sysroot: @Path,
addl_lib_search_paths: @mut ~[Path],
addl_lib_search_paths: @mut HashSet<Path>,
target_triple: ~str
}
impl FileSearch for FileSearchImpl {

View File

@ -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<Path>) -> (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: &Path) -> (clean::Crate, CrateAnalysis) {
let (ctxt, analysis) = get_ast_and_resolve(path, libs);
let ctxt = @ctxt;
debug!("defmap:");

View File

@ -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);

View File

@ -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<Path> {
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<Path>,
// 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
}
}

View File

@ -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
};

View File

@ -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

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() { }