All components of Flipper Zero firmware — services, user applications, and system settings — are developed independently. Each component has a build system manifest file, named application.fam, which defines the 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 referenced in the current build configuration. See fbt docs for details on build configurations.
A firmware component's properties are declared in 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 to specify which applications to include in the build configuration and 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 is not being shown in any menus. It can be started by other apps or from CLI |
| APP | Regular application for the main menu |
| PLUGIN | Application to be built as a part of the firmware and to be placed in the 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 the 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 |
extern "C" to use them as entry points.fbt will abort the firmware build process.ps, and free CLI commands to profile your app's memory usage.["all"].The following parameters are used only for FAPs:
["*.c*"] includes C and C++ source files. Applications cannot use the "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 an 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: a list of additional libraries 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 the 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 the mbedtls library, fbt will add lib/mbedtls/include to the list of include paths for the application and compile only the files specified in the sources list. Additionally, fbt will enable MBEDTLS_ERROR_C preprocessor definition for mbedtls sources.
For the loclass library, fbt will add lib/loclass to the list of the include paths for the application and build all sources in that folder. Also, fbt will disable treating compiler warnings as errors for the loclass library, which can be useful when compiling large 3rd-party codebases.
Both libraries will be linked with 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.