2020//! let metadata = Metadata::from_crate_root(&source_root)?;
2121//!
2222//! // Next, learn what arguments we need to pass to `cargo`.
23- //! let targets = metadata.targets();
23+ //! let targets = metadata.targets(/* include_default_targets: */ true );
2424//! let mut cargo_args = metadata.cargo_args(&[], &[]);
2525//! cargo_args.push(targets.default_target.into());
2626//!
@@ -190,7 +190,10 @@ impl Metadata {
190190 /// Return the targets that should be built.
191191 ///
192192 /// The `default_target` will never be one of the `other_targets`.
193- pub fn targets ( & self ) -> BuildTargets < ' _ > {
193+ /// If `include_default_targets` is `true` and `targets` is unset, this also includes
194+ /// [`DEFAULT_TARGETS`]. Otherwise, if `include_default_targets` is `false` and `targets`
195+ /// is unset, `other_targets` will be empty.
196+ pub fn targets ( & self , include_default_targets : bool ) -> BuildTargets < ' _ > {
194197 let default_target = self
195198 . default_target
196199 . as_deref ( )
@@ -202,12 +205,16 @@ impl Metadata {
202205 } )
203206 . unwrap_or ( HOST_TARGET ) ;
204207
205- // Let people opt-in to only having specific targets
206- let mut targets: HashSet < _ > = self
208+ let crate_targets = self
207209 . targets
208210 . as_ref ( )
209- . map ( |targets| targets. iter ( ) . map ( String :: as_str) . collect ( ) )
210- . unwrap_or_else ( || DEFAULT_TARGETS . iter ( ) . copied ( ) . collect ( ) ) ;
211+ . map ( |targets| targets. iter ( ) . map ( String :: as_str) . collect ( ) ) ;
212+ // Let people opt-in to only having specific targets
213+ let mut targets: HashSet < _ > = if include_default_targets {
214+ crate_targets. unwrap_or_else ( || DEFAULT_TARGETS . iter ( ) . copied ( ) . collect ( ) )
215+ } else {
216+ crate_targets. unwrap_or_default ( )
217+ } ;
211218
212219 targets. remove ( & default_target) ;
213220 BuildTargets {
@@ -412,7 +419,7 @@ mod test_targets {
412419 let BuildTargets {
413420 default_target : default,
414421 other_targets : tier_one,
415- } = metadata. targets ( ) ;
422+ } = metadata. targets ( true ) ;
416423 assert_eq ! ( default , HOST_TARGET ) ;
417424
418425 // should be equal to TARGETS \ {HOST_TARGET}
@@ -434,7 +441,7 @@ mod test_targets {
434441 let BuildTargets {
435442 default_target : default,
436443 other_targets : others,
437- } = metadata. targets ( ) ;
444+ } = metadata. targets ( true ) ;
438445
439446 assert_eq ! ( default , HOST_TARGET ) ;
440447 assert ! ( others. is_empty( ) ) ;
@@ -448,7 +455,7 @@ mod test_targets {
448455 let BuildTargets {
449456 default_target : default,
450457 other_targets : others,
451- } = metadata. targets ( ) ;
458+ } = metadata. targets ( true ) ;
452459
453460 assert_eq ! ( default , "i686-pc-windows-msvc" ) ;
454461 assert_eq ! ( others. len( ) , 1 ) ;
@@ -459,7 +466,7 @@ mod test_targets {
459466 let BuildTargets {
460467 default_target : default,
461468 other_targets : others,
462- } = metadata. targets ( ) ;
469+ } = metadata. targets ( true ) ;
463470
464471 assert_eq ! ( default , HOST_TARGET ) ;
465472 assert ! ( others. is_empty( ) ) ;
@@ -473,7 +480,7 @@ mod test_targets {
473480 let BuildTargets {
474481 default_target : default,
475482 other_targets : others,
476- } = metadata. targets ( ) ;
483+ } = metadata. targets ( true ) ;
477484
478485 assert_eq ! ( default , "i686-pc-windows-msvc" ) ;
479486 assert ! ( others. is_empty( ) ) ;
@@ -483,7 +490,7 @@ mod test_targets {
483490 let BuildTargets {
484491 default_target : default,
485492 other_targets : others,
486- } = metadata. targets ( ) ;
493+ } = metadata. targets ( true ) ;
487494
488495 assert_eq ! ( default , "i686-apple-darwin" ) ;
489496 assert_eq ! ( others. len( ) , 1 ) ;
@@ -494,7 +501,7 @@ mod test_targets {
494501 let BuildTargets {
495502 default_target : default,
496503 other_targets : others,
497- } = metadata. targets ( ) ;
504+ } = metadata. targets ( true ) ;
498505
499506 assert_eq ! ( default , "i686-apple-darwin" ) ;
500507 assert ! ( others. is_empty( ) ) ;
@@ -504,7 +511,7 @@ mod test_targets {
504511 let BuildTargets {
505512 default_target : default,
506513 other_targets : others,
507- } = metadata. targets ( ) ;
514+ } = metadata. targets ( true ) ;
508515
509516 assert_eq ! ( default , "i686-apple-darwin" ) ;
510517 let tier_one_targets_no_default = DEFAULT_TARGETS
@@ -515,6 +522,17 @@ mod test_targets {
515522
516523 assert_eq ! ( others, tier_one_targets_no_default) ;
517524 }
525+
526+ #[ test]
527+ fn no_default_targets ( ) {
528+ // if `targets` is unset, `other_targets` should be empty
529+ let metadata = Metadata :: default ( ) ;
530+ let BuildTargets {
531+ other_targets : others,
532+ ..
533+ } = metadata. targets ( false ) ;
534+ assert ! ( others. is_empty( ) , "{:?}" , others) ;
535+ }
518536}
519537
520538#[ cfg( test) ]
0 commit comments