fbt_dist.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. from SCons.Builder import Builder
  2. from SCons.Action import Action
  3. from SCons.Script import Mkdir
  4. def get_variant_dirname(env, project=None):
  5. parts = [f"f{env['TARGET_HW']}"]
  6. if project:
  7. parts.append(project)
  8. suffix = ""
  9. if env["DEBUG"]:
  10. suffix += "D"
  11. if env["COMPACT"]:
  12. suffix += "C"
  13. if suffix:
  14. parts.append(suffix)
  15. return "-".join(parts)
  16. def create_fw_build_targets(env, configuration_name):
  17. flavor = get_variant_dirname(env, configuration_name)
  18. build_dir = env.Dir("build").Dir(flavor).abspath
  19. return env.SConscript(
  20. "firmware.scons",
  21. variant_dir=build_dir,
  22. duplicate=0,
  23. exports={
  24. "ENV": env,
  25. "fw_build_meta": {
  26. "type": configuration_name,
  27. "flavor": flavor,
  28. "build_dir": build_dir,
  29. },
  30. },
  31. )
  32. def AddFwProject(env, base_env, fw_type, fw_env_key):
  33. project_env = env[fw_env_key] = create_fw_build_targets(base_env, fw_type)
  34. env.Append(
  35. DIST_PROJECTS=[
  36. project_env["FW_FLAVOR"],
  37. ],
  38. DIST_DEPENDS=[
  39. project_env["FW_ARTIFACTS"],
  40. ],
  41. )
  42. return project_env
  43. def AddDebugTarget(env, targetenv, force_flash=True):
  44. pseudo_name = f"debug.{targetenv.subst('$FIRMWARE_BUILD_CFG')}.pseudo"
  45. debug_target = env.GDBPy(
  46. pseudo_name,
  47. targetenv["FW_ELF"],
  48. GDBPYOPTS='-ex "source debug/FreeRTOS/FreeRTOS.py" '
  49. '-ex "source debug/PyCortexMDebug/PyCortexMDebug.py" '
  50. '-ex "svd_load ${SVD_FILE}" '
  51. '-ex "compare-sections"',
  52. )
  53. if force_flash:
  54. env.Depends(debug_target, targetenv["FW_FLASH"])
  55. env.Pseudo(pseudo_name)
  56. env.AlwaysBuild(debug_target)
  57. return debug_target
  58. def generate(env):
  59. env.AddMethod(AddFwProject)
  60. env.AddMethod(AddDebugTarget)
  61. env.SetDefault(
  62. COPRO_MCU_FAMILY="STM32WB5x",
  63. )
  64. env.Append(
  65. BUILDERS={
  66. "DistBuilder": Builder(
  67. action=Action(
  68. '${PYTHON3} ${ROOT_DIR.abspath}/scripts/sconsdist.py copy -p ${DIST_PROJECTS} -s "${DIST_SUFFIX}" ${DIST_EXTRA}',
  69. "${DISTCOMSTR}",
  70. ),
  71. ),
  72. "CoproBuilder": Builder(
  73. action=Action(
  74. [
  75. Mkdir("$TARGET"),
  76. "${PYTHON3} ${ROOT_DIR.abspath}/scripts/assets.py "
  77. "copro ${COPRO_CUBE_DIR} "
  78. "${TARGET} ${COPRO_MCU_FAMILY} "
  79. "--cube_ver=${COPRO_CUBE_VERSION} "
  80. "--stack_type=${COPRO_STACK_TYPE} "
  81. '--stack_file="${COPRO_STACK_BIN}" '
  82. "--stack_addr=${COPRO_STACK_ADDR} ",
  83. ],
  84. "",
  85. )
  86. ),
  87. }
  88. )
  89. def exists(env):
  90. return True