@@ -261,48 +261,60 @@ pub fn resolve_bins(
261261 errors : & mut Vec < String > ,
262262 has_lib : bool ,
263263) -> CargoResult < Vec < TomlBinTarget > > {
264- let inferred = inferred_bins ( package_root, package_name) ;
264+ if is_resolved ( toml_bins, autodiscover) {
265+ let toml_bins = toml_bins. cloned ( ) . unwrap_or_default ( ) ;
266+ for bin in & toml_bins {
267+ validate_bin_name ( bin, warnings) ?;
268+ validate_bin_crate_types ( bin, edition, warnings, errors) ?;
269+ validate_bin_proc_macro ( bin, edition, warnings, errors) ?;
270+ }
271+ Ok ( toml_bins)
272+ } else {
273+ let inferred = inferred_bins ( package_root, package_name) ;
265274
266- let mut bins = toml_targets_and_inferred (
267- toml_bins,
268- & inferred,
269- package_root,
270- autodiscover,
271- edition,
272- warnings,
273- "binary" ,
274- "bin" ,
275- "autobins" ,
276- ) ;
275+ let mut bins = toml_targets_and_inferred (
276+ toml_bins,
277+ & inferred,
278+ package_root,
279+ autodiscover,
280+ edition,
281+ warnings,
282+ "binary" ,
283+ "bin" ,
284+ "autobins" ,
285+ ) ;
277286
278- for bin in & mut bins {
279- // Check early to improve error messages
280- validate_bin_name ( bin, warnings) ?;
287+ for bin in & mut bins {
288+ // Check early to improve error messages
289+ validate_bin_name ( bin, warnings) ?;
281290
282- validate_bin_crate_types ( bin, edition, warnings, errors) ?;
283- validate_bin_proc_macro ( bin, edition, warnings, errors) ?;
291+ validate_bin_crate_types ( bin, edition, warnings, errors) ?;
292+ validate_bin_proc_macro ( bin, edition, warnings, errors) ?;
284293
285- let path = target_path ( bin, & inferred, "bin" , package_root, edition, & mut |_| {
286- if let Some ( legacy_path) = legacy_bin_path ( package_root, name_or_panic ( bin) , has_lib) {
287- warnings. push ( format ! (
288- "path `{}` was erroneously implicitly accepted for binary `{}`,\n \
294+ let path = target_path ( bin, & inferred, "bin" , package_root, edition, & mut |_| {
295+ if let Some ( legacy_path) =
296+ legacy_bin_path ( package_root, name_or_panic ( bin) , has_lib)
297+ {
298+ warnings. push ( format ! (
299+ "path `{}` was erroneously implicitly accepted for binary `{}`,\n \
289300 please set bin.path in Cargo.toml",
290- legacy_path. display( ) ,
291- name_or_panic( bin)
292- ) ) ;
293- Some ( legacy_path)
294- } else {
295- None
296- }
297- } ) ;
298- let path = match path {
299- Ok ( path) => path,
300- Err ( e) => anyhow:: bail!( "{}" , e) ,
301- } ;
302- bin. path = Some ( PathValue ( path) ) ;
303- }
301+ legacy_path. display( ) ,
302+ name_or_panic( bin)
303+ ) ) ;
304+ Some ( legacy_path)
305+ } else {
306+ None
307+ }
308+ } ) ;
309+ let path = match path {
310+ Ok ( path) => path,
311+ Err ( e) => anyhow:: bail!( "{}" , e) ,
312+ } ;
313+ bin. path = Some ( PathValue ( path) ) ;
314+ }
304315
305- Ok ( bins)
316+ Ok ( bins)
317+ }
306318}
307319
308320#[ tracing:: instrument( skip_all) ]
@@ -536,6 +548,19 @@ fn to_bench_targets(
536548 Ok ( result)
537549}
538550
551+ fn is_resolved ( toml_targets : Option < & Vec < TomlTarget > > , autodiscover : Option < bool > ) -> bool {
552+ if autodiscover != Some ( false ) {
553+ return false ;
554+ }
555+
556+ let Some ( toml_targets) = toml_targets else {
557+ return true ;
558+ } ;
559+ toml_targets
560+ . iter ( )
561+ . all ( |t| t. name . is_some ( ) && t. path . is_some ( ) )
562+ }
563+
539564fn resolve_targets (
540565 target_kind_human : & str ,
541566 target_kind : & str ,
@@ -576,48 +601,60 @@ fn resolve_targets_with_legacy_path(
576601 legacy_path : & mut dyn FnMut ( & TomlTarget ) -> Option < PathBuf > ,
577602 autodiscover_flag_name : & str ,
578603) -> CargoResult < Vec < TomlTarget > > {
579- let inferred = inferred ( ) ;
580- let toml_targets = toml_targets_and_inferred (
581- toml_targets,
582- & inferred,
583- package_root,
584- autodiscover,
585- edition,
586- warnings,
587- target_kind_human,
588- target_kind,
589- autodiscover_flag_name,
590- ) ;
591-
592- for target in & toml_targets {
593- // Check early to improve error messages
594- validate_target_name ( target, target_kind_human, target_kind, warnings) ?;
595-
596- validate_proc_macro ( target, target_kind_human, edition, warnings) ?;
597- validate_crate_types ( target, target_kind_human, edition, warnings) ?;
598- }
599-
600- let mut result = Vec :: new ( ) ;
601- for mut target in toml_targets {
602- let path = target_path (
603- & target,
604+ if is_resolved ( toml_targets, autodiscover) {
605+ let toml_targets = toml_targets. cloned ( ) . unwrap_or_default ( ) ;
606+ for target in & toml_targets {
607+ // Check early to improve error messages
608+ validate_target_name ( target, target_kind_human, target_kind, warnings) ?;
609+
610+ validate_proc_macro ( target, target_kind_human, edition, warnings) ?;
611+ validate_crate_types ( target, target_kind_human, edition, warnings) ?;
612+ }
613+ Ok ( toml_targets)
614+ } else {
615+ let inferred = inferred ( ) ;
616+ let toml_targets = toml_targets_and_inferred (
617+ toml_targets,
604618 & inferred,
605- target_kind,
606619 package_root,
620+ autodiscover,
607621 edition,
608- legacy_path,
622+ warnings,
623+ target_kind_human,
624+ target_kind,
625+ autodiscover_flag_name,
609626 ) ;
610- let path = match path {
611- Ok ( path) => path,
612- Err ( e) => {
613- errors. push ( e) ;
614- continue ;
615- }
616- } ;
617- target. path = Some ( PathValue ( path) ) ;
618- result. push ( target) ;
627+
628+ for target in & toml_targets {
629+ // Check early to improve error messages
630+ validate_target_name ( target, target_kind_human, target_kind, warnings) ?;
631+
632+ validate_proc_macro ( target, target_kind_human, edition, warnings) ?;
633+ validate_crate_types ( target, target_kind_human, edition, warnings) ?;
634+ }
635+
636+ let mut result = Vec :: new ( ) ;
637+ for mut target in toml_targets {
638+ let path = target_path (
639+ & target,
640+ & inferred,
641+ target_kind,
642+ package_root,
643+ edition,
644+ legacy_path,
645+ ) ;
646+ let path = match path {
647+ Ok ( path) => path,
648+ Err ( e) => {
649+ errors. push ( e) ;
650+ continue ;
651+ }
652+ } ;
653+ target. path = Some ( PathValue ( path) ) ;
654+ result. push ( target) ;
655+ }
656+ Ok ( result)
619657 }
620- Ok ( result)
621658}
622659
623660fn inferred_lib ( package_root : & Path ) -> Option < PathBuf > {
0 commit comments