def main(): outputfilename = sys.argv[1] entry_modname = sys.argv[2] sys.path += [os.path.dirname(os.curdir)] entry_module = __import__(entry_modname) rootns = namespaces[''] # Generate C++ source with open('%s.cpp' % outputfilename, 'w') as cppfile: println = codegen.wrap_println_from_file(cppfile) populate_headers(println) # extra headers # print all includes for inc in rootns.aggregate_includes(): println('#include "%s"' % inc) println() # print all downcast downcast_fns = rootns.aggregate_downcast() for ((fromty, toty), fn) in downcast_fns: name = fn.name fmt = ''' static %(toty)s* %(name)s(%(fromty)s* arg) { return typecast< %(toty)s >::from(arg); } ''' println(fmt % locals()) fn.generate_cpp(println) println('static') println('PyMethodDef downcast_methodtable[] = {') fmt = '{ "%(name)s", (PyCFunction)%(func)s, METH_VARARGS, NULL },' for _, fn in downcast_fns: name = fn.name func = fn.c_name println(fmt % locals()) println('{ NULL }') println('};') println() # generate submodule rootns.generate_cpp(println, extras=[('extra', 'extra_methodtable'), ('downcast', 'downcast_methodtable')]) println(extension_entry % {'module' : '_api', 'ns' : ''}) # Generate Python source rootns.generate_py(rootdir='.', name='api')
def main(): outputfilename = sys.argv[1] entry_modname = sys.argv[2] sys.path += [os.path.dirname(os.curdir)] entry_module = __import__(entry_modname) rootns = namespaces[''] # Generate C++ source with open('%s.cpp' % outputfilename, 'w') as cppfile: println = codegen.wrap_println_from_file(cppfile) populate_headers(println) # extra headers # print all includes for inc in rootns.aggregate_includes(): println('#include "%s"' % inc) println() # print all downcast downcast_fns = rootns.aggregate_downcast() for ((fromty, toty), fn) in downcast_fns: name = fn.name fmt = ''' static %(toty)s* %(name)s(%(fromty)s* arg) { return typecast< %(toty)s >::from(arg); } ''' println(fmt % locals()) fn.generate_cpp(println) println('static') println('PyMethodDef downcast_methodtable[] = {') fmt = '{ "%(name)s", (PyCFunction)%(func)s, METH_VARARGS, NULL },' for _, fn in downcast_fns: name = fn.name func = fn.c_name println(fmt % locals()) println('{ NULL }') println('};') println() # generate submodule rootns.generate_cpp(println, extras=[('extra', 'extra_methodtable'), ('downcast', 'downcast_methodtable')]) println(extension_entry % {'module': '_api', 'ns': ''}) # Generate Python source rootns.generate_py(rootdir='.', name='api')
def generate_py(self, rootdir='.', name=''): name = name or self.localname if self.namespaces: # should make new directory path = os.path.join(rootdir, name) makedir(path) filepath = os.path.join(path, '__init__.py') else: filepath = os.path.join(rootdir, '%s.py' % name) with open(filepath, 'w') as pyfile: println = cg.wrap_println_from_file(pyfile) println('from llvmpy import _api, capsule') for ns in self.namespaces: println('from . import %s' % ns.localname) println() for unit in self.iter_all(): if not isinstance(unit, Namespace): writer = cg.PyCodeWriter(println) unit.compile_py(writer) for ns in self.namespaces: ns.generate_py(rootdir=path)
def main(): print("Running LLVM API generator") outputfilename = sys.argv[1] entry_modname = sys.argv[2] sys.path += [os.path.dirname(os.curdir)] entry_module = __import__(entry_modname) rootns = namespaces[''] # Check if files are modified outputfilepath = '%s.cpp' % outputfilename try: mtime = os.path.getmtime(outputfilepath) except OSError: mtime = 0 if entry_module.last_mtime <= mtime: # Check if file header matches with open(outputfilepath) as checkfile: n = len(FILE_HEADER) header = checkfile.read(n) if header == FILE_HEADER: print("up to date") return else: print("file is outdated") pass # Generate C++ source with open(outputfilepath, 'w') as cppfile: println = codegen.wrap_println_from_file(cppfile) println(FILE_HEADER) populate_headers(println) # extra headers # print all includes for inc in rootns.aggregate_includes(): println('#include "%s"' % inc) println() # print all downcast downcast_fns = rootns.aggregate_downcast() for ((fromty, toty), fn) in downcast_fns: name = fn.name fmt = ''' static %(toty)s* %(name)s(%(fromty)s* arg) { return typecast< %(toty)s >::from(arg); } ''' println(fmt % locals()) fn.generate_cpp(println) println('static') println('PyMethodDef downcast_methodtable[] = {') fmt = '{ "%(name)s", (PyCFunction)%(func)s, METH_VARARGS, NULL },' for _, fn in downcast_fns: name = fn.name func = fn.c_name println(fmt % locals()) println('{ NULL }') println('};') println() # generate submodule rootns.generate_cpp(println, extras=[('extra', 'extra_methodtable'), ('downcast', 'downcast_methodtable')]) println(extension_entry % {'module': '_api', 'ns': ''}) # Generate Python source rootns.generate_py(rootdir='.', name='api')