diff --git a/src/librustc/metadata/creader.rs b/src/librustc/metadata/creader.rs index 34bd1724e521b5eed6576c57b57525090c705bfc..e3859f6de488af038e530f000cc4bd21ca3de743 100644 --- a/src/librustc/metadata/creader.rs +++ b/src/librustc/metadata/creader.rs @@ -1,4 +1,4 @@ -// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT +// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -419,6 +419,7 @@ fn resolve_crate(&mut self, root: root, rejected_via_hash: vec!(), rejected_via_triple: vec!(), + rejected_via_kind: vec!(), should_match_name: true, }; let library = load_ctxt.load_library_crate(); @@ -483,6 +484,7 @@ pub fn read_plugin_metadata<'b>(&'b mut self, root: &None, rejected_via_hash: vec!(), rejected_via_triple: vec!(), + rejected_via_kind: vec!(), should_match_name: true, }; let library = match load_ctxt.maybe_load_library_crate() { diff --git a/src/librustc/metadata/loader.rs b/src/librustc/metadata/loader.rs index d30df131d4d299da551e99f9545d7ab53ae8d2ed..c7e40c6c7768776fc908d86a4f65ef3ae1df2f28 100644 --- a/src/librustc/metadata/loader.rs +++ b/src/librustc/metadata/loader.rs @@ -1,4 +1,4 @@ -// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT +// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -257,6 +257,7 @@ pub struct Context<'a> { pub root: &'a Option, pub rejected_via_hash: Vec, pub rejected_via_triple: Vec, + pub rejected_via_kind: Vec, pub should_match_name: bool, } @@ -311,6 +312,8 @@ pub fn report_load_errs(&mut self) { } else if self.rejected_via_triple.len() > 0 { format!("couldn't find crate `{}` with expected target triple {}", self.ident, self.triple) + } else if self.rejected_via_kind.len() > 0 { + format!("found staticlib `{}` instead of rlib or dylib", self.ident) } else { format!("can't find crate for `{}`", self.ident) }; @@ -335,8 +338,8 @@ pub fn report_load_errs(&mut self) { let mismatches = self.rejected_via_hash.iter(); for (i, &CrateMismatch{ ref path, .. }) in mismatches.enumerate() { self.sess.fileline_note(self.span, - &format!("crate `{}` path {}{}: {}", - self.ident, "#", i+1, path.display())[]); + &format!("crate `{}` path #{}: {}", + self.ident, i+1, path.display())[]); } match self.root { &None => {} @@ -349,6 +352,16 @@ pub fn report_load_errs(&mut self) { } } } + if self.rejected_via_kind.len() > 0 { + self.sess.span_help(self.span, "please recompile this crate using \ + --crate-type lib"); + let mismatches = self.rejected_via_kind.iter(); + for (i, &CrateMismatch { ref path, .. }) in mismatches.enumerate() { + self.sess.fileline_note(self.span, + &format!("crate `{}` path #{}: {}", + self.ident, i+1, path.display())[]); + } + } self.sess.abort_if_errors(); } @@ -369,8 +382,10 @@ fn find_library_crate(&mut self) -> Option { // want: crate_name.dir_part() + prefix + crate_name.file_part + "-" let dylib_prefix = format!("{}{}", dypair.0, self.crate_name); let rlib_prefix = format!("lib{}", self.crate_name); + let staticlib_prefix = format!("lib{}", self.crate_name); let mut candidates = HashMap::new(); + let mut staticlibs = vec!(); // First, find all possible candidate rlibs and dylibs purely based on // the name of the files themselves. We're trying to match against an @@ -391,7 +406,7 @@ fn find_library_crate(&mut self) -> Option { Some(file) => file, }; let (hash, rlib) = if file.starts_with(&rlib_prefix[]) && - file.ends_with(".rlib") { + file.ends_with(".rlib") { (&file[(rlib_prefix.len()) .. (file.len() - ".rlib".len())], true) } else if file.starts_with(&dylib_prefix) && @@ -399,6 +414,13 @@ fn find_library_crate(&mut self) -> Option { (&file[(dylib_prefix.len()) .. (file.len() - dypair.1.len())], false) } else { + if file.starts_with(&staticlib_prefix[]) && + file.ends_with(".a") { + staticlibs.push(CrateMismatch { + path: path.clone(), + got: "static".to_string() + }); + } return FileDoesntMatch }; info!("lib candidate: {}", path.display()); @@ -415,6 +437,7 @@ fn find_library_crate(&mut self) -> Option { FileMatches }); + self.rejected_via_kind.extend(staticlibs.into_iter()); // We have now collected all known libraries into a set of candidates // keyed of the filename hash listed. For each filename, we also have a diff --git a/src/test/run-make/error-found-staticlib-instead-crate/Makefile b/src/test/run-make/error-found-staticlib-instead-crate/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..46be2385636952ef58cff581a3ef23a08286cae3 --- /dev/null +++ b/src/test/run-make/error-found-staticlib-instead-crate/Makefile @@ -0,0 +1,5 @@ +-include ../tools.mk + +all: + $(RUSTC) foo.rs --crate-type staticlib + $(RUSTC) bar.rs 2>&1 | grep "error: found staticlib" diff --git a/src/test/run-make/error-found-staticlib-instead-crate/bar.rs b/src/test/run-make/error-found-staticlib-instead-crate/bar.rs new file mode 100644 index 0000000000000000000000000000000000000000..5ab3e5ee99dd8ca949035eaa7b52313a2ad7e648 --- /dev/null +++ b/src/test/run-make/error-found-staticlib-instead-crate/bar.rs @@ -0,0 +1,15 @@ +// Copyright 2015 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. + +extern crate foo; + +fn main() { + foo::foo(); +} diff --git a/src/test/run-make/error-found-staticlib-instead-crate/foo.rs b/src/test/run-make/error-found-staticlib-instead-crate/foo.rs new file mode 100644 index 0000000000000000000000000000000000000000..222d98a12de9dddaf1c6294b21ed029713f978c6 --- /dev/null +++ b/src/test/run-make/error-found-staticlib-instead-crate/foo.rs @@ -0,0 +1,11 @@ +// Copyright 2015 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. + +pub fn foo() {}