source: mainline/tools/mkarray.py@ 77578e8

Last change on this file since 77578e8 was 4dd3912, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 3 years ago

Update python scripts

  • Property mode set to 100755
File size: 4.0 KB
Line 
1#!/usr/bin/env python
2#
3# SPDX-FileCopyrightText: 2011 Martin Decky
4#
5# SPDX-License-Identifier: BSD-3-Clause
6#
7"""
8Binary inline data packer
9"""
10
11import sys
12import os
13import zlib
14import zipfile
15import binascii
16
17def usage(prname):
18 "Print usage syntax"
19 print("%s [--deflate] <DESTINATION> <LABEL> <AS_PROLOG> <SECTION> [SOURCE ...]" % prname)
20
21def arg_check():
22 if (len(sys.argv) < 5):
23 usage(sys.argv[0])
24 sys.exit()
25
26def deflate(data):
27 "Compress using deflate algorithm (without any headers)"
28 return zlib.compress(data, 9)[2:-4]
29
30def chunks(string, length):
31 "Produce string chunks"
32 for start in range(0, len(string), length):
33 yield string[start:start + length]
34
35def main():
36 arg_check()
37
38 if sys.argv[1] == "--deflate":
39 sys.argv.pop(1)
40 arg_check()
41 compress = True
42 else:
43 compress = False
44
45 dest = sys.argv[1]
46 label = sys.argv[2]
47 as_prolog = sys.argv[3]
48 section = sys.argv[4]
49
50 timestamp = (1980, 1, 1, 0, 0, 0)
51
52 header_ctx = []
53 desc_ctx = []
54 size_ctx = []
55 data_ctx = []
56
57 src_cnt = 0
58
59 archive = zipfile.ZipFile("%s.zip" % dest, "w", zipfile.ZIP_STORED)
60
61 for src in sys.argv[5:]:
62 basename = os.path.basename(src)
63 plainname = os.path.splitext(basename)[0]
64 symbol = basename.replace(".", "_")
65
66 print("%s -> %s" % (src, symbol))
67
68 src_in = open(src, "rb")
69 src_data = src_in.read()
70 src_in.close()
71
72 length = len(src_data)
73
74 if compress:
75 src_data = deflate(src_data)
76 src_fname = os.path.basename("%s.deflate" % src)
77 zipinfo = zipfile.ZipInfo(src_fname, timestamp)
78 archive.writestr(zipinfo, src_data)
79 else:
80 src_fname = src
81
82 if sys.version_info < (3,):
83 src_data = bytearray(src_data)
84
85 length_out = len(src_data)
86
87 header_ctx.append("extern uint8_t %s[];" % symbol)
88 header_ctx.append("extern size_t %s_size;" % symbol)
89
90 data_ctx.append(".globl %s" % symbol)
91 data_ctx.append(".balign 8")
92 data_ctx.append(".size %s, %u" % (symbol, length_out))
93 data_ctx.append("%s:" % symbol)
94 data_ctx.append("\t.incbin \"%s\"\n" % src_fname)
95
96 desc_field = []
97 desc_field.append("\t{")
98 desc_field.append("\t\t.name = \"%s\"," % plainname)
99 desc_field.append("\t\t.addr = (void *) %s," % symbol)
100 desc_field.append("\t\t.size = %u," % length_out)
101 desc_field.append("\t\t.inflated = %u," % length)
102
103 if compress:
104 desc_field.append("\t\t.compressed = true")
105 else:
106 desc_field.append("\t\t.compressed = false")
107
108 desc_field.append("\t}")
109
110 desc_ctx.append("\n".join(desc_field))
111
112 size_ctx.append("size_t %s_size = %u;" % (symbol, length_out))
113
114 src_cnt += 1
115
116 data = ''
117 data += '/*\n'
118 data += ' * AUTO-GENERATED FILE, DO NOT EDIT!!!\n'
119 data += ' * Generated by: tools/mkarray.py\n'
120 data += ' */\n\n'
121 data += "#ifndef %sS_H_\n" % label.upper()
122 data += "#define %sS_H_\n\n" % label.upper()
123 data += "#include <stddef.h>\n"
124 data += "#include <stdint.h>\n"
125 data += "#include <stdbool.h>\n\n"
126 data += "#define %sS %u\n\n" % (label.upper(), src_cnt)
127 data += "typedef struct {\n"
128 data += "\tconst char *name;\n"
129 data += "\tvoid *addr;\n"
130 data += "\tsize_t size;\n"
131 data += "\tsize_t inflated;\n"
132 data += "\tbool compressed;\n"
133 data += "} %s_t;\n\n" % label
134 data += "extern %s_t %ss[];\n\n" % (label, label)
135 data += "\n".join(header_ctx)
136 data += "\n\n"
137 data += "#endif\n"
138 zipinfo = zipfile.ZipInfo("%s.h" % dest, timestamp)
139 archive.writestr(zipinfo, data)
140
141 data = ''
142 data += '/*\n'
143 data += ' * AUTO-GENERATED FILE, DO NOT EDIT!!!\n'
144 data += ' * Generated by: tools/mkarray.py\n'
145 data += ' */\n\n'
146 data += as_prolog
147 data += "%s\n\n" % section
148 data += "\n".join(data_ctx)
149 data += "\n"
150 zipinfo = zipfile.ZipInfo("%s.s" % dest, timestamp)
151 archive.writestr(zipinfo, data)
152
153 data = ''
154 data += '/*\n'
155 data += ' * AUTO-GENERATED FILE, DO NOT EDIT!!!\n'
156 data += ' * Generated by: tools/mkarray.py\n'
157 data += ' */\n\n'
158 data += "#include \"%s.h\"\n\n" % dest
159 data += "%s_t %ss[] = {\n" % (label, label)
160 data += ",\n".join(desc_ctx)
161 data += "\n"
162 data += "};\n\n"
163 data += "\n".join(size_ctx)
164 data += "\n"
165 zipinfo = zipfile.ZipInfo("%s_desc.c" % dest, timestamp)
166 archive.writestr(zipinfo, data)
167
168 archive.close()
169
170if __name__ == '__main__':
171 main()
Note: See TracBrowser for help on using the repository browser.