mkromfs.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import sys
  2. import os
  3. import string
  4. basename = ''
  5. output = ''
  6. def mkromfs_output(out):
  7. # print '%s' % out,
  8. output.write(out)
  9. def mkromfs_file(filename, arrayname):
  10. f = file(filename, "rb")
  11. arrayname = arrayname.replace('.', '_')
  12. arrayname = arrayname.replace('-', '_')
  13. mkromfs_output('const static unsigned char %s[] = {\n' % arrayname)
  14. count = 0
  15. while True:
  16. byte = f.read(1)
  17. if len(byte) != 1:
  18. break
  19. mkromfs_output('0x%02x,' % ord(byte))
  20. count = count + 1
  21. if count == 16:
  22. count = 0
  23. mkromfs_output('\n')
  24. if count == 0:
  25. mkromfs_output('};\n\n')
  26. else:
  27. mkromfs_output('\n};\n\n')
  28. f.close()
  29. def mkromfs_dir(dirname, is_root = False):
  30. list = os.listdir(dirname)
  31. path = os.path.abspath(dirname)
  32. # make for directory
  33. for item in list:
  34. fullpath = os.path.join(path, item)
  35. if os.path.isdir(fullpath):
  36. # if it is an empty directory, ignore it
  37. l = os.listdir(fullpath)
  38. if len(l):
  39. mkromfs_dir(fullpath)
  40. # make for files
  41. for item in list:
  42. fullpath = os.path.join(path, item)
  43. if os.path.isfile(fullpath):
  44. subpath = fullpath[len(basename):]
  45. array = subpath.split('\\')
  46. arrayname = string.join(array, '_')
  47. mkromfs_file(fullpath, arrayname)
  48. subpath = path[len(basename):]
  49. dir = subpath.split('\\')
  50. direntname = string.join(dir, '_')
  51. if is_root:
  52. mkromfs_output('const struct romfs_dirent _root_dirent[] = {\n')
  53. else:
  54. mkromfs_output(('const static struct romfs_dirent %s[] = {\n' % direntname))
  55. for item in list:
  56. fullpath = os.path.join(path, item)
  57. fn = fullpath[len(dirname):]
  58. if fn[0] == '\\':
  59. fn = fn[1:]
  60. fn = fn.replace('\\', '/')
  61. subpath = fullpath[len(basename):]
  62. items = subpath.split('\\')
  63. item_name = string.join(items, '_')
  64. item_name = item_name.replace('.', '_')
  65. item_name = item_name.replace('-', '_')
  66. subpath = subpath.replace('\\', '/')
  67. if subpath[0] == '/':
  68. subpath = subpath[1:]
  69. if not os.path.isfile(fullpath):
  70. l = os.listdir(fullpath)
  71. if len(l):
  72. mkromfs_output(('\t{ROMFS_DIRENT_DIR, "%s", %s, sizeof(%s)/sizeof(%s[0])},\n' % (fn, item_name, item_name, item_name)))
  73. else:
  74. mkromfs_output(('\t{ROMFS_DIRENT_DIR, "%s", RT_NULL, 0},\n' % fn))
  75. for item in list:
  76. fullpath = os.path.join(path, item)
  77. fn = fullpath[len(dirname):]
  78. if fn[0] == '\\':
  79. fn = fn[1:]
  80. fn = fn.replace('\\', '/')
  81. subpath = fullpath[len(basename):]
  82. items = subpath.split('\\')
  83. item_name = string.join(items, '_')
  84. item_name = item_name.replace('.', '_')
  85. item_name = item_name.replace('-', '_')
  86. subpath = subpath.replace('\\', '/')
  87. if subpath[0] == '/':
  88. subpath = subpath[1:]
  89. if os.path.isfile(fullpath):
  90. mkromfs_output(('\t{ROMFS_DIRENT_FILE, "%s", %s, sizeof(%s)},\n' % (fn, item_name, item_name)))
  91. mkromfs_output('};\n\n')
  92. if __name__ == "__main__":
  93. try:
  94. basename = os.path.abspath(sys.argv[1])
  95. filename = os.path.abspath(sys.argv[2])
  96. except IndexError:
  97. print "Usage: %s <dirname> <filename>" % sys.argv[0]
  98. raise SystemExit
  99. output = file(filename, 'wt')
  100. mkromfs_output("#include <dfs_romfs.h>\n\n")
  101. mkromfs_dir(basename, is_root = True)
  102. mkromfs_output("const struct romfs_dirent romfs_root = {ROMFS_DIRENT_DIR, \"/\", _root_dirent, sizeof(_root_dirent)/sizeof(_root_dirent[0])};\n\n")