dist.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #!/usr/bin/env python3
  2. from flipper.app import App
  3. from os.path import join, exists
  4. from os import makedirs
  5. from update import Main as UpdateMain
  6. import shutil
  7. class Main(App):
  8. def init(self):
  9. self.subparsers = self.parser.add_subparsers(help="sub-command help")
  10. self.parser_copy = self.subparsers.add_parser(
  11. "copy", help="Copy firmware binaries & metadata"
  12. )
  13. self.parser_copy.add_argument("-t", dest="target", required=True)
  14. self.parser_copy.add_argument("-p", dest="projects", nargs="+", required=True)
  15. self.parser_copy.add_argument("-s", dest="suffix", required=True)
  16. self.parser_copy.add_argument("-a", dest="assets", required=False)
  17. self.parser_copy.add_argument(
  18. "--bundlever",
  19. dest="version",
  20. help="If set, bundle update package for self-update",
  21. required=False,
  22. )
  23. self.parser_copy.add_argument(
  24. "--noclean",
  25. dest="noclean",
  26. action="store_true",
  27. help="Don't clean output directory",
  28. required=False,
  29. )
  30. self.parser_copy.set_defaults(func=self.copy)
  31. def get_project_filename(self, project, filetype):
  32. # Temporary fix
  33. if project == "firmware" and filetype != "elf":
  34. project = "full"
  35. return f"flipper-z-{self.args.target}-{project}-{self.args.suffix}.{filetype}"
  36. def get_dist_filepath(self, filename):
  37. return join(self.output_dir_path, filename)
  38. def copy_single_project(self, project):
  39. target_project = f"{self.args.target}-{project}"
  40. obj_directory = join("firmware", ".obj", target_project)
  41. for filetype in ("elf", "bin", "dfu", "json"):
  42. shutil.copyfile(
  43. join(obj_directory, f"{project}.{filetype}"),
  44. self.get_dist_filepath(self.get_project_filename(project, filetype)),
  45. )
  46. def copy(self):
  47. self.output_dir_path = join("dist", self.args.target)
  48. if exists(self.output_dir_path) and not self.args.noclean:
  49. shutil.rmtree(self.output_dir_path)
  50. if not exists(self.output_dir_path):
  51. makedirs(self.output_dir_path)
  52. for project in self.args.projects:
  53. self.copy_single_project(project)
  54. self.logger.info(
  55. f"Firmware binaries can be found at:\n\t{self.output_dir_path}"
  56. )
  57. if self.args.version:
  58. bundle_dir = join(
  59. self.output_dir_path, f"{self.args.target}-update-{self.args.suffix}"
  60. )
  61. bundle_args = [
  62. "generate",
  63. "-d",
  64. bundle_dir,
  65. "-v",
  66. self.args.version,
  67. "-t",
  68. self.args.target,
  69. "-dfu",
  70. self.get_dist_filepath(self.get_project_filename("firmware", "dfu")),
  71. "-stage",
  72. self.get_dist_filepath(self.get_project_filename("updater", "bin")),
  73. ]
  74. if self.args.assets:
  75. bundle_args.extend(
  76. (
  77. "-a",
  78. self.args.assets,
  79. )
  80. )
  81. self.logger.info(
  82. f"Use this directory to self-update your Flipper:\n\t{bundle_dir}"
  83. )
  84. return UpdateMain(no_exit=True)(bundle_args)
  85. return 0
  86. if __name__ == "__main__":
  87. Main()()