| import marshal | |
| import tokenize | |
| import os.path | |
| import sys | |
| PROGRAM_DIR = os.path.dirname(__file__) | |
| SRC_DIR = os.path.dirname(PROGRAM_DIR) | |
| def writecode(fp, mod, data): | |
| print('unsigned char M_%s[] = {' % mod, file=fp) | |
| indent = ' ' * 4 | |
| for i in range(0, len(data), 16): | |
| print(indent, file=fp, end='') | |
| for c in bytes(data[i:i+16]): | |
| print('%d,' % c, file=fp, end='') | |
| print('', file=fp) | |
| print('};', file=fp) | |
| def dump(fp, filename, name): | |
| # Strip the directory to get reproducible marshal dump | |
| code_filename = os.path.basename(filename) | |
| with tokenize.open(filename) as source_fp: | |
| source = source_fp.read() | |
| code = compile(source, code_filename, 'exec', module=name) | |
| data = marshal.dumps(code) | |
| writecode(fp, name, data) | |
| def main(): | |
| if len(sys.argv) < 2: | |
| print(f"usage: {sys.argv[0]} filename") | |
| sys.exit(1) | |
| filename = sys.argv[1] | |
| with open(filename, "w") as fp: | |
| print("// Auto-generated by Programs/freeze_test_frozenmain.py", file=fp) | |
| frozenmain = os.path.join(PROGRAM_DIR, 'test_frozenmain.py') | |
| dump(fp, frozenmain, 'test_frozenmain') | |
| print(f"{filename} written") | |
| if __name__ == "__main__": | |
| main() |