mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2025-12-12 12:42:30 +04:00
Merge branch 'ofw_dev' into dev
This commit is contained in:
@@ -290,7 +290,8 @@ void elements_multiline_text_aligned(
|
||||
} else if((y + font_height) > canvas_height(canvas)) {
|
||||
line = furi_string_alloc_printf("%.*s...\n", chars_fit, start);
|
||||
} else {
|
||||
line = furi_string_alloc_printf("%.*s-\n", chars_fit, start);
|
||||
// Account for the added "-" in length
|
||||
line = furi_string_alloc_printf("%.*s-\n", chars_fit - 1, start);
|
||||
}
|
||||
canvas_draw_str_aligned(canvas, x, y, horizontal, vertical, furi_string_get_cstr(line));
|
||||
furi_string_free(line);
|
||||
|
||||
@@ -8,6 +8,9 @@ from fbt_extra.util import (
|
||||
link_elf_dir_as_latest,
|
||||
)
|
||||
|
||||
from fbt.sdk.cache import LazySdkVersionLoader
|
||||
|
||||
|
||||
Import("ENV", "fw_build_meta")
|
||||
|
||||
# Building initial C environment for libs
|
||||
@@ -71,6 +74,8 @@ env = ENV.Clone(
|
||||
},
|
||||
FW_API_TABLE=None,
|
||||
_APP_ICONS=None,
|
||||
APPS=_.split(",") if (_ := GetOption("extra_int_apps")) else [],
|
||||
EXTRA_EXT_APPS=_.split(",") if (_ := GetOption("extra_ext_apps")) else [],
|
||||
)
|
||||
|
||||
env.PreConfigureFwEnvionment()
|
||||
@@ -125,9 +130,6 @@ if env["IS_BASE_FIRMWARE"]:
|
||||
else:
|
||||
fwenv.Append(APPS=["updater"])
|
||||
|
||||
if extra_int_apps := GetOption("extra_int_apps"):
|
||||
fwenv.Append(APPS=extra_int_apps.split(","))
|
||||
|
||||
|
||||
for app_dir, _ in fwenv["APPDIRS"]:
|
||||
app_dir_node = env.Dir("#").Dir(app_dir)
|
||||
@@ -136,7 +138,6 @@ for app_dir, _ in fwenv["APPDIRS"]:
|
||||
if isinstance(entry, FS.Dir) and not str(entry).startswith("."):
|
||||
fwenv.LoadAppManifest(entry)
|
||||
|
||||
|
||||
fwenv.PrepareApplicationsBuild()
|
||||
|
||||
# Build external apps + configure SDK
|
||||
@@ -148,6 +149,11 @@ if env["IS_BASE_FIRMWARE"]:
|
||||
)
|
||||
fw_artifacts.append(fwenv["FW_EXTAPPS"].sdk_tree)
|
||||
|
||||
fwenv.Append(FBT_API_VERSION=LazySdkVersionLoader(fwenv.subst("$SDK_DEFINITION")))
|
||||
fwenv.PhonyTarget(
|
||||
"get_apiversion",
|
||||
"@echo $( ${FBT_API_VERSION} $)",
|
||||
)
|
||||
|
||||
# Add preprocessor definitions for current set of apps
|
||||
fwenv.Append(
|
||||
|
||||
@@ -193,8 +193,19 @@ class AppManager:
|
||||
raise FlipperManifestException(f"Duplicate app declaration: {app.appid}")
|
||||
self.known_apps[app.appid] = app
|
||||
|
||||
def filter_apps(self, applist: List[str], hw_target: str):
|
||||
return AppBuildset(self, applist, hw_target)
|
||||
def filter_apps(
|
||||
self,
|
||||
*,
|
||||
applist: List[str],
|
||||
ext_applist: List[str],
|
||||
hw_target: str,
|
||||
):
|
||||
return AppBuildset(
|
||||
self,
|
||||
hw_target=hw_target,
|
||||
appnames=applist,
|
||||
extra_ext_appnames=ext_applist,
|
||||
)
|
||||
|
||||
|
||||
class AppBuilderException(Exception):
|
||||
@@ -211,6 +222,12 @@ class AppBuildset:
|
||||
FlipperAppType.SETTINGS,
|
||||
FlipperAppType.STARTUP,
|
||||
)
|
||||
EXTERNAL_APP_TYPES = (
|
||||
FlipperAppType.EXTERNAL,
|
||||
FlipperAppType.MENUEXTERNAL,
|
||||
FlipperAppType.PLUGIN,
|
||||
FlipperAppType.DEBUG,
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def print_writer(message):
|
||||
@@ -219,16 +236,21 @@ class AppBuildset:
|
||||
def __init__(
|
||||
self,
|
||||
appmgr: AppManager,
|
||||
appnames: List[str],
|
||||
hw_target: str,
|
||||
appnames: List[str],
|
||||
*,
|
||||
extra_ext_appnames: List[str],
|
||||
message_writer: Callable | None = None,
|
||||
):
|
||||
self.appmgr = appmgr
|
||||
self.appnames = set(appnames)
|
||||
self.incompatible_extapps, self.extapps = [], []
|
||||
self._extra_ext_appnames = extra_ext_appnames
|
||||
self._orig_appnames = appnames
|
||||
self.hw_target = hw_target
|
||||
self._writer = message_writer if message_writer else self.print_writer
|
||||
self._process_deps()
|
||||
self._process_ext_apps()
|
||||
self._check_conflicts()
|
||||
self._check_unsatisfied() # unneeded?
|
||||
self._check_target_match()
|
||||
@@ -271,6 +293,27 @@ class AppBuildset:
|
||||
break
|
||||
self.appnames.update(provided)
|
||||
|
||||
def _process_ext_apps(self):
|
||||
extapps = [
|
||||
app
|
||||
for apptype in self.EXTERNAL_APP_TYPES
|
||||
for app in self.get_apps_of_type(apptype, True)
|
||||
]
|
||||
extapps.extend(map(self.appmgr.get, self._extra_ext_appnames))
|
||||
|
||||
for app in extapps:
|
||||
(
|
||||
self.extapps
|
||||
if app.supports_hardware_target(self.hw_target)
|
||||
else self.incompatible_extapps
|
||||
).append(app)
|
||||
|
||||
def get_ext_apps(self):
|
||||
return self.extapps
|
||||
|
||||
def get_incompatible_ext_apps(self):
|
||||
return self.incompatible_extapps
|
||||
|
||||
def _check_conflicts(self):
|
||||
conflicts = []
|
||||
for app in self.appnames:
|
||||
|
||||
@@ -255,3 +255,18 @@ class SdkCache:
|
||||
self.sync_sets(self.sdk.headers, api.headers, False)
|
||||
self.sync_sets(self.sdk.functions, api.functions)
|
||||
self.sync_sets(self.sdk.variables, api.variables)
|
||||
|
||||
|
||||
class LazySdkVersionLoader:
|
||||
def __init__(self, sdk_path: str):
|
||||
self.sdk_path = sdk_path
|
||||
self._version = None
|
||||
|
||||
@property
|
||||
def version(self) -> SdkVersion:
|
||||
if self._version is None:
|
||||
self._version = SdkCache(self.sdk_path, load_version_only=True).version
|
||||
return self._version
|
||||
|
||||
def __str__(self) -> str:
|
||||
return str(self.version)
|
||||
|
||||
@@ -36,7 +36,9 @@ def LoadAppManifest(env, entry):
|
||||
def PrepareApplicationsBuild(env):
|
||||
try:
|
||||
appbuild = env["APPBUILD"] = env["APPMGR"].filter_apps(
|
||||
env["APPS"], env.subst("f${TARGET_HW}")
|
||||
applist=env["APPS"],
|
||||
ext_applist=env["EXTRA_EXT_APPS"],
|
||||
hw_target=env.subst("f${TARGET_HW}"),
|
||||
)
|
||||
except Exception as e:
|
||||
raise StopError(e)
|
||||
@@ -56,6 +58,11 @@ def DumpApplicationConfig(target, source, env):
|
||||
fg.green(f"{apptype.value}:\n\t"),
|
||||
", ".join(app.appid for app in app_sublist),
|
||||
)
|
||||
if incompatible_ext_apps := env["APPBUILD"].get_incompatible_ext_apps():
|
||||
print(
|
||||
fg.blue("Incompatible apps (skipped):\n\t"),
|
||||
", ".join(app.appid for app in incompatible_ext_apps),
|
||||
)
|
||||
|
||||
|
||||
def build_apps_c(target, source, env):
|
||||
|
||||
@@ -107,6 +107,7 @@ env = core_env.Clone(
|
||||
SINGLEQUOTEFUNC=single_quote,
|
||||
ABSPATHGETTERFUNC=resolve_real_dir_node,
|
||||
APPS=[],
|
||||
EXTRA_EXT_APPS=[],
|
||||
UFBT_API_VERSION=SdkCache(
|
||||
core_env.subst("$SDK_DEFINITION"), load_version_only=True
|
||||
).version,
|
||||
|
||||
@@ -60,40 +60,12 @@ class FlipperExtAppBuildArtifacts:
|
||||
sdk_tree: NodeList = field(default_factory=NodeList)
|
||||
|
||||
|
||||
apps_to_build_as_faps = [
|
||||
FlipperAppType.PLUGIN,
|
||||
FlipperAppType.EXTERNAL,
|
||||
FlipperAppType.MENUEXTERNAL,
|
||||
FlipperAppType.DEBUG,
|
||||
]
|
||||
|
||||
known_extapps = [
|
||||
app
|
||||
for apptype in apps_to_build_as_faps
|
||||
for app in appenv["APPBUILD"].get_apps_of_type(apptype, True)
|
||||
]
|
||||
|
||||
# Ugly access to global option
|
||||
if extra_app_list := GetOption("extra_ext_apps"):
|
||||
known_extapps.extend(map(appenv["APPMGR"].get, extra_app_list.split(",")))
|
||||
|
||||
incompatible_apps = []
|
||||
for app in known_extapps:
|
||||
if not app.supports_hardware_target(appenv.subst("f${TARGET_HW}")):
|
||||
incompatible_apps.append(app)
|
||||
continue
|
||||
|
||||
for app in appenv["APPBUILD"].get_ext_apps():
|
||||
appenv.BuildAppElf(app)
|
||||
|
||||
extapps = FlipperExtAppBuildArtifacts()
|
||||
extapps.application_map = appenv["EXT_APPS"]
|
||||
|
||||
if incompatible_apps:
|
||||
warn(
|
||||
WarningOnByDefault,
|
||||
f"Skipping build of {len(incompatible_apps)} incompatible app(s): "
|
||||
+ ", ".join(f"'{app.name}' (id '{app.appid}')" for app in incompatible_apps),
|
||||
)
|
||||
|
||||
if appenv["FORCE"]:
|
||||
appenv.AlwaysBuild(
|
||||
|
||||
Reference in New Issue
Block a user