bindings/python/ns3modulegen.py
author Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
Sat, 23 Aug 2008 22:35:10 +0100
changeset 3546 cecda7126440
parent 3538 99f49426595a
child 3575 1f5d9b97a1a2
permissions -rw-r--r--
New PyBindGen, fixes python wrapper identity issue.
     1 
     2 LOCAL_MODULES = [
     3     #'my_extra_api_definitions',
     4     ]
     5 
     6 
     7 
     8 import sys
     9 import os
    10 
    11 from pybindgen import FileCodeSink, write_preamble
    12 from pybindgen.module import MultiSectionFactory
    13 import pybindgen.settings
    14 
    15 from ns3modulegen_generated import module_init, register_types, register_methods, register_functions
    16 import ns3modulegen_core_customizations
    17 import callbacks_list
    18 
    19 this_script_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
    20 
    21 class ErrorHandler(pybindgen.settings.ErrorHandler):
    22     def handle_error(self, wrapper, exception, traceback_):
    23         try:
    24             stack = wrapper.stack_where_defined
    25         except AttributeError:
    26             print >> sys.stderr, "??:??: %s / %r" % (wrapper, exception)
    27         else:
    28             stack = list(stack)
    29             stack.reverse()
    30             for (filename, line_number, function_name, text) in stack:
    31                 file_dir = os.path.dirname(os.path.abspath(filename))
    32                 if file_dir == this_script_dir:
    33                     print >> sys.stderr, "%s:%i: %r" % (os.path.join("..", "bindings", "python", os.path.basename(filename)),
    34                                                         line_number, exception)
    35                     break
    36         return True
    37 pybindgen.settings.error_handler = ErrorHandler()
    38 
    39 pybindgen.settings.wrapper_registry = pybindgen.settings.StdMapWrapperRegistry
    40 
    41 
    42 class MyMultiSectionFactory(MultiSectionFactory):
    43 
    44     def __init__(self, main_file_name, modules):
    45         super(MyMultiSectionFactory, self).__init__()
    46         self.main_file_name = main_file_name
    47         self.main_sink = FileCodeSink(open(main_file_name, "wt"))
    48         self.header_name = "ns3module.h"
    49         header_file_name = os.path.join(os.path.dirname(self.main_file_name), self.header_name)
    50         self.header_sink = FileCodeSink(open(header_file_name, "wt"))
    51         self.section_sinks = {'__main__': self.main_sink}
    52 
    53         for module in modules:
    54             section_name = 'ns3_module_%s' % module.replace('-', '_')
    55             file_name = os.path.join(os.path.dirname(self.main_file_name), "%s.cc" % section_name)
    56             sink = FileCodeSink(open(file_name, "wt"))
    57             self.section_sinks[section_name] = sink            
    58 
    59     def get_section_code_sink(self, section_name):
    60         return self.section_sinks[section_name]
    61 
    62     def get_main_code_sink(self):
    63         return self.main_sink
    64 
    65     def get_common_header_code_sink(self):
    66         return self.header_sink
    67 
    68     def get_common_header_include(self):
    69         return '"%s"' % self.header_name
    70 
    71     def close(self):
    72         self.header_sink.file.close()
    73         self.main_sink.file.close()
    74         for sink in self.section_sinks.itervalues():
    75             sink.file.close()
    76 
    77 
    78 
    79 def main():
    80     out = MyMultiSectionFactory(sys.argv[1], sys.argv[2:])
    81     root_module = module_init()
    82     root_module.add_include('"everything.h"')
    83 
    84     register_types(root_module)
    85 
    86     ns3modulegen_core_customizations.Simulator_customizations(root_module)
    87     ns3modulegen_core_customizations.CommandLine_customizations(root_module)
    88 
    89 
    90     for local_module in LOCAL_MODULES:
    91         mod = __import__(local_module)
    92         mod.register_types(root_module)
    93 
    94     ns3modulegen_core_customizations.generate_callback_classes(root_module.after_forward_declarations,
    95                                                                callbacks_list.callback_classes)
    96 
    97 
    98     register_methods(root_module)
    99 
   100     for local_module in LOCAL_MODULES:
   101         mod = __import__(local_module)
   102         mod.register_methods(root_module)
   103 
   104     ns3modulegen_core_customizations.Object_customizations(root_module)
   105     ns3modulegen_core_customizations.Attribute_customizations(root_module)
   106 
   107     register_functions(root_module)
   108 
   109     for local_module in LOCAL_MODULES:
   110         mod = __import__(local_module)
   111         mod.register_functions(root_module)
   112 
   113 
   114     # if GtkConfigStore support is disabled, disable the class wrapper
   115     if 'DISABLE_GTK_CONFIG_STORE' in os.environ:
   116         root_module.classes.remove(root_module['ns3::GtkConfigStore'])
   117 
   118     root_module.generate(out, '_ns3')
   119 
   120     out.close()
   121 
   122 if __name__ == '__main__':
   123     main()
   124