extapps.scons 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. from SCons.Errors import UserError
  2. Import("ENV")
  3. from fbt.appmanifest import FlipperAppType
  4. appenv = ENV.Clone(
  5. tools=[
  6. (
  7. "fbt_extapps",
  8. {
  9. "EXT_APPS_WORK_DIR": ENV.subst(
  10. "${BUILD_DIR}/.extapps",
  11. )
  12. },
  13. ),
  14. "fbt_assets",
  15. ]
  16. )
  17. appenv.Replace(
  18. LINKER_SCRIPT=appenv.subst("$APP_LINKER_SCRIPT"),
  19. )
  20. appenv.AppendUnique(
  21. CCFLAGS=[
  22. "-ggdb3",
  23. "-mword-relocations",
  24. "-mlong-calls",
  25. "-fno-common",
  26. "-nostdlib",
  27. "-fvisibility=hidden",
  28. ],
  29. LINKFLAGS=[
  30. "-Ur",
  31. "-Wl,-Ur",
  32. # "-Wl,--orphan-handling=error",
  33. "-Bsymbolic",
  34. "-nostartfiles",
  35. "-mlong-calls",
  36. "-fno-common",
  37. "-nostdlib",
  38. "-Wl,--gc-sections",
  39. "-Wl,--no-export-dynamic",
  40. "-fvisibility=hidden",
  41. "-Wl,-e${APP_ENTRY}",
  42. "-Xlinker",
  43. "-Map=${TARGET}.map",
  44. "-specs=nano.specs",
  45. "-specs=nosys.specs",
  46. ],
  47. LIBS=[
  48. "m",
  49. "gcc",
  50. "stdc++",
  51. "supc++",
  52. ],
  53. )
  54. extapps = appenv["_extapps"] = {
  55. "compact": {},
  56. "debug": {},
  57. "validators": {},
  58. "dist": {},
  59. "resources_dist": None,
  60. }
  61. def build_app_as_external(env, appdef):
  62. compact_elf, debug_elf, validator = env.BuildAppElf(appdef)
  63. extapps["compact"][appdef.appid] = compact_elf
  64. extapps["debug"][appdef.appid] = debug_elf
  65. extapps["validators"][appdef.appid] = validator
  66. extapps["dist"][appdef.appid] = (appdef.fap_category, compact_elf)
  67. apps_to_build_as_faps = [
  68. FlipperAppType.PLUGIN,
  69. FlipperAppType.EXTERNAL,
  70. ]
  71. if appenv["DEBUG_TOOLS"]:
  72. apps_to_build_as_faps.append(FlipperAppType.DEBUG)
  73. for apptype in apps_to_build_as_faps:
  74. for app in appenv["APPBUILD"].get_apps_of_type(apptype, True):
  75. build_app_as_external(appenv, app)
  76. # Ugly access to global option
  77. if extra_app_list := GetOption("extra_ext_apps"):
  78. for extra_app in extra_app_list.split(","):
  79. build_app_as_external(appenv, appenv["APPMGR"].get(extra_app))
  80. if appenv["FORCE"]:
  81. appenv.AlwaysBuild(extapps["compact"].values())
  82. # Deprecation stub
  83. def legacy_app_build_stub(**kw):
  84. raise UserError(f"Target name 'firmware_extapps' is deprecated, use 'faps' instead")
  85. appenv.PhonyTarget("firmware_extapps", appenv.Action(legacy_app_build_stub, None))
  86. Alias("faps", extapps["compact"].values())
  87. Alias("faps", extapps["validators"].values())
  88. extapps["resources_dist"] = appenv.FapDist(appenv.Dir("#/assets/resources/apps"), [])
  89. if appsrc := appenv.subst("$APPSRC"):
  90. app_manifest, fap_file, app_validator = appenv.GetExtAppFromPath(appsrc)
  91. appenv.PhonyTarget(
  92. "launch_app",
  93. '${PYTHON3} scripts/runfap.py ${SOURCE} --fap_dst_dir "/ext/apps/${FAP_CATEGORY}"',
  94. source=fap_file,
  95. FAP_CATEGORY=app_manifest.fap_category,
  96. )
  97. appenv.Alias("launch_app", app_validator)
  98. Return("extapps")