diff --git a/src/cargo/util/toml.rs b/src/cargo/util/toml.rs index 771f48ddfda..c9803cf91d2 100644 --- a/src/cargo/util/toml.rs +++ b/src/cargo/util/toml.rs @@ -1422,11 +1422,25 @@ fn inferred_bin_path(bin: &TomlBinTarget, } return Path::new("src").join("bin").join(&format!("main.rs")).to_path_buf() + } + + // bin_len > 1 + let path = Path::new("src").join("bin").join(&format!("{}.rs", bin.name())); + 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!("main.rs")); + if package_root.join(&path).exists() { + return path.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() + return Path::new("src").join(&format!("main.rs")).to_path_buf() } fn build_profiles(profiles: &Option) -> Profiles { diff --git a/tests/build.rs b/tests/build.rs index 0e76f569d96..13ab076616d 100644 --- a/tests/build.rs +++ b/tests/build.rs @@ -3010,6 +3010,68 @@ fn run_proper_binary_main_rs() { execs().with_status(0)); } +#[test] +fn run_proper_alias_binary_from_src() { + let p = project("foo") + .file("Cargo.toml", r#" + [package] + name = "foo" + authors = [] + version = "0.0.0" + [[bin]] + name = "foo" + [[bin]] + name = "bar" + "#) + .file("src/foo.rs", r#" + fn main() { + println!("foo"); + } + "#).file("src/bar.rs", r#" + fn main() { + println!("bar"); + } + "#); + + assert_that(p.cargo_process("build") + .arg("--all"), + execs().with_status(0) + ); + assert_that(process(&p.bin("foo")), + execs().with_status(0).with_stdout("foo\n")); + assert_that(process(&p.bin("bar")), + execs().with_status(0).with_stdout("bar\n")); +} + +#[test] +fn run_proper_alias_binary_main_rs() { + let p = project("foo") + .file("Cargo.toml", r#" + [package] + name = "foo" + authors = [] + version = "0.0.0" + [[bin]] + name = "foo" + [[bin]] + name = "bar" + "#) + .file("src/main.rs", r#" + fn main() { + println!("main"); + } + "#); + + assert_that(p.cargo_process("build") + .arg("--all"), + execs().with_status(0) + ); + assert_that(process(&p.bin("foo")), + execs().with_status(0).with_stdout("main\n")); + assert_that(process(&p.bin("bar")), + execs().with_status(0).with_stdout("main\n")); +} + #[test] fn run_proper_binary_main_rs_as_foo() { let p = project("foo")