blob: 29162ab387c8be162303fed5015282f3e020b580 [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):
Jim Mussarede6926d62023-06-06 22:49:50 +1000106 if not delegations:
107 return
108
Damien George5ce1a032023-06-12 13:09:48 +1000109 print()
110 for obj_module, fun_name in delegations:
111 print("extern void {}(mp_obj_t self_in, qstr attr, mp_obj_t *dest);".format(fun_name))
112 print("#define MICROPY_MODULE_DELEGATIONS \\")
Jim Mussared13c817e2023-06-05 15:52:57 +1000113 for obj_module, fun_name in delegations:
114 print(
Damien George44295c92023-06-12 13:09:29 +1000115 " {{ MP_ROM_PTR(&{obj_module}), {fun_name} }}, \\".format(
Jim Mussared13c817e2023-06-05 15:52:57 +1000116 obj_module=obj_module, fun_name=fun_name
117 )
118 )
119 print("// MICROPY_MODULE_DELEGATIONS")
120
121
Andrew Leechcf22f472019-02-18 14:58:44 +1100122def main():
123 parser = argparse.ArgumentParser()
Damien George47f63432022-05-31 17:10:14 +1000124 parser.add_argument("file", nargs=1, help="file with MP_REGISTER_MODULE definitions")
Andrew Leechcf22f472019-02-18 14:58:44 +1100125 args = parser.parse_args()
126
Jim Mussared13c817e2023-06-05 15:52:57 +1000127 print("// Automatically generated by makemoduledefs.py.\n")
128
129 modules, delegations = find_module_registrations(args.file[0])
Andrew Leechcf22f472019-02-18 14:58:44 +1100130 generate_module_table_header(sorted(modules))
Jim Mussared13c817e2023-06-05 15:52:57 +1000131 generate_module_delegations(sorted(delegations))
Andrew Leechcf22f472019-02-18 14:58:44 +1100132
133
Damien George69661f32020-02-27 15:36:53 +1100134if __name__ == "__main__":
Andrew Leechcf22f472019-02-18 14:58:44 +1100135 main()