fbt_dist.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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 GetProjetDirName(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 = GetProjetDirName(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=env.GetProjetDirName())
  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. if env["FORCE"]:
  59. env.AlwaysBuild(openocd_target)
  60. return openocd_target
  61. def AddJFlashTarget(env, targetenv, **kw):
  62. jflash_target = env.JFlash(
  63. "#build/jflash-${BUILD_CFG}-flash.flag",
  64. targetenv["FW_BIN"],
  65. JFLASHADDR=targetenv.subst("$IMAGE_BASE_ADDRESS"),
  66. BUILD_CFG=targetenv.subst("${FIRMWARE_BUILD_CFG}"),
  67. **kw,
  68. )
  69. env.Alias(targetenv.subst("${FIRMWARE_BUILD_CFG}_jflash"), jflash_target)
  70. if env["FORCE"]:
  71. env.AlwaysBuild(jflash_target)
  72. return jflash_target
  73. def AddUsbFlashTarget(env, file_flag, extra_deps, **kw):
  74. usb_update = env.UsbInstall(
  75. file_flag,
  76. (
  77. env["DIST_DEPENDS"],
  78. *extra_deps,
  79. ),
  80. )
  81. if env["FORCE"]:
  82. env.AlwaysBuild(usb_update)
  83. return usb_update
  84. def DistCommand(env, name, source, **kw):
  85. target = f"dist_{name}"
  86. command = env.Command(
  87. target,
  88. source,
  89. '@${PYTHON3} "${ROOT_DIR.abspath}/scripts/sconsdist.py" copy -p ${DIST_PROJECTS} -s "${DIST_SUFFIX}" ${DIST_EXTRA}',
  90. **kw,
  91. )
  92. env.Pseudo(target)
  93. env.Alias(name, command)
  94. return command
  95. def generate(env):
  96. env.AddMethod(AddFwProject)
  97. env.AddMethod(DistCommand)
  98. env.AddMethod(AddOpenOCDFlashTarget)
  99. env.AddMethod(GetProjetDirName)
  100. env.AddMethod(AddJFlashTarget)
  101. env.AddMethod(AddUsbFlashTarget)
  102. env.SetDefault(
  103. COPRO_MCU_FAMILY="STM32WB5x",
  104. )
  105. env.Append(
  106. BUILDERS={
  107. "UsbInstall": Builder(
  108. action=[
  109. Action(
  110. '${PYTHON3} "${ROOT_DIR.abspath}/scripts/selfupdate.py" dist/${DIST_DIR}/f${TARGET_HW}-update-${DIST_SUFFIX}/update.fuf'
  111. ),
  112. Touch("${TARGET}"),
  113. ]
  114. ),
  115. "CoproBuilder": Builder(
  116. action=Action(
  117. [
  118. '${PYTHON3} "${ROOT_DIR.abspath}/scripts/assets.py" '
  119. "copro ${COPRO_CUBE_DIR} "
  120. "${TARGET} ${COPRO_MCU_FAMILY} "
  121. "--cube_ver=${COPRO_CUBE_VERSION} "
  122. "--stack_type=${COPRO_STACK_TYPE} "
  123. '--stack_file="${COPRO_STACK_BIN}" '
  124. "--stack_addr=${COPRO_STACK_ADDR} ",
  125. ],
  126. "\tCOPRO\t${TARGET}",
  127. )
  128. ),
  129. }
  130. )
  131. def exists(env):
  132. return True