@@ -2220,16 +2220,6 @@ def coDet(r):
22202220 if self .__jobServer is None :
22212221 self .__jobServer = False
22222222
2223- # check provided dependencies
2224- availDeps = [ d .recipe for d in self .__deps ]
2225- providedDeps = set ()
2226- for pattern in self .__provideDeps :
2227- l = set (d for d in availDeps if fnmatch .fnmatchcase (d , pattern ))
2228- if not l :
2229- raise ParseError ("Unknown dependency '{}' in provideDeps" .format (pattern ))
2230- providedDeps |= l
2231- self .__provideDeps = providedDeps
2232-
22332223 # Evaluate root property
22342224 if isinstance (self .__root , str ) or isinstance (self .__root , IfExpression ):
22352225 self .__root = rootEnv .evaluate (self .__root , "root" )
@@ -2346,6 +2336,7 @@ def prepare(self, inputEnv, sandboxEnabled, inputStates, inputSandbox=None,
23462336 directPackages = []
23472337 indirectPackages = []
23482338 provideDeps = UniquePackageList (stack , self .__raiseIncompatibleProvided )
2339+ maybeProvideDeps = {}
23492340 checkoutDeps = []
23502341 results = []
23512342 depEnv = env .derive ()
@@ -2355,11 +2346,16 @@ def prepare(self, inputEnv, sandboxEnabled, inputStates, inputSandbox=None,
23552346 depDiffSandbox = diffSandbox
23562347 depDiffTools = diffTools .copy ()
23572348 thisDeps = {}
2349+ resolvedDeps = []
23582350
2359- for dep in self .__deps :
2351+ for d in self .__deps :
2352+ dep = copy .deepcopy (d )
23602353 env .setFunArgs ({ "recipe" : self , "sandbox" : bool (sandbox ) and sandboxEnabled ,
23612354 "__tools" : tools })
23622355
2356+ dep .recipe = env .substitute (dep .recipe , "dependency::" + dep .recipe )
2357+ resolvedDeps .append (dep .recipe )
2358+
23632359 if dep .condition and not all (env .evaluate (cond , "dependency " + dep .recipe )
23642360 for cond in dep .condition ): continue
23652361
@@ -2449,10 +2445,24 @@ def prepare(self, inputEnv, sandboxEnabled, inputStates, inputSandbox=None,
24492445 if sandboxEnabled :
24502446 env .update (sandbox .environment )
24512447 if dep .provideGlobal : depEnv .update (sandbox .environment )
2452- if dep .recipe in self .__provideDeps :
2453- provideDeps .append (depRef )
2454- provideDeps .extend (CoreRef (d , [p .getName ()], origDepDiffTools , origDepDiffSandbox )
2455- for d in depCoreStep .providedDeps )
2448+
2449+ l = [depRef ]
2450+ l .append ([CoreRef (d , [p .getName ()], origDepDiffTools , origDepDiffSandbox )
2451+ for d in depCoreStep .providedDeps ])
2452+ maybeProvideDeps [dep .recipe ] = l
2453+
2454+ # check provided dependencies
2455+ providedDeps = set ()
2456+ for pattern in self .__provideDeps :
2457+ pattern = env .substitute (pattern , "providedDep::" + pattern )
2458+ l = set (d for d in resolvedDeps if fnmatch .fnmatchcase (d , pattern ))
2459+ if not l :
2460+ raise ParseError ("Unknown dependency '{}' in provideDeps" .format (pattern ))
2461+ providedDeps |= l
2462+
2463+ for recipe in providedDeps :
2464+ provideDeps .append (maybeProvideDeps [recipe ][0 ])
2465+ provideDeps .extend (maybeProvideDeps [recipe ][1 ])
24562466
24572467 # Filter indirect packages and add to result list if necessary. Most
24582468 # likely there are many duplicates that are dropped.
0 commit comments