make_romfs.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #!/usr/bin/env python3
  2. '''
  3. script to create romfs.h from a set of files
  4. Andrew Tridgell
  5. May 2017
  6. '''
  7. import os, sys, tempfile, gzip
  8. def write_encode(out, s):
  9. out.write(s.encode())
  10. def embed_file(out, f, idx, embedded_name):
  11. '''embed one file'''
  12. try:
  13. contents = open(f,'rb').read()
  14. except Exception:
  15. raise Exception("Failed to embed %s" % f)
  16. pad = 0
  17. if embedded_name.endswith("bootloader.bin"):
  18. # round size to a multiple of 32 bytes for bootloader, this ensures
  19. # it can be flashed on a STM32H7 chip
  20. blen = len(contents)
  21. pad = (32 - (blen % 32)) % 32
  22. if pad != 0:
  23. if sys.version_info[0] >= 3:
  24. contents += bytes([0xff]*pad)
  25. else:
  26. for i in range(pad):
  27. contents += bytes(chr(0xff))
  28. print("Padded %u bytes for %s to %u" % (pad, embedded_name, len(contents)))
  29. write_encode(out, 'static const uint8_t romfs_%u[] = {' % idx)
  30. outf = tempfile.NamedTemporaryFile()
  31. # ensure nul termination
  32. nul = bytearray([0])
  33. if contents[-1] != nul:
  34. contents += nul
  35. outf.write(contents)
  36. outf.seek(0)
  37. b = bytearray(outf.read())
  38. outf.close()
  39. for c in b:
  40. write_encode(out, '%u,' % c)
  41. write_encode(out, '};\n\n');
  42. def create_embedded_h(filename, files):
  43. '''create a romfs_embedded.h file'''
  44. out = open(filename, "wb")
  45. write_encode(out, '''// generated embedded files\n\n''')
  46. # remove duplicates and sort
  47. files = sorted(list(set(files)))
  48. for i in range(len(files)):
  49. (name, filename) = files[i]
  50. try:
  51. embed_file(out, filename, i, name)
  52. except Exception as e:
  53. print(e)
  54. return False
  55. write_encode(out, '''const ROMFS::embedded_file ROMFS::files[] = {\n''')
  56. for i in range(len(files)):
  57. (name, filename) = files[i]
  58. print("Embedding file %s:%s" % (name, filename))
  59. write_encode(out, '{ "%s", sizeof(romfs_%u), romfs_%u },\n' % (name, i, i))
  60. write_encode(out, '};\n')
  61. out.close()
  62. return True
  63. if __name__ == '__main__':
  64. import sys
  65. flist = []
  66. if len(sys.argv) < 2:
  67. print("Usage: make_romfs.py romfs_files.h FILES...")
  68. sys.exit(1)
  69. for i in range(2, len(sys.argv)):
  70. f = sys.argv[i]
  71. flist.append((f, f))
  72. create_embedded_h(sys.argv[1], flist)