fbt_dist.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. from SCons.Builder import Builder
  2. from SCons.Action import Action
  3. from SCons.Script import Mkdir
  4. from SCons.Defaults import Touch
  5. def get_variant_dirname(env, project=None):
  6. parts = [f"f{env['TARGET_HW']}"]
  7. if project:
  8. parts.append(project)
  9. suffix = ""
  10. if env["DEBUG"]:
  11. suffix += "D"
  12. if env["COMPACT"]:
  13. suffix += "C"
  14. if suffix:
  15. parts.append(suffix)
  16. return "-".join(parts)
  17. def create_fw_build_targets(env, configuration_name):
  18. flavor = get_variant_dirname(env, configuration_name)
  19. build_dir = env.Dir("build").Dir(flavor).abspath
  20. return env.SConscript(
  21. "firmware.scons",
  22. variant_dir=build_dir,
  23. duplicate=0,
  24. exports={
  25. "ENV": env,
  26. "fw_build_meta": {
  27. "type": configuration_name,
  28. "flavor": flavor,
  29. "build_dir": build_dir,
  30. },
  31. },
  32. )
  33. def AddFwProject(env, base_env, fw_type, fw_env_key):
  34. project_env = env[fw_env_key] = create_fw_build_targets(base_env, fw_type)
  35. env.Append(
  36. DIST_PROJECTS=[
  37. project_env["FW_FLAVOR"],
  38. ],
  39. DIST_DEPENDS=[
  40. project_env["FW_ARTIFACTS"],
  41. ],
  42. )
  43. env.Replace(DIST_DIR=get_variant_dirname(env))
  44. return project_env
  45. def AddOpenOCDFlashTarget(env, targetenv, **kw):
  46. openocd_target = env.OpenOCDFlash(
  47. "#build/oocd-${BUILD_CFG}-flash.flag",
  48. targetenv["FW_BIN"],
  49. OPENOCD_COMMAND=[
  50. "-c",
  51. "program ${SOURCE.posix} reset exit ${BASE_ADDRESS}",
  52. ],
  53. BUILD_CFG=targetenv.subst("$FIRMWARE_BUILD_CFG"),
  54. BASE_ADDRESS=targetenv.subst("$IMAGE_BASE_ADDRESS"),
  55. **kw,
  56. )
  57. env.Alias(targetenv.subst("${FIRMWARE_BUILD_CFG}_flash"), openocd_target)
  58. return openocd_target
  59. def DistCommand(env, name, source, **kw):
  60. target = f"dist_{name}"
  61. command = env.Command(
  62. target,
  63. source,
  64. '@${PYTHON3} ${ROOT_DIR.abspath}/scripts/sconsdist.py copy -p ${DIST_PROJECTS} -s "${DIST_SUFFIX}" ${DIST_EXTRA}',
  65. **kw,
  66. )
  67. env.Pseudo(target)
  68. env.Alias(name, command)
  69. return command
  70. def generate(env):
  71. env.AddMethod(AddFwProject)
  72. env.AddMethod(DistCommand)
  73. env.AddMethod(AddOpenOCDFlashTarget)
  74. env.SetDefault(
  75. COPRO_MCU_FAMILY="STM32WB5x",
  76. )
  77. env.Append(
  78. BUILDERS={
  79. "UsbInstall": Builder(
  80. action=[
  81. Action(
  82. "${PYTHON3} ${ROOT_DIR.abspath}/scripts/selfupdate.py dist/${DIST_DIR}/f${TARGET_HW}-update-${DIST_SUFFIX}/update.fuf"
  83. ),
  84. Touch("${TARGET}"),
  85. ]
  86. ),
  87. "CoproBuilder": Builder(
  88. action=Action(
  89. [
  90. Mkdir("$TARGET"),
  91. "${PYTHON3} ${ROOT_DIR.abspath}/scripts/assets.py "
  92. "copro ${COPRO_CUBE_DIR} "
  93. "${TARGET} ${COPRO_MCU_FAMILY} "
  94. "--cube_ver=${COPRO_CUBE_VERSION} "
  95. "--stack_type=${COPRO_STACK_TYPE} "
  96. '--stack_file="${COPRO_STACK_BIN}" '
  97. "--stack_addr=${COPRO_STACK_ADDR} ",
  98. ],
  99. "",
  100. )
  101. ),
  102. }
  103. )
  104. def exists(env):
  105. return True