Fix rust 40955

This commit is contained in:
Jakub Matraszek 2017-04-04 23:58:31 +02:00
parent 305fa6825e
commit 277e08962d
2 changed files with 76 additions and 15 deletions

View file

@ -1273,17 +1273,7 @@ fn normalize(package_root: &Path,
default: &mut FnMut(&TomlBinTarget) -> PathBuf| {
for bin in bins.iter() {
let path = bin.path.clone().unwrap_or_else(|| {
let default_bin_path = PathValue(default(bin));
if package_root.join(&default_bin_path.0).exists() {
default_bin_path // inferred from bin's name
} else {
let path = PathValue(Path::new("src").join("main.rs"));
if package_root.join(&path.0).exists() {
path
} else {
PathValue(Path::new("src").join("bin").join("main.rs"))
}
}
PathValue(default(bin))
});
let mut target = Target::bin_target(&bin.name(), package_root.join(&path.0),
bin.required_features.clone());
@ -1359,14 +1349,13 @@ fn normalize(package_root: &Path,
if let Some(ref lib) = *lib {
lib_target(&mut ret, lib);
bin_targets(&mut ret, bins,
&mut |bin| Path::new("src").join("bin")
.join(&format!("{}.rs", bin.name())));
&mut |bin| inferred_bin_path(bin, package_root, true, bins.len()));
} else if bins.len() > 0 {
bin_targets(&mut ret, bins,
&mut |bin| Path::new("src")
.join(&format!("{}.rs", bin.name())));
&mut |bin| inferred_bin_path(bin, package_root, false, bins.len()));
}
if let Some(custom_build) = custom_build {
custom_build_target(&mut ret, &custom_build);
}
@ -1394,6 +1383,53 @@ fn normalize(package_root: &Path,
ret
}
fn inferred_bin_path(bin: &TomlBinTarget, package_root: &Path, lib: bool, bin_len: usize) -> PathBuf {
// we have a lib with multiple bins, so the bins are expected to be located inside src/bin
if lib && bin_len > 1 {
return Path::new("src").join("bin").join(&format!("{}.rs", bin.name())).to_path_buf()
}
// we have a lib with one bin, so it's either src/main.rs, src/bin/foo.rs or src/bin/main.rs
if lib && bin_len == 1 {
let path = Path::new("src").join(&format!("main.rs"));
if package_root.join(&path).exists() {
return path.to_path_buf()
}
let path = Path::new("src").join("bin").join(&format!("{}.rs", bin.name()));
if package_root.join(&path).exists() {
return path.to_path_buf()
}
return Path::new("src").join("bin").join(&format!("main.rs")).to_path_buf()
}
// here we have a single bin, so it may be located in src/main.rs, src/foo.rs,
// srb/bin/foo.rs or src/bin/main.rs
if bin_len == 1 {
let path = Path::new("src").join(&format!("main.rs"));
if package_root.join(&path).exists() {
return path.to_path_buf()
}
let path = Path::new("src").join(&format!("{}.rs", bin.name()));
if package_root.join(&path).exists() {
return path.to_path_buf()
}
let path = Path::new("src").join("bin").join(&format!("{}.rs", bin.name()));
if package_root.join(&path).exists() {
return path.to_path_buf()
}
return Path::new("src").join("bin").join(&format!("main.rs")).to_path_buf()
}
// here we have multiple bins, so they are expected to be located inside src/bin
Path::new("src").join("bin").join(&format!("{}.rs", bin.name())).to_path_buf()
}
fn build_profiles(profiles: &Option<TomlProfiles>) -> Profiles {
let profiles = profiles.as_ref();
let mut profiles = Profiles {

View file

@ -2870,3 +2870,28 @@ fn run_proper_binary_main_rs() {
assert_that(p.cargo_process("run").arg("--bin").arg("foo"),
execs().with_status(0));
}
#[test]
fn run_proper_binary_main_rs_as_foo() {
let p = project("foo")
.file("Cargo.toml", r#"
[package]
name = "foo"
authors = []
version = "0.0.0"
[[bin]]
name = "foo"
"#)
.file("src/foo.rs", r#"
fn main() {
panic!("This should never be run.");
}
"#)
.file("src/main.rs", r#"
fn main() {
}
"#);
assert_that(p.cargo_process("run").arg("--bin").arg("foo"),
execs().with_status(0));
}