@@ -1273,17 +1273,7 @@ fn normalize(package_root: &Path,
1273
1273
default : & mut FnMut ( & TomlBinTarget ) -> PathBuf | {
1274
1274
for bin in bins. iter ( ) {
1275
1275
let path = bin. path . clone ( ) . unwrap_or_else ( || {
1276
- let default_bin_path = PathValue ( default ( bin) ) ;
1277
- if package_root. join ( & default_bin_path. 0 ) . exists ( ) {
1278
- default_bin_path // inferred from bin's name
1279
- } else {
1280
- let path = PathValue ( Path :: new ( "src" ) . join ( "main.rs" ) ) ;
1281
- if package_root. join ( & path. 0 ) . exists ( ) {
1282
- path
1283
- } else {
1284
- PathValue ( Path :: new ( "src" ) . join ( "bin" ) . join ( "main.rs" ) )
1285
- }
1286
- }
1276
+ PathValue ( default ( bin) )
1287
1277
} ) ;
1288
1278
let mut target = Target :: bin_target ( & bin. name ( ) , package_root. join ( & path. 0 ) ,
1289
1279
bin. required_features . clone ( ) ) ;
@@ -1359,14 +1349,13 @@ fn normalize(package_root: &Path,
1359
1349
if let Some ( ref lib) = * lib {
1360
1350
lib_target ( & mut ret, lib) ;
1361
1351
bin_targets ( & mut ret, bins,
1362
- & mut |bin| Path :: new ( "src" ) . join ( "bin" )
1363
- . join ( & format ! ( "{}.rs" , bin. name( ) ) ) ) ;
1352
+ & mut |bin| inferred_bin_path ( bin, package_root, true , bins. len ( ) ) ) ;
1364
1353
} else if bins. len ( ) > 0 {
1365
1354
bin_targets ( & mut ret, bins,
1366
- & mut |bin| Path :: new ( "src" )
1367
- . join ( & format ! ( "{}.rs" , bin. name( ) ) ) ) ;
1355
+ & mut |bin| inferred_bin_path ( bin, package_root, false , bins. len ( ) ) ) ;
1368
1356
}
1369
1357
1358
+
1370
1359
if let Some ( custom_build) = custom_build {
1371
1360
custom_build_target ( & mut ret, & custom_build) ;
1372
1361
}
@@ -1394,6 +1383,59 @@ fn normalize(package_root: &Path,
1394
1383
ret
1395
1384
}
1396
1385
1386
+ fn inferred_bin_path ( bin : & TomlBinTarget ,
1387
+ package_root : & Path ,
1388
+ lib : bool ,
1389
+ bin_len : usize ) -> PathBuf {
1390
+ // we have a lib with multiple bins, so the bins are expected to be located
1391
+ // inside src/bin
1392
+ if lib && bin_len > 1 {
1393
+ return Path :: new ( "src" ) . join ( "bin" ) . join ( & format ! ( "{}.rs" , bin. name( ) ) )
1394
+ . to_path_buf ( )
1395
+ }
1396
+
1397
+ // we have a lib with one bin, so it's either src/main.rs, src/bin/foo.rs or
1398
+ // src/bin/main.rs
1399
+ if lib && bin_len == 1 {
1400
+ let path = Path :: new ( "src" ) . join ( & format ! ( "main.rs" ) ) ;
1401
+ if package_root. join ( & path) . exists ( ) {
1402
+ return path. to_path_buf ( )
1403
+ }
1404
+
1405
+ let path = Path :: new ( "src" ) . join ( "bin" ) . join ( & format ! ( "{}.rs" , bin. name( ) ) ) ;
1406
+ if package_root. join ( & path) . exists ( ) {
1407
+ return path. to_path_buf ( )
1408
+ }
1409
+
1410
+ return Path :: new ( "src" ) . join ( "bin" ) . join ( & format ! ( "main.rs" ) ) . to_path_buf ( )
1411
+ }
1412
+
1413
+ // here we have a single bin, so it may be located in src/main.rs, src/foo.rs,
1414
+ // srb/bin/foo.rs or src/bin/main.rs
1415
+ if bin_len == 1 {
1416
+ let path = Path :: new ( "src" ) . join ( & format ! ( "main.rs" ) ) ;
1417
+ if package_root. join ( & path) . exists ( ) {
1418
+ return path. to_path_buf ( )
1419
+ }
1420
+
1421
+ let path = Path :: new ( "src" ) . join ( & format ! ( "{}.rs" , bin. name( ) ) ) ;
1422
+ if package_root. join ( & path) . exists ( ) {
1423
+ return path. to_path_buf ( )
1424
+ }
1425
+
1426
+ let path = Path :: new ( "src" ) . join ( "bin" ) . join ( & format ! ( "{}.rs" , bin. name( ) ) ) ;
1427
+ if package_root. join ( & path) . exists ( ) {
1428
+ return path. to_path_buf ( )
1429
+ }
1430
+
1431
+ return Path :: new ( "src" ) . join ( "bin" ) . join ( & format ! ( "main.rs" ) ) . to_path_buf ( )
1432
+
1433
+ }
1434
+
1435
+ // here we have multiple bins, so they are expected to be located inside src/bin
1436
+ Path :: new ( "src" ) . join ( "bin" ) . join ( & format ! ( "{}.rs" , bin. name( ) ) ) . to_path_buf ( )
1437
+ }
1438
+
1397
1439
fn build_profiles ( profiles : & Option < TomlProfiles > ) -> Profiles {
1398
1440
let profiles = profiles. as_ref ( ) ;
1399
1441
let mut profiles = Profiles {
0 commit comments