code: def generate_module_table_header(modules):
      
  
      # Print header file for all external modules.
      mod_defs = []
      print("// Automatically generated by makemoduledefs.py.\n")
      for module_name, obj_module, enabled_define in modules:
          mod_def = "MODULE_DEF_{}".format(module_name.upper())
          mod_defs.append(mod_def)
          print((
              "#if ({enabled_define})\n"
              "    extern const struct _mp_obj_module_t {obj_module};\n"
              "    #define {mod_def} {{ MP_ROM_QSTR({module_name}), MP_ROM_PTR(&{obj_module}) }},\n"
              "#else\n"
              "    #define {mod_def}\n"
              "#endif\n"
              ).format(module_name=module_name, obj_module=obj_module,
                       enabled_define=enabled_define, mod_def=mod_def)
          )
  
      print("\n#define MICROPY_REGISTERED_MODULES \\")
  
      for mod_def in mod_defs:
          print("    {mod_def} \\".format(mod_def=mod_def))
  
      print("// MICROPY_REGISTERED_MODULES")
docs: Generate header with module table entries for builtin modules.
  
      :param List[(module_name, obj_module, enabled_define)] modules: module defs
      :return: None