bindings/python/ns3modulegen.py
author Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
Wed, 15 Oct 2008 15:55:09 +0100
changeset 3753 a84a48233eb3
parent 3648 f912b24ddf2d
child 3916 a1e72a0595a6
permissions -rwxr-xr-x
A more pythonic wrapper for ns3.TypeId.LookupByNameFailSafe
     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     ns3modulegen_core_customizations.TypeId_customizations(root_module)
    89 
    90 
    91     for local_module in LOCAL_MODULES:
    92         mod = __import__(local_module)
    93         mod.register_types(root_module)
    94 
    95     ns3modulegen_core_customizations.generate_callback_classes(root_module.after_forward_declarations,
    96                                                                callbacks_list.callback_classes)
    97 
    98 
    99     register_methods(root_module)
   100 
   101     for local_module in LOCAL_MODULES:
   102         mod = __import__(local_module)
   103         mod.register_methods(root_module)
   104 
   105     ns3modulegen_core_customizations.Object_customizations(root_module)
   106     ns3modulegen_core_customizations.Attribute_customizations(root_module)
   107 
   108     register_functions(root_module)
   109 
   110     for local_module in LOCAL_MODULES:
   111         mod = __import__(local_module)
   112         mod.register_functions(root_module)
   113 
   114     enabled_features = os.environ['NS3_ENABLED_FEATURES'].split(',')
   115 
   116     # if GtkConfigStore support is disabled, disable the class wrapper
   117     if 'GtkConfigStore' not in enabled_features:
   118         try:
   119             root_module.classes.remove(root_module['ns3::GtkConfigStore'])
   120         except KeyError:
   121             pass
   122 
   123     # if no sqlite, the class SqliteDataOutput is disabled
   124     if 'SqliteDataOutput' not in enabled_features:
   125         try:
   126             root_module.classes.remove(root_module['ns3::SqliteDataOutput'])
   127         except KeyError:
   128             pass
   129 
   130     if 'Threading' not in enabled_features:
   131         for clsname in ['SystemThread', 'SystemMutex', 'SystemCondition', 'CriticalSection']:
   132             root_module.classes.remove(root_module['ns3::%s' % clsname])
   133 
   134     if 'RealTime' not in enabled_features:
   135         for clsname in ['WallClockSynchronizer', 'RealtimeSimulatorImpl', 'RealtimeEventLock']:
   136             root_module.classes.remove(root_module['ns3::%s' % clsname])
   137         root_module.enums.remove(root_module['ns3::RealtimeSimulatorImpl::SynchronizationMode'])
   138 
   139     root_module.generate(out, '_ns3')
   140 
   141     out.close()
   142 
   143 if __name__ == '__main__':
   144     main()
   145