All components of Flipper Zero firmware — services, user applications, system settings — are developed independently. Each component has a build system manifest file, named application.fam, which defines basic properties of that component and its relations to other parts of the system.
When building firmware, fbt collects all application manifests and processes their dependencies. Then it builds only those components that are referenced in the current build configuration. See fbt docs for details on build configurations.
Properties of a firmware component are declared in a form of a Python code snippet, forming a call to App() function with various parameters.
Only 2 parameters are mandatory: appid and apptype, others are optional and may only be meaningful for certain application types.
appid: string, application id within the build system. Used for specifying which applications to include in build configuration and to resolve dependencies and conflicts.
apptype: member of FlipperAppType.* enumeration. Valid values are:
| Enum member | Firmware component type |
|---|---|
| SERVICE | System service, created at early startup |
| SYSTEM | Application not being shown in any menus. Can be started by other apps or from CLI |
| APP | Regular application for main menu |
| PLUGIN | Application to be built as a part of firmware an to be placed in Plugins menu |
| DEBUG | Application only visible in Debug menu with debug mode enabled |
| ARCHIVE | One and only Archive app |
| SETTINGS | Application to be placed in System settings menu |
| STARTUP | Callback function to run at system startup. Does not define a separate app |
| EXTERNAL | Application to be built as .fap plugin |
| METAPACKAGE | Does not define any code to be run, used for declaring dependencies and application bundles |
fbt will abort firmware build process.ps and free CLI commands to profile your app's memory usage.The following parameters are used only for FAPs:
["*.c*"] includes C and C++ source files. Application cannot use "lib" folder for their own source code, as it is reserved for fap_private_libs.ExtFile(path="file name", command="shell command") definitions. fbt will run the specified command for each file in the list.
Note that commands are executed at the firmware root folder's root, and all intermediate files must be placed in a application's temporary build folder. For that, you can use pattern expansion by fbt: ${FAP_WORK_DIR} will be replaced with the path to the application's temporary build folder, and ${FAP_SRC_DIR} will be replaced with the path to the application's source folder. You can also use other variables defined internally by fbt.Example for building an app from Rust sources:
sources=["target/thumbv7em-none-eabihf/release/libhello_rust.a"],
fap_extbuild=(
ExtFile(
path="${FAP_WORK_DIR}/target/thumbv7em-none-eabihf/release/libhello_rust.a",
command="cargo build --release --verbose --target thumbv7em-none-eabihf --target-dir ${FAP_WORK_DIR}/target --manifest-path ${FAP_SRC_DIR}/Cargo.toml",
),
),
fap_private_libs: list of additional libraries that are distributed as sources alongside the application. These libraries will be built as a part of the application build process.
Library sources must be placed in a subfolder of "lib" folder within the application's source folder.
Each library is defined as a call to Lib() function, accepting the following parameters:
["."] meaning library's source root.["*.c*"].[].[].[].Example for building an app with a private library:
fap_private_libs=[
Lib(
name="mbedtls",
fap_include_paths=["include"],
sources=[
"library/des.c",
"library/sha1.c",
"library/platform_util.c",
],
cdefines=["MBEDTLS_ERROR_C"],
),
Lib(
name="loclass",
cflags=["-Wno-error"],
),
],
For that snippet, fbt will build 2 libraries: one from sources in lib/mbedtls folder, and another from sources in lib/loclass folder. For mbedtls library, fbt will add lib/mbedtls/include to the list of include paths for the application and compile only the files specified in sources list. Additionally, fbt will enable MBEDTLS_ERROR_C preprocessor definition for mbedtls sources.
For loclass library, fbt will add lib/loclass to the list of include paths for the application and build all sources in that folder. Also fbt will disable treating compiler warnings as errors for loclass library specifically - that can be useful when compiling large 3rd-party codebases.
Both libraries will be linked into the application.
.fam file contains one or more Application definitions. For example, here's a part of applications/service/bt/application.fam:
App(
appid="bt_start",
apptype=FlipperAppType.STARTUP,
entry_point="bt_on_system_start",
order=70,
)
App(
appid="bt_settings",
name="Bluetooth",
apptype=FlipperAppType.SETTINGS,
entry_point="bt_settings_app",
stack_size=1 * 1024,
requires=[
"bt",
"gui",
],
order=10,
)
For more examples, see .fam files from various firmware parts.