fbt_dist.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. from SCons.Action import Action
  2. from SCons.Builder import Builder
  3. from SCons.Defaults import Touch
  4. def GetProjetDirName(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 = GetProjetDirName(env, configuration_name)
  18. build_dir = env.Dir("build").Dir(flavor)
  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. env.Replace(DIST_DIR=env.GetProjetDirName())
  43. return project_env
  44. def AddOpenOCDFlashTarget(env, targetenv, **kw):
  45. openocd_target = env.OpenOCDFlash(
  46. "#build/oocd-${BUILD_CFG}-flash.flag",
  47. targetenv["FW_BIN"],
  48. OPENOCD_COMMAND=[
  49. "-c",
  50. "program ${SOURCE.posix} reset exit ${BASE_ADDRESS}",
  51. ],
  52. BUILD_CFG=targetenv.subst("$FIRMWARE_BUILD_CFG"),
  53. BASE_ADDRESS=targetenv.subst("$IMAGE_BASE_ADDRESS"),
  54. **kw,
  55. )
  56. env.Alias(targetenv.subst("${FIRMWARE_BUILD_CFG}_flash"), openocd_target)
  57. if env["FORCE"]:
  58. env.AlwaysBuild(openocd_target)
  59. return openocd_target
  60. def AddJFlashTarget(env, targetenv, **kw):
  61. jflash_target = env.JFlash(
  62. "#build/jflash-${BUILD_CFG}-flash.flag",
  63. targetenv["FW_BIN"],
  64. JFLASHADDR=targetenv.subst("$IMAGE_BASE_ADDRESS"),
  65. BUILD_CFG=targetenv.subst("${FIRMWARE_BUILD_CFG}"),
  66. **kw,
  67. )
  68. env.Alias(targetenv.subst("${FIRMWARE_BUILD_CFG}_jflash"), jflash_target)
  69. if env["FORCE"]:
  70. env.AlwaysBuild(jflash_target)
  71. return jflash_target
  72. def AddUsbFlashTarget(env, file_flag, extra_deps, **kw):
  73. usb_update = env.UsbInstall(
  74. file_flag,
  75. (
  76. env["DIST_DEPENDS"],
  77. *extra_deps,
  78. ),
  79. )
  80. if env["FORCE"]:
  81. env.AlwaysBuild(usb_update)
  82. return usb_update
  83. def DistCommand(env, name, source, **kw):
  84. target = f"dist_{name}"
  85. command = env.Command(
  86. target,
  87. source,
  88. '@${PYTHON3} "${DIST_SCRIPT}" copy -p ${DIST_PROJECTS} -s "${DIST_SUFFIX}" ${DIST_EXTRA}',
  89. **kw,
  90. )
  91. env.Pseudo(target)
  92. env.Alias(name, command)
  93. return command
  94. def generate(env):
  95. if not env["VERBOSE"]:
  96. env.SetDefault(COPROCOMSTR="\tCOPRO\t${TARGET}")
  97. env.AddMethod(AddFwProject)
  98. env.AddMethod(DistCommand)
  99. env.AddMethod(AddOpenOCDFlashTarget)
  100. env.AddMethod(GetProjetDirName)
  101. env.AddMethod(AddJFlashTarget)
  102. env.AddMethod(AddUsbFlashTarget)
  103. env.SetDefault(
  104. COPRO_MCU_FAMILY="STM32WB5x",
  105. SELFUPDATE_SCRIPT="${FBT_SCRIPT_DIR}/selfupdate.py",
  106. DIST_SCRIPT="${FBT_SCRIPT_DIR}/sconsdist.py",
  107. COPRO_ASSETS_SCRIPT="${FBT_SCRIPT_DIR}/assets.py",
  108. )
  109. env.Append(
  110. BUILDERS={
  111. "UsbInstall": Builder(
  112. action=[
  113. Action(
  114. '${PYTHON3} "${SELFUPDATE_SCRIPT}" ${UPDATE_BUNDLE_DIR}/update.fuf'
  115. ),
  116. Touch("${TARGET}"),
  117. ]
  118. ),
  119. "CoproBuilder": Builder(
  120. action=Action(
  121. [
  122. '${PYTHON3} "${COPRO_ASSETS_SCRIPT}" '
  123. "copro ${COPRO_CUBE_DIR} "
  124. "${TARGET} ${COPRO_MCU_FAMILY} "
  125. "--cube_ver=${COPRO_CUBE_VERSION} "
  126. "--stack_type=${COPRO_STACK_TYPE} "
  127. '--stack_file="${COPRO_STACK_BIN}" '
  128. "--stack_addr=${COPRO_STACK_ADDR} ",
  129. ],
  130. "$COPROCOMSTR",
  131. )
  132. ),
  133. }
  134. )
  135. def exists(env):
  136. return True