151 lines
4.1 KiB
Python
151 lines
4.1 KiB
Python
|
#
|
||
|
# Main Fipper Build System entry point
|
||
|
#
|
||
|
# This file is evaluated by scons (the build system) every time fbt is invoked.
|
||
|
# Scons constructs all referenced environments & their targets' dependency
|
||
|
# trees on startup. So, to keep startup time as low as possible, we're hiding
|
||
|
# construction of certain targets behind command-line options.
|
||
|
|
||
|
import os
|
||
|
|
||
|
DefaultEnvironment(tools=[])
|
||
|
# Progress(["OwO\r", "owo\r", "uwu\r", "owo\r"], interval=15)
|
||
|
|
||
|
|
||
|
# This environment is created only for loading options & validating file/dir existance
|
||
|
fbt_variables = SConscript("site_scons/commandline.scons")
|
||
|
cmd_environment = Environment(tools=[], variables=fbt_variables)
|
||
|
Help(fbt_variables.GenerateHelpText(cmd_environment))
|
||
|
|
||
|
|
||
|
# Building basic environment - tools, utility methods, cross-compilation
|
||
|
# settings, gcc flags for Cortex-M4, basic builders and more
|
||
|
coreenv = SConscript(
|
||
|
"site_scons/environ.scons",
|
||
|
exports={"VAR_ENV": cmd_environment},
|
||
|
)
|
||
|
SConscript("site_scons/cc.scons", exports={"ENV": coreenv})
|
||
|
|
||
|
# Store root dir in environment for certain tools
|
||
|
coreenv["ROOT_DIR"] = Dir(".")
|
||
|
|
||
|
# Create a separate "dist" environment and add construction envs to it
|
||
|
distenv = coreenv.Clone(
|
||
|
tools=["fbt_dist", "openocd"],
|
||
|
GDBOPTS="-ex 'target extended-remote | ${OPENOCD} -c \"gdb_port pipe\" ${OPENOCD_OPTS}' "
|
||
|
'-ex "set confirm off" ',
|
||
|
ENV=os.environ,
|
||
|
)
|
||
|
|
||
|
firmware_out = distenv.AddFwProject(
|
||
|
base_env=coreenv,
|
||
|
fw_type="firmware",
|
||
|
fw_env_key="FW_ENV",
|
||
|
)
|
||
|
|
||
|
|
||
|
# If enabled, initialize updater-related targets
|
||
|
if GetOption("fullenv"):
|
||
|
updater_out = distenv.AddFwProject(
|
||
|
base_env=coreenv,
|
||
|
fw_type="updater",
|
||
|
fw_env_key="UPD_ENV",
|
||
|
)
|
||
|
|
||
|
# Target for self-update package
|
||
|
dist_arguments = [
|
||
|
"-r",
|
||
|
'"${ROOT_DIR.abspath}/assets/resources"',
|
||
|
"--bundlever",
|
||
|
'"${UPDATE_VERSION_STRING}"',
|
||
|
"--radio",
|
||
|
'"${ROOT_DIR.abspath}/${COPRO_STACK_BIN_DIR}/${COPRO_STACK_BIN}"',
|
||
|
"--radiotype",
|
||
|
"${COPRO_STACK_TYPE}",
|
||
|
"${COPRO_DISCLAIMER}",
|
||
|
"--obdata",
|
||
|
'"${ROOT_DIR.abspath}/${COPRO_OB_DATA}"',
|
||
|
]
|
||
|
if distenv["UPDATE_SPLASH"]:
|
||
|
dist_arguments += [
|
||
|
"--splash",
|
||
|
distenv.subst("assets/slideshow/$UPDATE_SPLASH"),
|
||
|
]
|
||
|
selfupdate_dist = distenv.DistBuilder(
|
||
|
"selfupdate.pseudo",
|
||
|
(distenv["DIST_DEPENDS"], firmware_out["FW_RESOURCES"]),
|
||
|
DIST_EXTRA=dist_arguments,
|
||
|
)
|
||
|
distenv.Pseudo("selfupdate.pseudo")
|
||
|
AlwaysBuild(selfupdate_dist)
|
||
|
Alias("updater_package", selfupdate_dist)
|
||
|
|
||
|
# Updater debug
|
||
|
debug_updater_elf = distenv.AddDebugTarget(updater_out, False)
|
||
|
Alias("updater_debug", debug_updater_elf)
|
||
|
|
||
|
|
||
|
# Target for copying & renaming binaries to dist folder
|
||
|
basic_dist = distenv.DistBuilder("dist.pseudo", distenv["DIST_DEPENDS"])
|
||
|
distenv.Pseudo("dist.pseudo")
|
||
|
AlwaysBuild(basic_dist)
|
||
|
Alias("fw_dist", basic_dist)
|
||
|
Default(basic_dist)
|
||
|
|
||
|
# Target for bundling core2 package for qFlipper
|
||
|
copro_dist = distenv.CoproBuilder(
|
||
|
Dir("assets/core2_firmware"),
|
||
|
[],
|
||
|
)
|
||
|
AlwaysBuild(copro_dist)
|
||
|
Alias("copro_dist", copro_dist)
|
||
|
|
||
|
|
||
|
# Debugging firmware
|
||
|
|
||
|
debug_fw_elf = distenv.AddDebugTarget(firmware_out)
|
||
|
Alias("debug", debug_fw_elf)
|
||
|
|
||
|
|
||
|
# Debug alien elf
|
||
|
debug_other = distenv.GDBPy(
|
||
|
"debugother.pseudo",
|
||
|
None,
|
||
|
GDBPYOPTS=
|
||
|
# '-ex "source ${ROOT_DIR.abspath}/debug/FreeRTOS/FreeRTOS.py" '
|
||
|
'-ex "source debug/PyCortexMDebug/PyCortexMDebug.py" '
|
||
|
)
|
||
|
distenv.Pseudo("debugother.pseudo")
|
||
|
AlwaysBuild(debug_other)
|
||
|
Alias("debug_other", debug_other)
|
||
|
|
||
|
|
||
|
# Just start OpenOCD
|
||
|
openocd = distenv.OOCDCommand("openocd.pseudo", [])
|
||
|
distenv.Pseudo("openocd.pseudo")
|
||
|
AlwaysBuild(openocd)
|
||
|
Alias("openocd", openocd)
|
||
|
|
||
|
|
||
|
# Linter
|
||
|
lint_check = distenv.Command(
|
||
|
"lint.check.pseudo",
|
||
|
[],
|
||
|
"${PYTHON3} scripts/lint.py check $LINT_SOURCES",
|
||
|
LINT_SOURCES=firmware_out["LINT_SOURCES"],
|
||
|
)
|
||
|
distenv.Pseudo("lint.check.pseudo")
|
||
|
AlwaysBuild(lint_check)
|
||
|
Alias("lint", lint_check)
|
||
|
|
||
|
|
||
|
lint_format = distenv.Command(
|
||
|
"lint.format.pseudo",
|
||
|
[],
|
||
|
"${PYTHON3} scripts/lint.py format $LINT_SOURCES",
|
||
|
LINT_SOURCES=firmware_out["LINT_SOURCES"],
|
||
|
)
|
||
|
distenv.Pseudo("lint.format.pseudo")
|
||
|
AlwaysBuild(lint_format)
|
||
|
Alias("format", lint_format)
|