Skip to content

Commit

Permalink
Auto merge of #21978 - Potpourri:error-extern-crate-staticlib, r=alex…
Browse files Browse the repository at this point in the history
…crichton

Add special error for this case and help message `please recompile this crate using --crate-type lib`, also list found candidates.

See issue #14416

r? @alexcrichton
  • Loading branch information
bors committed Feb 7, 2015
2 parents 0b6dbbc + 8e3df86 commit e62fec3
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 5 deletions.
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() {}

0 comments on commit e62fec3

Please sign in to comment.