extapps.scons 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. Import("ENV")
  2. from fbt.appmanifest import FlipperAppType
  3. appenv = ENV.Clone(
  4. tools=[("fbt_extapps", {"EXT_APPS_WORK_DIR": ENV.subst("${BUILD_DIR}/.extapps")})]
  5. )
  6. appenv.Replace(
  7. LINKER_SCRIPT="application-ext",
  8. )
  9. appenv.AppendUnique(
  10. CCFLAGS=[
  11. "-ggdb3",
  12. "-mword-relocations",
  13. "-mlong-calls",
  14. "-fno-common",
  15. "-nostdlib",
  16. "-fvisibility=hidden",
  17. ],
  18. LINKFLAGS=[
  19. "-Ur",
  20. "-Wl,-Ur",
  21. # "-Wl,--orphan-handling=error",
  22. "-Bsymbolic",
  23. "-nostartfiles",
  24. "-mlong-calls",
  25. "-fno-common",
  26. "-nostdlib",
  27. "-Wl,--gc-sections",
  28. "-Wl,--no-export-dynamic",
  29. "-fvisibility=hidden",
  30. "-Wl,-e${APP_ENTRY}",
  31. "-Xlinker",
  32. "-Map=${TARGET}.map",
  33. "-specs=nano.specs",
  34. "-specs=nosys.specs",
  35. ],
  36. LIBS=[
  37. "m",
  38. "gcc",
  39. "stdc++",
  40. "supc++",
  41. ],
  42. )
  43. extapps = appenv["_extapps"] = {
  44. "compact": {},
  45. "debug": {},
  46. "validators": {},
  47. "dist": {},
  48. }
  49. def build_app_as_external(env, appdef):
  50. compact_elf, debug_elf, validator = env.BuildAppElf(appdef)
  51. extapps["compact"][appdef.appid] = compact_elf
  52. extapps["debug"][appdef.appid] = debug_elf
  53. extapps["validators"][appdef.appid] = validator
  54. extapps["dist"][appdef.appid] = (appdef.fap_category, compact_elf)
  55. apps_to_build_as_faps = [FlipperAppType.PLUGIN, FlipperAppType.EXTERNAL]
  56. if appenv["DEBUG_TOOLS"]:
  57. apps_to_build_as_faps.append(FlipperAppType.DEBUG)
  58. for apptype in apps_to_build_as_faps:
  59. for app in appenv["APPBUILD"].get_apps_of_type(apptype, True):
  60. build_app_as_external(appenv, app)
  61. # Ugly access to global option
  62. if extra_app_list := GetOption("extra_ext_apps"):
  63. for extra_app in extra_app_list.split(","):
  64. build_app_as_external(appenv, appenv["APPMGR"].get(extra_app))
  65. if appenv["FORCE"]:
  66. appenv.AlwaysBuild(extapps["compact"].values())
  67. Alias(appenv["FIRMWARE_BUILD_CFG"] + "_extapps", extapps["compact"].values())
  68. if appsrc := appenv.subst("$APPSRC"):
  69. app_manifest, fap_file = appenv.GetExtAppFromPath(appsrc)
  70. appenv.PhonyTarget(
  71. "launch_app",
  72. '${PYTHON3} scripts/runfap.py ${SOURCE} --fap_dst_dir "/ext/apps/${FAP_CATEGORY}"',
  73. source=fap_file,
  74. FAP_CATEGORY=app_manifest.fap_category,
  75. )
  76. Return("extapps")