blob: 5a19e687ae631d536a3e5a11b3a12702fe8cad36 [file] [log] [blame]
Damien Georgec7271a82022-06-08 14:47:21 +10001"""
2This pre-processor parses a single file containing a list of
3MP_REGISTER_MODULE(module_name, obj_module)
4These are used to generate a header with the required entries for
5"mp_rom_map_elem_t mp_builtin_module_table[]" in py/objmodule.c
6"""
Andrew Leechcf22f472019-02-18 14:58:44 +11007
8from __future__ import print_function
9
10import re
Damien George673e1542019-04-12 11:34:52 +100011import io
Andrew Leechcf22f472019-02-18 14:58:44 +110012import argparse
13
14
Damien Georgeefe23ac2022-05-31 22:56:11 +100015pattern = re.compile(r"\s*MP_REGISTER_MODULE\((.*?),\s*(.*?)\);", flags=re.DOTALL)
Andrew Leechcf22f472019-02-18 14:58:44 +110016
17
Damien George47f63432022-05-31 17:10:14 +100018def find_module_registrations(filename):
19 """Find any MP_REGISTER_MODULE definitions in the provided file.
Andrew Leechcf22f472019-02-18 14:58:44 +110020
Damien George47f63432022-05-31 17:10:14 +100021 :param str filename: path to file to check
Damien Georgeefe23ac2022-05-31 22:56:11 +100022 :return: List[(module_name, obj_module)]
Andrew Leechcf22f472019-02-18 14:58:44 +110023 """
24 global pattern
25
Damien George47f63432022-05-31 17:10:14 +100026 with io.open(filename, encoding="utf-8") as c_file_obj:
Andrew Leechcf22f472019-02-18 14:58:44 +110027 return set(re.findall(pattern, c_file_obj.read()))
28
29
30def generate_module_table_header(modules):
Damien George06659072020-08-29 15:14:29 +100031 """Generate header with module table entries for builtin modules.
Andrew Leechcf22f472019-02-18 14:58:44 +110032
Damien Georgeefe23ac2022-05-31 22:56:11 +100033 :param List[(module_name, obj_module)] modules: module defs
Andrew Leechcf22f472019-02-18 14:58:44 +110034 :return: None
35 """
36
37 # Print header file for all external modules.
Jim Mussared46945012022-04-20 16:05:44 +100038 mod_defs = set()
Andrew Leechcf22f472019-02-18 14:58:44 +110039 print("// Automatically generated by makemoduledefs.py.\n")
Damien Georgeefe23ac2022-05-31 22:56:11 +100040 for module_name, obj_module in modules:
Andrew Leechcf22f472019-02-18 14:58:44 +110041 mod_def = "MODULE_DEF_{}".format(module_name.upper())
Jim Mussared46945012022-04-20 16:05:44 +100042 mod_defs.add(mod_def)
Damien George69661f32020-02-27 15:36:53 +110043 print(
44 (
Damien Georgeefe23ac2022-05-31 22:56:11 +100045 "extern const struct _mp_obj_module_t {obj_module};\n"
46 "#undef {mod_def}\n"
47 "#define {mod_def} {{ MP_ROM_QSTR({module_name}), MP_ROM_PTR(&{obj_module}) }},\n"
Damien George69661f32020-02-27 15:36:53 +110048 ).format(
49 module_name=module_name,
50 obj_module=obj_module,
Damien George69661f32020-02-27 15:36:53 +110051 mod_def=mod_def,
52 )
Andrew Leechcf22f472019-02-18 14:58:44 +110053 )
54
55 print("\n#define MICROPY_REGISTERED_MODULES \\")
56
Jim Mussared46945012022-04-20 16:05:44 +100057 for mod_def in sorted(mod_defs):
Andrew Leechcf22f472019-02-18 14:58:44 +110058 print(" {mod_def} \\".format(mod_def=mod_def))
59
60 print("// MICROPY_REGISTERED_MODULES")
61
62
63def main():
64 parser = argparse.ArgumentParser()
Damien George47f63432022-05-31 17:10:14 +100065 parser.add_argument("file", nargs=1, help="file with MP_REGISTER_MODULE definitions")
Andrew Leechcf22f472019-02-18 14:58:44 +110066 args = parser.parse_args()
67
Damien George47f63432022-05-31 17:10:14 +100068 modules = find_module_registrations(args.file[0])
Andrew Leechcf22f472019-02-18 14:58:44 +110069 generate_module_table_header(sorted(modules))
70
71
Damien George69661f32020-02-27 15:36:53 +110072if __name__ == "__main__":
Andrew Leechcf22f472019-02-18 14:58:44 +110073 main()