mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2025-12-12 04:34:43 +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)) {
|
} else if((y + font_height) > canvas_height(canvas)) {
|
||||||
line = furi_string_alloc_printf("%.*s...\n", chars_fit, start);
|
line = furi_string_alloc_printf("%.*s...\n", chars_fit, start);
|
||||||
} else {
|
} 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));
|
canvas_draw_str_aligned(canvas, x, y, horizontal, vertical, furi_string_get_cstr(line));
|
||||||
furi_string_free(line);
|
furi_string_free(line);
|
||||||
|
|||||||
@@ -8,6 +8,9 @@ from fbt_extra.util import (
|
|||||||
link_elf_dir_as_latest,
|
link_elf_dir_as_latest,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
from fbt.sdk.cache import LazySdkVersionLoader
|
||||||
|
|
||||||
|
|
||||||
Import("ENV", "fw_build_meta")
|
Import("ENV", "fw_build_meta")
|
||||||
|
|
||||||
# Building initial C environment for libs
|
# Building initial C environment for libs
|
||||||
@@ -71,6 +74,8 @@ env = ENV.Clone(
|
|||||||
},
|
},
|
||||||
FW_API_TABLE=None,
|
FW_API_TABLE=None,
|
||||||
_APP_ICONS=None,
|
_APP_ICONS=None,
|
||||||
|
APPS=_.split(",") if (_ := GetOption("extra_int_apps")) else [],
|
||||||
|
EXTRA_EXT_APPS=_.split(",") if (_ := GetOption("extra_ext_apps")) else [],
|
||||||
)
|
)
|
||||||
|
|
||||||
env.PreConfigureFwEnvionment()
|
env.PreConfigureFwEnvionment()
|
||||||
@@ -125,9 +130,6 @@ if env["IS_BASE_FIRMWARE"]:
|
|||||||
else:
|
else:
|
||||||
fwenv.Append(APPS=["updater"])
|
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"]:
|
for app_dir, _ in fwenv["APPDIRS"]:
|
||||||
app_dir_node = env.Dir("#").Dir(app_dir)
|
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("."):
|
if isinstance(entry, FS.Dir) and not str(entry).startswith("."):
|
||||||
fwenv.LoadAppManifest(entry)
|
fwenv.LoadAppManifest(entry)
|
||||||
|
|
||||||
|
|
||||||
fwenv.PrepareApplicationsBuild()
|
fwenv.PrepareApplicationsBuild()
|
||||||
|
|
||||||
# Build external apps + configure SDK
|
# Build external apps + configure SDK
|
||||||
@@ -148,6 +149,11 @@ if env["IS_BASE_FIRMWARE"]:
|
|||||||
)
|
)
|
||||||
fw_artifacts.append(fwenv["FW_EXTAPPS"].sdk_tree)
|
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
|
# Add preprocessor definitions for current set of apps
|
||||||
fwenv.Append(
|
fwenv.Append(
|
||||||
|
|||||||
@@ -193,8 +193,19 @@ class AppManager:
|
|||||||
raise FlipperManifestException(f"Duplicate app declaration: {app.appid}")
|
raise FlipperManifestException(f"Duplicate app declaration: {app.appid}")
|
||||||
self.known_apps[app.appid] = app
|
self.known_apps[app.appid] = app
|
||||||
|
|
||||||
def filter_apps(self, applist: List[str], hw_target: str):
|
def filter_apps(
|
||||||
return AppBuildset(self, applist, hw_target)
|
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):
|
class AppBuilderException(Exception):
|
||||||
@@ -211,6 +222,12 @@ class AppBuildset:
|
|||||||
FlipperAppType.SETTINGS,
|
FlipperAppType.SETTINGS,
|
||||||
FlipperAppType.STARTUP,
|
FlipperAppType.STARTUP,
|
||||||
)
|
)
|
||||||
|
EXTERNAL_APP_TYPES = (
|
||||||
|
FlipperAppType.EXTERNAL,
|
||||||
|
FlipperAppType.MENUEXTERNAL,
|
||||||
|
FlipperAppType.PLUGIN,
|
||||||
|
FlipperAppType.DEBUG,
|
||||||
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def print_writer(message):
|
def print_writer(message):
|
||||||
@@ -219,16 +236,21 @@ class AppBuildset:
|
|||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
appmgr: AppManager,
|
appmgr: AppManager,
|
||||||
appnames: List[str],
|
|
||||||
hw_target: str,
|
hw_target: str,
|
||||||
|
appnames: List[str],
|
||||||
|
*,
|
||||||
|
extra_ext_appnames: List[str],
|
||||||
message_writer: Callable | None = None,
|
message_writer: Callable | None = None,
|
||||||
):
|
):
|
||||||
self.appmgr = appmgr
|
self.appmgr = appmgr
|
||||||
self.appnames = set(appnames)
|
self.appnames = set(appnames)
|
||||||
|
self.incompatible_extapps, self.extapps = [], []
|
||||||
|
self._extra_ext_appnames = extra_ext_appnames
|
||||||
self._orig_appnames = appnames
|
self._orig_appnames = appnames
|
||||||
self.hw_target = hw_target
|
self.hw_target = hw_target
|
||||||
self._writer = message_writer if message_writer else self.print_writer
|
self._writer = message_writer if message_writer else self.print_writer
|
||||||
self._process_deps()
|
self._process_deps()
|
||||||
|
self._process_ext_apps()
|
||||||
self._check_conflicts()
|
self._check_conflicts()
|
||||||
self._check_unsatisfied() # unneeded?
|
self._check_unsatisfied() # unneeded?
|
||||||
self._check_target_match()
|
self._check_target_match()
|
||||||
@@ -271,6 +293,27 @@ class AppBuildset:
|
|||||||
break
|
break
|
||||||
self.appnames.update(provided)
|
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):
|
def _check_conflicts(self):
|
||||||
conflicts = []
|
conflicts = []
|
||||||
for app in self.appnames:
|
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.headers, api.headers, False)
|
||||||
self.sync_sets(self.sdk.functions, api.functions)
|
self.sync_sets(self.sdk.functions, api.functions)
|
||||||
self.sync_sets(self.sdk.variables, api.variables)
|
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):
|
def PrepareApplicationsBuild(env):
|
||||||
try:
|
try:
|
||||||
appbuild = env["APPBUILD"] = env["APPMGR"].filter_apps(
|
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:
|
except Exception as e:
|
||||||
raise StopError(e)
|
raise StopError(e)
|
||||||
@@ -56,6 +58,11 @@ def DumpApplicationConfig(target, source, env):
|
|||||||
fg.green(f"{apptype.value}:\n\t"),
|
fg.green(f"{apptype.value}:\n\t"),
|
||||||
", ".join(app.appid for app in app_sublist),
|
", ".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):
|
def build_apps_c(target, source, env):
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ env = core_env.Clone(
|
|||||||
SINGLEQUOTEFUNC=single_quote,
|
SINGLEQUOTEFUNC=single_quote,
|
||||||
ABSPATHGETTERFUNC=resolve_real_dir_node,
|
ABSPATHGETTERFUNC=resolve_real_dir_node,
|
||||||
APPS=[],
|
APPS=[],
|
||||||
|
EXTRA_EXT_APPS=[],
|
||||||
UFBT_API_VERSION=SdkCache(
|
UFBT_API_VERSION=SdkCache(
|
||||||
core_env.subst("$SDK_DEFINITION"), load_version_only=True
|
core_env.subst("$SDK_DEFINITION"), load_version_only=True
|
||||||
).version,
|
).version,
|
||||||
|
|||||||
@@ -60,40 +60,12 @@ class FlipperExtAppBuildArtifacts:
|
|||||||
sdk_tree: NodeList = field(default_factory=NodeList)
|
sdk_tree: NodeList = field(default_factory=NodeList)
|
||||||
|
|
||||||
|
|
||||||
apps_to_build_as_faps = [
|
for app in appenv["APPBUILD"].get_ext_apps():
|
||||||
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
|
|
||||||
|
|
||||||
appenv.BuildAppElf(app)
|
appenv.BuildAppElf(app)
|
||||||
|
|
||||||
extapps = FlipperExtAppBuildArtifacts()
|
extapps = FlipperExtAppBuildArtifacts()
|
||||||
extapps.application_map = appenv["EXT_APPS"]
|
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"]:
|
if appenv["FORCE"]:
|
||||||
appenv.AlwaysBuild(
|
appenv.AlwaysBuild(
|
||||||
|
|||||||
Reference in New Issue
Block a user