blob: 5a1362a4c9897b0e3a0c825f1da1ac79447e7ed5 [file] [log] [blame]
Damien Georgec7271a82022-06-08 14:47:21 +10001"""
2This pre-processor parses a single file containing a list of
Jim Mussared24c02c42023-06-02 12:28:07 +10003`MP_REGISTER_MODULE(MP_QSTR_module_name, obj_module)` or
4`MP_REGISTER_EXTENSIBLE_MODULE(MP_QSTR_module_name, obj_module)`
5(i.e. the output of `py/makeqstrdefs.py cat module`).
6
7The output is a header (typically moduledefs.h) which is included by
8py/objmodule.c that contains entries to be included in the definition of
9 - mp_rom_map_elem_t mp_builtin_module_table[]
10 - mp_rom_map_elem_t mp_builtin_extensible_module_table[]
11
12Extensible modules are modules that can be overridden from the filesystem, see
13py/builtinimnport.c:process_import_at_level. Regular modules will always use
14the built-in version.
Damien Georgec7271a82022-06-08 14:47:21 +100015"""
Andrew Leechcf22f472019-02-18 14:58:44 +110016
17from __future__ import print_function
18
Phil Howard37d51142022-06-14 11:17:03 +010019import sys
Andrew Leechcf22f472019-02-18 14:58:44 +110020import re
Damien George673e1542019-04-12 11:34:52 +100021import io
Andrew Leechcf22f472019-02-18 14:58:44 +110022import argparse
23
24
Jim Mussared13c817e2023-06-05 15:52:57 +100025register_pattern = re.compile(
Jim Mussared24c02c42023-06-02 12:28:07 +100026 r"\s*(MP_REGISTER_MODULE|MP_REGISTER_EXTENSIBLE_MODULE)\(MP_QSTR_(.*?),\s*(.*?)\);",
27 flags=re.DOTALL,
28)
Andrew Leechcf22f472019-02-18 14:58:44 +110029
Jim Mussared13c817e2023-06-05 15:52:57 +100030delegation_pattern = re.compile(
31 r"\s*(?:MP_REGISTER_MODULE_DELEGATION)\((.*?),\s*(.*?)\);",
32 flags=re.DOTALL,
33)
34
Andrew Leechcf22f472019-02-18 14:58:44 +110035
Damien George47f63432022-05-31 17:10:14 +100036def find_module_registrations(filename):
37 """Find any MP_REGISTER_MODULE definitions in the provided file.
Andrew Leechcf22f472019-02-18 14:58:44 +110038
Damien George47f63432022-05-31 17:10:14 +100039 :param str filename: path to file to check
Damien Georgeefe23ac2022-05-31 22:56:11 +100040 :return: List[(module_name, obj_module)]
Andrew Leechcf22f472019-02-18 14:58:44 +110041 """
42 global pattern
43
Damien George47f63432022-05-31 17:10:14 +100044 with io.open(filename, encoding="utf-8") as c_file_obj:
Jim Mussared13c817e2023-06-05 15:52:57 +100045 c = c_file_obj.read()
46 return set(re.findall(register_pattern, c)), set(re.findall(delegation_pattern, c))
Andrew Leechcf22f472019-02-18 14:58:44 +110047
48
49def generate_module_table_header(modules):
Damien George06659072020-08-29 15:14:29 +100050 """Generate header with module table entries for builtin modules.
Andrew Leechcf22f472019-02-18 14:58:44 +110051
Damien Georgeefe23ac2022-05-31 22:56:11 +100052 :param List[(module_name, obj_module)] modules: module defs
Andrew Leechcf22f472019-02-18 14:58:44 +110053 :return: None
54 """
55
56 # Print header file for all external modules.
Jim Mussared46945012022-04-20 16:05:44 +100057 mod_defs = set()
Jim Mussared24c02c42023-06-02 12:28:07 +100058 extensible_mod_defs = set()
Jim Mussared24c02c42023-06-02 12:28:07 +100059 for macro_name, module_name, obj_module in modules:
Andrew Leechcf22f472019-02-18 14:58:44 +110060 mod_def = "MODULE_DEF_{}".format(module_name.upper())
Jim Mussared24c02c42023-06-02 12:28:07 +100061 if macro_name == "MP_REGISTER_MODULE":
62 mod_defs.add(mod_def)
63 elif macro_name == "MP_REGISTER_EXTENSIBLE_MODULE":
64 extensible_mod_defs.add(mod_def)
Phil Howard37d51142022-06-14 11:17:03 +010065 if "," in obj_module:
66 print(
Jim Mussared24c02c42023-06-02 12:28:07 +100067 "ERROR: Call to {}({}, {}) should be {}({}, {})\n".format(
68 macro_name,
69 module_name,
70 obj_module,
71 macro_name,
72 module_name,
73 obj_module.split(",")[0],
Phil Howard37d51142022-06-14 11:17:03 +010074 ),
75 file=sys.stderr,
76 )
77 sys.exit(1)
Damien George69661f32020-02-27 15:36:53 +110078 print(
79 (
Damien Georgeefe23ac2022-05-31 22:56:11 +100080 "extern const struct _mp_obj_module_t {obj_module};\n"
81 "#undef {mod_def}\n"
Jim Mussared24c02c42023-06-02 12:28:07 +100082 "#define {mod_def} {{ MP_ROM_QSTR(MP_QSTR_{module_name}), MP_ROM_PTR(&{obj_module}) }},\n"
Damien George69661f32020-02-27 15:36:53 +110083 ).format(
84 module_name=module_name,
85 obj_module=obj_module,
Damien George69661f32020-02-27 15:36:53 +110086 mod_def=mod_def,
87 )
Andrew Leechcf22f472019-02-18 14:58:44 +110088 )
89
90 print("\n#define MICROPY_REGISTERED_MODULES \\")
91
Jim Mussared46945012022-04-20 16:05:44 +100092 for mod_def in sorted(mod_defs):
Andrew Leechcf22f472019-02-18 14:58:44 +110093 print(" {mod_def} \\".format(mod_def=mod_def))
94
95 print("// MICROPY_REGISTERED_MODULES")
96
Jim Mussared24c02c42023-06-02 12:28:07 +100097 print("\n#define MICROPY_REGISTERED_EXTENSIBLE_MODULES \\")
98
99 for mod_def in sorted(extensible_mod_defs):
100 print(" {mod_def} \\".format(mod_def=mod_def))
101
102 print("// MICROPY_REGISTERED_EXTENSIBLE_MODULES")
103
Andrew Leechcf22f472019-02-18 14:58:44 +1100104
Jim Mussared13c817e2023-06-05 15:52:57 +1000105def generate_module_delegations(delegations):
106 print("\n#define MICROPY_MODULE_DELEGATIONS \\")
107 for obj_module, fun_name in delegations:
108 print(
109 " {{ MP_ROM_PTR(&{obj_module}), {fun_name} }},".format(
110 obj_module=obj_module, fun_name=fun_name
111 )
112 )
113 print("// MICROPY_MODULE_DELEGATIONS")
114
115
Andrew Leechcf22f472019-02-18 14:58:44 +1100116def main():
117 parser = argparse.ArgumentParser()
Damien George47f63432022-05-31 17:10:14 +1000118 parser.add_argument("file", nargs=1, help="file with MP_REGISTER_MODULE definitions")
Andrew Leechcf22f472019-02-18 14:58:44 +1100119 args = parser.parse_args()
120
Jim Mussared13c817e2023-06-05 15:52:57 +1000121 print("// Automatically generated by makemoduledefs.py.\n")
122
123 modules, delegations = find_module_registrations(args.file[0])
Andrew Leechcf22f472019-02-18 14:58:44 +1100124 generate_module_table_header(sorted(modules))
Jim Mussared13c817e2023-06-05 15:52:57 +1000125 generate_module_delegations(sorted(delegations))
Andrew Leechcf22f472019-02-18 14:58:44 +1100126
127
Damien George69661f32020-02-27 15:36:53 +1100128if __name__ == "__main__":
Andrew Leechcf22f472019-02-18 14:58:44 +1100129 main()