make_romfs.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. write_encode(out, 'static const uint8_t romfs_%u[] = {' % idx)
  17. outf = tempfile.NamedTemporaryFile()
  18. with gzip.GzipFile(fileobj=outf, mode='wb', filename='', compresslevel=9, mtime=0) as g:
  19. g.write(contents)
  20. outf.seek(0)
  21. b = bytearray(outf.read())
  22. outf.close()
  23. for c in b:
  24. write_encode(out, '%u,' % c)
  25. write_encode(out, '};\n\n');
  26. def create_embedded_h(filename, files):
  27. '''create a romfs_embedded.h file'''
  28. out = open(filename, "wb")
  29. write_encode(out, '''// generated embedded files\n\n''')
  30. # remove duplicates and sort
  31. files = sorted(list(set(files)))
  32. for i in range(len(files)):
  33. (name, filename) = files[i]
  34. try:
  35. embed_file(out, filename, i, name)
  36. except Exception as e:
  37. print(e)
  38. return False
  39. write_encode(out, '''const ROMFS::embedded_file ROMFS::files[] = {\n''')
  40. for i in range(len(files)):
  41. (name, filename) = files[i]
  42. print("Embedding file %s:%s" % (name, filename))
  43. write_encode(out, '{ "%s", sizeof(romfs_%u), romfs_%u },\n' % (name, i, i))
  44. write_encode(out, '};\n')
  45. out.close()
  46. return True
  47. if __name__ == '__main__':
  48. import sys
  49. flist = []
  50. if len(sys.argv) < 2:
  51. print("Usage: make_romfs.py romfs_files.h FILES...")
  52. sys.exit(1)
  53. for i in range(2, len(sys.argv)):
  54. f = sys.argv[i]
  55. flist.append((f, f))
  56. create_embedded_h(sys.argv[1], flist)