Skip to content

Improve error message, when found staticlib instead crate #21978

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 7, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/librustc/metadata/creader.rs
Original file line number Diff line number Diff line change
@@ -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.
//
Expand Down Expand Up @@ -419,6 +419,7 @@ impl<'a> CrateReader<'a> {
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();
Expand Down Expand Up @@ -483,6 +484,7 @@ impl<'a> CrateReader<'a> {
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() {
Expand Down
31 changes: 27 additions & 4 deletions src/librustc/metadata/loader.rs
Original file line number Diff line number Diff line change
@@ -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.
//
Expand Down Expand Up @@ -257,6 +257,7 @@ pub struct Context<'a> {
pub root: &'a Option<CratePaths>,
pub rejected_via_hash: Vec<CrateMismatch>,
pub rejected_via_triple: Vec<CrateMismatch>,
pub rejected_via_kind: Vec<CrateMismatch>,
pub should_match_name: bool,
}

Expand Down Expand Up @@ -311,6 +312,8 @@ impl<'a> Context<'a> {
} 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)
};
Expand All @@ -335,8 +338,8 @@ impl<'a> Context<'a> {
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 => {}
Expand All @@ -349,6 +352,16 @@ impl<'a> Context<'a> {
}
}
}
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();
}

Expand All @@ -369,8 +382,10 @@ impl<'a> Context<'a> {
// 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
Expand All @@ -391,14 +406,21 @@ impl<'a> Context<'a> {
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) &&
file.ends_with(&dypair.1) {
(&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());
Expand All @@ -415,6 +437,7 @@ impl<'a> Context<'a> {

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
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
-include ../tools.mk

all:
$(RUSTC) foo.rs --crate-type staticlib
$(RUSTC) bar.rs 2>&1 | grep "error: found staticlib"
15 changes: 15 additions & 0 deletions src/test/run-make/error-found-staticlib-instead-crate/bar.rs
Original file line number Diff line number Diff line change
@@ -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 <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.

extern crate foo;

fn main() {
foo::foo();
}
11 changes: 11 additions & 0 deletions src/test/run-make/error-found-staticlib-instead-crate/foo.rs
Original file line number Diff line number Diff line change
@@ -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 <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.

pub fn foo() {}