@@ -219,6 +219,7 @@ def configure(self, node):
219219 def configure_dependencies (self , dependencies ):
220220
221221 self .__layout = {} # pylint: disable=attribute-defined-outside-init
222+ self .__digest_environment = {} # pylint: disable=attribute-defined-outside-init
222223
223224 # FIXME: Currently this forcefully validates configurations
224225 # for all BuildElement subclasses so they are unable to
@@ -227,9 +228,18 @@ def configure_dependencies(self, dependencies):
227228 for dep in dependencies :
228229 # Determine the location to stage each element, default is "/"
229230 location = "/"
231+
230232 if dep .config :
231- dep .config .validate_keys (["location" ])
232- location = dep .config .get_str ("location" )
233+ dep .config .validate_keys (["digest-environment" , "location" ])
234+
235+ location = dep .config .get_str ("location" , "/" )
236+
237+ digest_var_name = dep .config .get_str ("digest-environment" , None )
238+
239+ if digest_var_name is not None :
240+ element_list = self .__digest_environment .setdefault (digest_var_name , [])
241+ element_list .append ((dep .element , dep .path ))
242+
233243 try :
234244 element_list = self .__layout [location ]
235245 except KeyError :
@@ -268,6 +278,16 @@ def get_unique_key(self):
268278 }
269279 dictionary ["layout" ] = layout_key
270280
281+ # Specify the layout in the key, if buildstream is to generate an environment
282+ # variable with the digest
283+ #
284+ if self .__digest_environment :
285+ sorted_envs = sorted (self .__digest_environment )
286+ digest_key = {
287+ env : [dependency_path for _ , dependency_path in self .__digest_environment [env ]] for env in sorted_envs
288+ }
289+ dictionary ["digest-enviornment" ] = digest_key
290+
271291 return dictionary
272292
273293 def configure_sandbox (self , sandbox ):
@@ -286,7 +306,20 @@ def configure_sandbox(self, sandbox):
286306 sandbox .set_work_directory (command_dir )
287307
288308 # Setup environment
289- sandbox .set_environment (self .get_environment ())
309+ env = self .get_environment ()
310+
311+ # Add "CAS digest" environment variables
312+ sorted_envs = sorted (self .__digest_environment )
313+ for digest_variable in sorted_envs :
314+ element_list = [element for element , _ in self .__digest_environment [digest_variable ]]
315+ with self .timed_activity (
316+ f"Staging dependencies for '{ digest_variable } ' in subsandbox" , silent_nested = True
317+ ), self .subsandbox (sandbox ) as subsandbox :
318+ self .stage_dependency_artifacts (subsandbox , element_list )
319+ digest = subsandbox .get_virtual_directory ()._get_digest ()
320+ env [digest_variable ] = "{}/{}" .format (digest .hash , digest .size_bytes )
321+
322+ sandbox .set_environment (env )
290323
291324 def stage (self , sandbox ):
292325
0 commit comments