fbt_apps.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from SCons.Builder import Builder
  2. from SCons.Action import Action
  3. import SCons
  4. from fbt.appmanifest import FlipperAppType, AppManager, ApplicationsCGenerator
  5. # Adding objects for application management to env
  6. # AppManager env["APPMGR"] - loads all manifests; manages list of known apps
  7. # AppBuildset env["APPBUILD"] - contains subset of apps, filtered for current config
  8. def LoadApplicationManifests(env):
  9. appmgr = env["APPMGR"] = AppManager()
  10. for entry in env.Glob("#/applications/*"):
  11. if isinstance(entry, SCons.Node.FS.Dir) and not str(entry).startswith("."):
  12. appmgr.load_manifest(entry.File("application.fam").abspath, entry.name)
  13. def PrepareApplicationsBuild(env):
  14. env["APPBUILD"] = env["APPMGR"].filter_apps(env["APPS"])
  15. env["APPBUILD_DUMP"] = env.Action(
  16. DumpApplicationConfig,
  17. "\tINFO\t",
  18. )
  19. def DumpApplicationConfig(target, source, env):
  20. print(f"Loaded {len(env['APPMGR'].known_apps)} app definitions.")
  21. print("Firmware modules configuration:")
  22. for apptype in FlipperAppType:
  23. app_sublist = env["APPBUILD"].get_apps_of_type(apptype)
  24. if app_sublist:
  25. print(
  26. f"{apptype.value}:\n\t",
  27. ", ".join(app.appid for app in app_sublist),
  28. )
  29. def build_apps_c(target, source, env):
  30. target_file_name = target[0].path
  31. gen = ApplicationsCGenerator(env["APPBUILD"])
  32. with open(target_file_name, "w") as file:
  33. file.write(gen.generate())
  34. def generate(env):
  35. env.AddMethod(LoadApplicationManifests)
  36. env.AddMethod(PrepareApplicationsBuild)
  37. env.Append(
  38. BUILDERS={
  39. "ApplicationsC": Builder(
  40. action=Action(
  41. build_apps_c,
  42. "${APPSCOMSTR}",
  43. ),
  44. ),
  45. }
  46. )
  47. def exists(env):
  48. return True