3 #'my_extra_api_definitions',
11 from pybindgen import FileCodeSink, write_preamble
12 from pybindgen.module import MultiSectionFactory
13 import pybindgen.settings
15 from ns3modulegen_generated import module_init, register_types, register_methods, register_functions
16 import ns3modulegen_core_customizations
19 this_script_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
21 class ErrorHandler(pybindgen.settings.ErrorHandler):
22 def handle_error(self, wrapper, exception, traceback_):
24 stack = wrapper.stack_where_defined
25 except AttributeError:
26 print >> sys.stderr, "??:??: %s / %r" % (wrapper, exception)
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)
37 pybindgen.settings.error_handler = ErrorHandler()
39 pybindgen.settings.wrapper_registry = pybindgen.settings.StdMapWrapperRegistry
42 class MyMultiSectionFactory(MultiSectionFactory):
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}
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
59 def get_section_code_sink(self, section_name):
60 return self.section_sinks[section_name]
62 def get_main_code_sink(self):
65 def get_common_header_code_sink(self):
66 return self.header_sink
68 def get_common_header_include(self):
69 return '"%s"' % self.header_name
72 self.header_sink.file.close()
73 self.main_sink.file.close()
74 for sink in self.section_sinks.itervalues():
80 out = MyMultiSectionFactory(sys.argv[1], sys.argv[2:])
81 root_module = module_init()
82 root_module.add_include('"everything.h"')
84 register_types(root_module)
86 ns3modulegen_core_customizations.Simulator_customizations(root_module)
87 ns3modulegen_core_customizations.CommandLine_customizations(root_module)
88 ns3modulegen_core_customizations.TypeId_customizations(root_module)
91 for local_module in LOCAL_MODULES:
92 mod = __import__(local_module)
93 mod.register_types(root_module)
95 ns3modulegen_core_customizations.generate_callback_classes(root_module.after_forward_declarations,
96 callbacks_list.callback_classes)
99 register_methods(root_module)
101 for local_module in LOCAL_MODULES:
102 mod = __import__(local_module)
103 mod.register_methods(root_module)
105 ns3modulegen_core_customizations.Object_customizations(root_module)
106 ns3modulegen_core_customizations.Attribute_customizations(root_module)
108 register_functions(root_module)
110 for local_module in LOCAL_MODULES:
111 mod = __import__(local_module)
112 mod.register_functions(root_module)
114 enabled_features = os.environ['NS3_ENABLED_FEATURES'].split(',')
116 # if GtkConfigStore support is disabled, disable the class wrapper
117 if 'GtkConfigStore' not in enabled_features:
119 root_module.classes.remove(root_module['ns3::GtkConfigStore'])
123 # if no sqlite, the class SqliteDataOutput is disabled
124 if 'SqliteDataOutput' not in enabled_features:
126 root_module.classes.remove(root_module['ns3::SqliteDataOutput'])
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])
135 if 'EmuNetDevice' not in enabled_features:
136 for clsname in ['EmuNetDevice', 'EmuHelper']:
137 root_module.classes.remove(root_module['ns3::%s' % clsname])
139 if 'RealTime' not in enabled_features:
140 for clsname in ['WallClockSynchronizer', 'RealtimeSimulatorImpl']:
141 root_module.classes.remove(root_module['ns3::%s' % clsname])
142 root_module.enums.remove(root_module['ns3::RealtimeSimulatorImpl::SynchronizationMode'])
144 root_module.generate(out, '_ns3')
148 if __name__ == '__main__':
151 import cProfile as profile
155 print >> sys.stderr, "** running under profiler"
156 profile.run('main()', 'ns3modulegen.pstat')