@@ -237,13 +237,9 @@ impl<'cfg> Workspace<'cfg> {
237237 }
238238
239239 pub fn profiles ( & self ) -> & Profiles {
240- let root = self
241- . root_manifest
242- . as_ref ( )
243- . unwrap_or ( & self . current_manifest ) ;
244- match * self . packages . get ( root) {
245- MaybePackage :: Package ( ref p) => p. manifest ( ) . profiles ( ) ,
246- MaybePackage :: Virtual ( ref vm) => vm. profiles ( ) ,
240+ match self . root_maybe ( ) {
241+ MaybePackage :: Package ( p) => p. manifest ( ) . profiles ( ) ,
242+ MaybePackage :: Virtual ( vm) => vm. profiles ( ) ,
247243 }
248244 }
249245
@@ -260,6 +256,15 @@ impl<'cfg> Workspace<'cfg> {
260256 . unwrap ( )
261257 }
262258
259+ /// Returns the root Package or VirtualManifest.
260+ fn root_maybe ( & self ) -> & MaybePackage {
261+ let root = self
262+ . root_manifest
263+ . as_ref ( )
264+ . unwrap_or ( & self . current_manifest ) ;
265+ self . packages . get ( root)
266+ }
267+
263268 pub fn target_dir ( & self ) -> Filesystem {
264269 self . target_dir
265270 . clone ( )
@@ -270,27 +275,19 @@ impl<'cfg> Workspace<'cfg> {
270275 ///
271276 /// This may be from a virtual crate or an actual crate.
272277 pub fn root_replace ( & self ) -> & [ ( PackageIdSpec , Dependency ) ] {
273- let path = match self . root_manifest {
274- Some ( ref p) => p,
275- None => & self . current_manifest ,
276- } ;
277- match * self . packages . get ( path) {
278- MaybePackage :: Package ( ref p) => p. manifest ( ) . replace ( ) ,
279- MaybePackage :: Virtual ( ref vm) => vm. replace ( ) ,
278+ match self . root_maybe ( ) {
279+ MaybePackage :: Package ( p) => p. manifest ( ) . replace ( ) ,
280+ MaybePackage :: Virtual ( vm) => vm. replace ( ) ,
280281 }
281282 }
282283
283284 /// Returns the root [patch] section of this workspace.
284285 ///
285286 /// This may be from a virtual crate or an actual crate.
286287 pub fn root_patch ( & self ) -> & HashMap < Url , Vec < Dependency > > {
287- let path = match self . root_manifest {
288- Some ( ref p) => p,
289- None => & self . current_manifest ,
290- } ;
291- match * self . packages . get ( path) {
292- MaybePackage :: Package ( ref p) => p. manifest ( ) . patch ( ) ,
293- MaybePackage :: Virtual ( ref vm) => vm. patch ( ) ,
288+ match self . root_maybe ( ) {
289+ MaybePackage :: Package ( p) => p. manifest ( ) . patch ( ) ,
290+ MaybePackage :: Virtual ( vm) => vm. patch ( ) ,
294291 }
295292 }
296293
@@ -524,6 +521,18 @@ impl<'cfg> Workspace<'cfg> {
524521 /// 2. All workspace members agree on this one root as the root.
525522 /// 3. The current crate is a member of this workspace.
526523 fn validate ( & mut self ) -> CargoResult < ( ) > {
524+ // Validate config profiles only once per workspace.
525+ let features = match self . root_maybe ( ) {
526+ MaybePackage :: Package ( p) => p. manifest ( ) . features ( ) ,
527+ MaybePackage :: Virtual ( vm) => vm. features ( ) ,
528+ } ;
529+ let mut warnings = Vec :: new ( ) ;
530+ self . config . profiles ( ) ?. validate ( features, & mut warnings) ?;
531+ for warning in warnings {
532+ self . config . shell ( ) . warn ( & warning) ?;
533+ }
534+
535+ // The rest of the checks require a VirtualManifest or multiple members.
527536 if self . root_manifest . is_none ( ) {
528537 return Ok ( ( ) ) ;
529538 }
0 commit comments