From 3d02063bce0c93dda960935a4df11f605aca246e Mon Sep 17 00:00:00 2001 From: Anna Antonenko Date: Mon, 7 Apr 2025 16:45:09 +0400 Subject: [PATCH] fbt: Deterministic STARTUP order & additional checks (#4179) * unit_tests: clear startup order * fam: ensure unique STARTUP order * fbt: warn on same .order values within a group leading to non-determinitic builds * fbt: better formatting for app order warning --------- Co-authored-by: hedger --- applications/debug/unit_tests/application.fam | 3 ++- applications/main/archive/application.fam | 2 +- applications/services/bt/application.fam | 2 +- applications/services/cli/application.fam | 2 +- applications/services/crypto/application.fam | 2 +- applications/services/expansion/application.fam | 2 +- applications/services/loader/application.fam | 2 +- applications/services/locale/application.fam | 2 +- applications/services/power/application.fam | 2 +- applications/services/region/application.fam | 2 +- applications/services/storage/application.fam | 2 +- applications/system/js_app/application.fam | 4 ++-- applications/system/updater/application.fam | 4 ++-- scripts/fbt_tools/fbt_apps.py | 13 ++++++++++++- 14 files changed, 28 insertions(+), 16 deletions(-) diff --git a/applications/debug/unit_tests/application.fam b/applications/debug/unit_tests/application.fam index ed5f8c9da..72b8cafcb 100644 --- a/applications/debug/unit_tests/application.fam +++ b/applications/debug/unit_tests/application.fam @@ -7,6 +7,7 @@ App( requires=["system_settings", "cli_subghz"], provides=["delay_test"], resources="resources", + order=30, ) App( @@ -17,7 +18,7 @@ App( entry_point="delay_test_app", stack_size=1 * 1024, requires=["unit_tests"], - order=110, + order=30, ) App( diff --git a/applications/main/archive/application.fam b/applications/main/archive/application.fam index f0a980ab0..00075107a 100644 --- a/applications/main/archive/application.fam +++ b/applications/main/archive/application.fam @@ -7,5 +7,5 @@ App( requires=["gui"], stack_size=4 * 1024, icon="A_FileManager_14", - order=0, + order=10, ) diff --git a/applications/services/bt/application.fam b/applications/services/bt/application.fam index 2d2840e3a..0e4cc918f 100644 --- a/applications/services/bt/application.fam +++ b/applications/services/bt/application.fam @@ -21,5 +21,5 @@ App( appid="bt_start", apptype=FlipperAppType.STARTUP, entry_point="bt_on_system_start", - order=70, + order=40, ) diff --git a/applications/services/cli/application.fam b/applications/services/cli/application.fam index e1e79f43d..6e0a28164 100644 --- a/applications/services/cli/application.fam +++ b/applications/services/cli/application.fam @@ -21,7 +21,7 @@ App( apptype=FlipperAppType.SERVICE, entry_point="cli_vcp_srv", stack_size=1024, - order=40, + order=10, sdk_headers=["cli_vcp.h"], sources=["cli_vcp.c"], ) diff --git a/applications/services/crypto/application.fam b/applications/services/crypto/application.fam index 7771c5ed2..1d07ca409 100644 --- a/applications/services/crypto/application.fam +++ b/applications/services/crypto/application.fam @@ -2,5 +2,5 @@ App( appid="crypto_start", apptype=FlipperAppType.STARTUP, entry_point="crypto_on_system_start", - order=10, + order=20, ) diff --git a/applications/services/expansion/application.fam b/applications/services/expansion/application.fam index dbdde0a52..f85450e40 100644 --- a/applications/services/expansion/application.fam +++ b/applications/services/expansion/application.fam @@ -8,5 +8,5 @@ App( ], requires=["rpc_start"], provides=["expansion_settings"], - order=150, + order=100, ) diff --git a/applications/services/loader/application.fam b/applications/services/loader/application.fam index f4d006e07..5600bdf62 100644 --- a/applications/services/loader/application.fam +++ b/applications/services/loader/application.fam @@ -19,5 +19,5 @@ App( apptype=FlipperAppType.STARTUP, entry_point="loader_on_system_start", requires=["loader"], - order=90, + order=80, ) diff --git a/applications/services/locale/application.fam b/applications/services/locale/application.fam index c762d02d6..09f49161f 100644 --- a/applications/services/locale/application.fam +++ b/applications/services/locale/application.fam @@ -4,6 +4,6 @@ App( apptype=FlipperAppType.STARTUP, entry_point="locale_on_system_start", cdefines=["SRV_LOCALE"], - order=90, + order=70, sdk_headers=["locale.h"], ) diff --git a/applications/services/power/application.fam b/applications/services/power/application.fam index f14d88c54..0e69ec6ec 100644 --- a/applications/services/power/application.fam +++ b/applications/services/power/application.fam @@ -22,5 +22,5 @@ App( apptype=FlipperAppType.STARTUP, entry_point="power_on_system_start", requires=["power"], - order=80, + order=50, ) diff --git a/applications/services/region/application.fam b/applications/services/region/application.fam index a4cdc94ea..9b2451213 100644 --- a/applications/services/region/application.fam +++ b/applications/services/region/application.fam @@ -6,5 +6,5 @@ App( entry_point="region_on_system_start", cdefines=["SRV_REGION"], requires=["storage"], - order=170, + order=120, ) diff --git a/applications/services/storage/application.fam b/applications/services/storage/application.fam index 7aa721cc3..047500fa3 100644 --- a/applications/services/storage/application.fam +++ b/applications/services/storage/application.fam @@ -16,5 +16,5 @@ App( apptype=FlipperAppType.STARTUP, entry_point="storage_on_system_start", requires=["storage"], - order=90, + order=60, ) diff --git a/applications/system/js_app/application.fam b/applications/system/js_app/application.fam index 66ec221ec..843ab5543 100644 --- a/applications/system/js_app/application.fam +++ b/applications/system/js_app/application.fam @@ -5,7 +5,7 @@ App( entry_point="js_app", stack_size=2 * 1024, resources="examples", - order=0, + order=10, provides=["js_app_start"], sources=[ "js_app.c", @@ -23,7 +23,7 @@ App( appid="js_app_start", apptype=FlipperAppType.STARTUP, entry_point="js_app_on_system_start", - order=160, + order=110, sources=["js_app.c"], ) diff --git a/applications/system/updater/application.fam b/applications/system/updater/application.fam index a693fa6f5..0c56a06ef 100644 --- a/applications/system/updater/application.fam +++ b/applications/system/updater/application.fam @@ -27,7 +27,7 @@ App( provides=["updater_start"], entry_point="updater_srv", stack_size=2 * 1024, - order=10, + order=20, ) App( @@ -35,5 +35,5 @@ App( apptype=FlipperAppType.STARTUP, entry_point="updater_on_system_start", requires=["updater_app"], - order=110, + order=90, ) diff --git a/scripts/fbt_tools/fbt_apps.py b/scripts/fbt_tools/fbt_apps.py index 3a17a79a3..c48e4ba80 100644 --- a/scripts/fbt_tools/fbt_apps.py +++ b/scripts/fbt_tools/fbt_apps.py @@ -150,11 +150,22 @@ def DumpApplicationConfig(target, source, env): print(fg.boldgreen("Firmware modules configuration:")) for apptype in FlipperAppType: app_sublist = env["APPBUILD"].get_apps_of_type(apptype) - if app_sublist: + # Print a warning if any apps in the list have same .order value + unique_order_values = set(app.order for app in app_sublist) + if len(app_sublist) != len(unique_order_values) and max(unique_order_values): + print( + fg.red(f"{apptype.value}: ") + + fg.yellow( + "Duplicate .order values in group:\n\t" + + ", ".join(f"{app.appid} ({app.order})" for app in app_sublist) + ) + ) + elif app_sublist: print( 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"),