extapps.scons 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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="application_ext",
  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. }
  60. def build_app_as_external(env, appdef):
  61. compact_elf, debug_elf, validator = env.BuildAppElf(appdef)
  62. extapps["compact"][appdef.appid] = compact_elf
  63. extapps["debug"][appdef.appid] = debug_elf
  64. extapps["validators"][appdef.appid] = validator
  65. extapps["dist"][appdef.appid] = (appdef.fap_category, compact_elf)
  66. apps_to_build_as_faps = [
  67. FlipperAppType.PLUGIN,
  68. FlipperAppType.EXTERNAL,
  69. ]
  70. if appenv["DEBUG_TOOLS"]:
  71. apps_to_build_as_faps.append(FlipperAppType.DEBUG)
  72. for apptype in apps_to_build_as_faps:
  73. for app in appenv["APPBUILD"].get_apps_of_type(apptype, True):
  74. build_app_as_external(appenv, app)
  75. # Ugly access to global option
  76. if extra_app_list := GetOption("extra_ext_apps"):
  77. for extra_app in extra_app_list.split(","):
  78. build_app_as_external(appenv, appenv["APPMGR"].get(extra_app))
  79. if appenv["FORCE"]:
  80. appenv.AlwaysBuild(extapps["compact"].values())
  81. # Deprecation stub
  82. def legacy_app_build_stub(**kw):
  83. raise UserError(f"Target name 'firmware_extapps' is deprecated, use 'faps' instead")
  84. appenv.PhonyTarget("firmware_extapps", appenv.Action(legacy_app_build_stub, None))
  85. Alias("faps", extapps["compact"].values())
  86. Alias("faps", extapps["validators"].values())
  87. if appsrc := appenv.subst("$APPSRC"):
  88. app_manifest, fap_file, app_validator = appenv.GetExtAppFromPath(appsrc)
  89. appenv.PhonyTarget(
  90. "launch_app",
  91. '${PYTHON3} scripts/runfap.py ${SOURCE} --fap_dst_dir "/ext/apps/${FAP_CATEGORY}"',
  92. source=fap_file,
  93. FAP_CATEGORY=app_manifest.fap_category,
  94. )
  95. appenv.Alias("launch_app", app_validator)
  96. Return("extapps")