mkromfs.py 3.7 KB

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