 bbe68d6ffc
			
		
	
	
		bbe68d6ffc
		
			
		
	
	
	
	
		
			
			* fbt: reduced size of resources dependency graphs, resulting in faster build task evaluation * lib: flipper_app: fixed error message & error handling for plugins
		
			
				
	
	
		
			118 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import os
 | |
| import shutil
 | |
| 
 | |
| from SCons.Action import Action
 | |
| from SCons.Builder import Builder
 | |
| from SCons.Errors import StopError
 | |
| from SCons.Node.FS import Dir, File
 | |
| 
 | |
| 
 | |
| def __generate_resources_dist_entries(env):
 | |
|     src_target_entries = []
 | |
| 
 | |
|     resources_root = env.Dir(env["RESOURCES_ROOT"])
 | |
| 
 | |
|     for app_artifacts in env["FW_EXTAPPS"].application_map.values():
 | |
|         for _, dist_path in filter(
 | |
|             lambda dist_entry: dist_entry[0], app_artifacts.dist_entries
 | |
|         ):
 | |
|             src_target_entries.append(
 | |
|                 (
 | |
|                     app_artifacts.compact,
 | |
|                     resources_root.File(dist_path),
 | |
|                 )
 | |
|             )
 | |
| 
 | |
|     # Deploy apps' resources too
 | |
|     for app in env["APPBUILD"].apps:
 | |
|         if not app.resources:
 | |
|             continue
 | |
|         apps_resource_dir = app._appdir.Dir(app.resources)
 | |
|         for res_file in env.GlobRecursive("*", apps_resource_dir):
 | |
|             if not isinstance(res_file, File):
 | |
|                 continue
 | |
|             src_target_entries.append(
 | |
|                 (
 | |
|                     res_file,
 | |
|                     resources_root.File(
 | |
|                         res_file.get_path(apps_resource_dir),
 | |
|                     ),
 | |
|                 )
 | |
|             )
 | |
| 
 | |
|     # Deploy other stuff from _EXTRA_DIST
 | |
|     for extra_dist in env["_EXTRA_DIST"]:
 | |
|         if isinstance(extra_dist, Dir):
 | |
|             src_target_entries.append(
 | |
|                 (
 | |
|                     extra_dist,
 | |
|                     resources_root.Dir(extra_dist.name),
 | |
|                 )
 | |
|             )
 | |
|         else:
 | |
|             raise StopError(f"Unsupported extra dist type: {type(extra_dist)}")
 | |
| 
 | |
|     return src_target_entries
 | |
| 
 | |
| 
 | |
| def _resources_dist_emitter(target, source, env):
 | |
|     src_target_entries = __generate_resources_dist_entries(env)
 | |
|     source = list(map(lambda entry: entry[0], src_target_entries))
 | |
|     return (target, source)
 | |
| 
 | |
| 
 | |
| def _resources_dist_action(target, source, env):
 | |
|     dist_entries = __generate_resources_dist_entries(env)
 | |
|     assert len(dist_entries) == len(source)
 | |
|     shutil.rmtree(env.Dir(env["RESOURCES_ROOT"]).abspath, ignore_errors=True)
 | |
|     for src, target in dist_entries:
 | |
|         if isinstance(src, File):
 | |
|             os.makedirs(os.path.dirname(target.path), exist_ok=True)
 | |
|             shutil.copy(src.path, target.path)
 | |
|         elif isinstance(src, Dir):
 | |
|             shutil.copytree(src.path, target.path)
 | |
|         else:
 | |
|             raise StopError(f"Unsupported dist entry type: {type(src)}")
 | |
| 
 | |
| 
 | |
| def generate(env, **kw):
 | |
|     env.SetDefault(
 | |
|         ASSETS_COMPILER="${FBT_SCRIPT_DIR}/assets.py",
 | |
|     )
 | |
| 
 | |
|     if not env["VERBOSE"]:
 | |
|         env.SetDefault(
 | |
|             RESOURCEDISTCOMSTR="\tRESDIST\t${RESOURCES_ROOT}",
 | |
|             RESMANIFESTCOMSTR="\tMANIFST\t${TARGET}",
 | |
|         )
 | |
| 
 | |
|     env.Append(
 | |
|         BUILDERS={
 | |
|             "ManifestBuilder": Builder(
 | |
|                 action=[
 | |
|                     Action(
 | |
|                         _resources_dist_action,
 | |
|                         "${RESOURCEDISTCOMSTR}",
 | |
|                     ),
 | |
|                     Action(
 | |
|                         [
 | |
|                             [
 | |
|                                 "${PYTHON3}",
 | |
|                                 "${ASSETS_COMPILER}",
 | |
|                                 "manifest",
 | |
|                                 "${TARGET.dir.posix}",
 | |
|                                 "--timestamp=${GIT_UNIX_TIMESTAMP}",
 | |
|                             ]
 | |
|                         ],
 | |
|                         "${RESMANIFESTCOMSTR}",
 | |
|                     ),
 | |
|                 ],
 | |
|                 emitter=_resources_dist_emitter,
 | |
|             ),
 | |
|         }
 | |
|     )
 | |
| 
 | |
| 
 | |
| def exists(env):
 | |
|     return True
 |