15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Cython Top Level 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import os, sys, re, codecs 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)if sys.version_info[:2] < (2, 4): 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sys.stderr.write("Sorry, Cython requires Python 2.4 or later\n") 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sys.exit(1) 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import Errors 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Do not import Parsing here, import it when needed, because Parsing imports 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Nodes, which globally needs debug command line options initialized to set a 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# conditional metaclass. These options are processed by CmdLine called from 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# main() in this file. 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# import Parsing 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import Version 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Scanning import PyrexScanner, FileSourceDescriptor 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Errors import PyrexError, CompileError, error, warning 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Symtab import ModuleScope 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Cython import Utils 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import Options 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)module_name_pattern = re.compile(r"[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)*$") 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)verbose = 0 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class CompilationData(object): 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # Bundles the information that is passed from transform to transform. 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # (For now, this is only) 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # While Context contains every pxd ever loaded, path information etc., 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # this only contains the data related to a single compilation pass 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # pyx ModuleNode Main code tree of this compilation. 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # pxds {string : ModuleNode} Trees for the pxds used in the pyx. 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # codewriter CCodeWriter Where to output final code. 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # options CompilationOptions 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # result CompilationResult 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pass 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class Context(object): 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # This class encapsulates the context needed for compiling 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # one or more Cython implementation files along with their 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # associated and imported declaration files. It includes 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # the root of the module import namespace and the list 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # of directories to search for include files. 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # modules {string : ModuleScope} 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # include_directories [string] 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # future_directives [object] 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # language_level int currently 2 or 3 for Python 2/3 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cython_scope = None 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def __init__(self, include_directories, compiler_directives, cpp=False, 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) language_level=2, options=None, create_testscope=True): 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # cython_scope is a hack, set to False by subclasses, in order to break 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # an infinite loop. 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # Better code organization would fix it. 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) import Builtin, CythonScope 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.modules = {"__builtin__" : Builtin.builtin_scope} 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.cython_scope = CythonScope.create_cython_scope(self) 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.modules["cython"] = self.cython_scope 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.include_directories = include_directories 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.future_directives = set() 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.compiler_directives = compiler_directives 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.cpp = cpp 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.options = options 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.pxds = {} # full name -> node tree 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) standard_include_path = os.path.abspath(os.path.normpath( 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) os.path.join(os.path.dirname(__file__), os.path.pardir, 'Includes'))) 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.include_directories = include_directories + [standard_include_path] 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.set_language_level(language_level) 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.gdb_debug_outputwriter = None 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def set_language_level(self, level): 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.language_level = level 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if level >= 3: 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) from Future import print_function, unicode_literals, absolute_import 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.future_directives.update([print_function, unicode_literals, absolute_import]) 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.modules['builtins'] = self.modules['__builtin__'] 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # pipeline creation functions can now be found in Pipeline.py 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def process_pxd(self, source_desc, scope, module_name): 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) import Pipeline 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if isinstance(source_desc, FileSourceDescriptor) and source_desc._file_type == 'pyx': 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) source = CompilationSource(source_desc, module_name, os.getcwd()) 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result_sink = create_default_resultobj(source, self.options) 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pipeline = Pipeline.create_pyx_as_pxd_pipeline(self, result_sink) 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result = Pipeline.run_pipeline(pipeline, source) 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) else: 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pipeline = Pipeline.create_pxd_pipeline(self, scope, module_name) 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result = Pipeline.run_pipeline(pipeline, source_desc) 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return result 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def nonfatal_error(self, exc): 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return Errors.report_error(exc) 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def find_module(self, module_name, 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) relative_to = None, pos = None, need_pxd = 1, check_module_name = True): 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # Finds and returns the module scope corresponding to 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # the given relative or absolute module name. If this 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # is the first time the module has been requested, finds 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # the corresponding .pxd file and process it. 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # If relative_to is not None, it must be a module scope, 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # and the module will first be searched for relative to 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # that module, provided its name is not a dotted name. 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) debug_find_module = 0 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if debug_find_module: 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) print("Context.find_module: module_name = %s, relative_to = %s, pos = %s, need_pxd = %s" % ( 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) module_name, relative_to, pos, need_pxd)) 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scope = None 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pxd_pathname = None 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if check_module_name and not module_name_pattern.match(module_name): 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if pos is None: 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pos = (module_name, 0, 0) 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) raise CompileError(pos, 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "'%s' is not a valid module name" % module_name) 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if "." not in module_name and relative_to: 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if debug_find_module: 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) print("...trying relative import") 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scope = relative_to.lookup_submodule(module_name) 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if not scope: 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) qualified_name = relative_to.qualify_name(module_name) 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pxd_pathname = self.find_pxd_file(qualified_name, pos) 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if pxd_pathname: 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scope = relative_to.find_submodule(module_name) 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if not scope: 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if debug_find_module: 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) print("...trying absolute import") 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scope = self 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for name in module_name.split("."): 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scope = scope.find_submodule(name) 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if debug_find_module: 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) print("...scope =", scope) 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if not scope.pxd_file_loaded: 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if debug_find_module: 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) print("...pxd not loaded") 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scope.pxd_file_loaded = 1 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if not pxd_pathname: 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if debug_find_module: 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) print("...looking for pxd file") 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pxd_pathname = self.find_pxd_file(module_name, pos) 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if debug_find_module: 1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) print("......found ", pxd_pathname) 1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if not pxd_pathname and need_pxd: 1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) package_pathname = self.search_include_directories(module_name, ".py", pos) 1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if package_pathname and package_pathname.endswith('__init__.py'): 1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pass 1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) else: 1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) error(pos, "'%s.pxd' not found" % module_name) 1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if pxd_pathname: 1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) try: 1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if debug_find_module: 1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) print("Context.find_module: Parsing %s" % pxd_pathname) 1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rel_path = module_name.replace('.', os.sep) + os.path.splitext(pxd_pathname)[1] 1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if not pxd_pathname.endswith(rel_path): 1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rel_path = pxd_pathname # safety measure to prevent printing incorrect paths 1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) source_desc = FileSourceDescriptor(pxd_pathname, rel_path) 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) err, result = self.process_pxd(source_desc, scope, module_name) 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if err: 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) raise err 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) (pxd_codenodes, pxd_scope) = result 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.pxds[module_name] = (pxd_codenodes, pxd_scope) 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) except CompileError: 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pass 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return scope 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def find_pxd_file(self, qualified_name, pos): 1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # Search include path for the .pxd file corresponding to the 1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # given fully-qualified module name. 1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # Will find either a dotted filename or a file in a 1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # package directory. If a source file position is given, 1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # the directory containing the source file is searched first 1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # for a dotted filename, and its containing package root 1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # directory is searched first for a non-dotted filename. 1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pxd = self.search_include_directories(qualified_name, ".pxd", pos, sys_path=True) 1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if pxd is None: # XXX Keep this until Includes/Deprecated is removed 1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (qualified_name.startswith('python') or 1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) qualified_name in ('stdlib', 'stdio', 'stl')): 1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) standard_include_path = os.path.abspath(os.path.normpath( 1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) os.path.join(os.path.dirname(__file__), os.path.pardir, 'Includes'))) 1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) deprecated_include_path = os.path.join(standard_include_path, 'Deprecated') 1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.include_directories.append(deprecated_include_path) 1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) try: 1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pxd = self.search_include_directories(qualified_name, ".pxd", pos) 1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) finally: 1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.include_directories.pop() 1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if pxd: 1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) name = qualified_name 1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if name.startswith('python'): 1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) warning(pos, "'%s' is deprecated, use 'cpython'" % name, 1) 2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) elif name in ('stdlib', 'stdio'): 2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) warning(pos, "'%s' is deprecated, use 'libc.%s'" % (name, name), 1) 2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) elif name in ('stl'): 2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) warning(pos, "'%s' is deprecated, use 'libcpp.*.*'" % name, 1) 2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if pxd is None and Options.cimport_from_pyx: 2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return self.find_pyx_file(qualified_name, pos) 2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return pxd 2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def find_pyx_file(self, qualified_name, pos): 2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # Search include path for the .pyx file corresponding to the 2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # given fully-qualified module name, as for find_pxd_file(). 2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return self.search_include_directories(qualified_name, ".pyx", pos) 2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def find_include_file(self, filename, pos): 2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # Search list of include directories for filename. 2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # Reports an error and returns None if not found. 2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) path = self.search_include_directories(filename, "", pos, 2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) include=True) 2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if not path: 2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) error(pos, "'%s' not found" % filename) 2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return path 2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def search_include_directories(self, qualified_name, suffix, pos, 2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) include=False, sys_path=False): 2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return Utils.search_include_directories( 2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) tuple(self.include_directories), qualified_name, suffix, pos, include, sys_path) 2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def find_root_package_dir(self, file_path): 2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return Utils.find_root_package_dir(file_path) 2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def check_package_dir(self, dir, package_names): 2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return Utils.check_package_dir(dir, tuple(package_names)) 2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def c_file_out_of_date(self, source_path): 2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) c_path = Utils.replace_suffix(source_path, ".c") 2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if not os.path.exists(c_path): 2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return 1 2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) c_time = Utils.modification_time(c_path) 2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if Utils.file_newer_than(source_path, c_time): 2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return 1 2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pos = [source_path] 2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pxd_path = Utils.replace_suffix(source_path, ".pxd") 2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if os.path.exists(pxd_path) and Utils.file_newer_than(pxd_path, c_time): 2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return 1 2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for kind, name in self.read_dependency_file(source_path): 2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if kind == "cimport": 2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) dep_path = self.find_pxd_file(name, pos) 2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) elif kind == "include": 2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) dep_path = self.search_include_directories(name, pos) 2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) else: 2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) continue 2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if dep_path and Utils.file_newer_than(dep_path, c_time): 2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return 1 2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return 0 2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def find_cimported_module_names(self, source_path): 2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return [ name for kind, name in self.read_dependency_file(source_path) 2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if kind == "cimport" ] 2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def is_package_dir(self, dir_path): 2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return Utils.is_package_dir(dir_path) 2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def read_dependency_file(self, source_path): 2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) dep_path = Utils.replace_suffix(source_path, ".dep") 2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if os.path.exists(dep_path): 2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) f = open(dep_path, "rU") 2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) chunks = [ line.strip().split(" ", 1) 2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for line in f.readlines() 2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if " " in line.strip() ] 2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) f.close() 2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return chunks 2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) else: 2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return () 2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def lookup_submodule(self, name): 2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # Look up a top-level module. Returns None if not found. 2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return self.modules.get(name, None) 2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def find_submodule(self, name): 2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # Find a top-level module, creating a new one if needed. 2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scope = self.lookup_submodule(name) 2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if not scope: 2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scope = ModuleScope(name, 2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parent_module = None, context = self) 2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.modules[name] = scope 2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return scope 2865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def parse(self, source_desc, scope, pxd, full_module_name): 2885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if not isinstance(source_desc, FileSourceDescriptor): 2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) raise RuntimeError("Only file sources for code supported") 2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) source_filename = source_desc.filename 2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scope.cpp = self.cpp 2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # Parse the given source file and return a parse tree. 2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) num_errors = Errors.num_errors 2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) try: 2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) f = Utils.open_source_file(source_filename, "rU") 2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) try: 2975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) import Parsing 2985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) s = PyrexScanner(f, source_desc, source_encoding = f.encoding, 2995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scope = scope, context = self) 3005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) tree = Parsing.p_module(s, pxd, full_module_name) 3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) finally: 3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) f.close() 3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) except UnicodeDecodeError, e: 3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) #import traceback 3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) #traceback.print_exc() 3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) line = 1 3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) column = 0 3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) msg = e.args[-1] 3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) position = e.args[2] 3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) encoding = e.args[0] 3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) f = open(source_filename, "rb") 3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) try: 3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) byte_data = f.read() 3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) finally: 3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) f.close() 3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # FIXME: make this at least a little less inefficient 3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for idx, c in enumerate(byte_data): 3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if c in (ord('\n'), '\n'): 3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) line += 1 3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) column = 0 3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if idx == position: 3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) break 3255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) column += 1 3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) error((source_desc, line, column), 3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "Decoding error, missing or incorrect coding=<encoding-name> " 3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "at top of source (cannot decode with encoding %r: %s)" % (encoding, msg)) 3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if Errors.num_errors > num_errors: 3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) raise CompileError() 3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return tree 3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def extract_module_name(self, path, options): 3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # Find fully_qualified module name from the full pathname 3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # of a source file. 3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) dir, filename = os.path.split(path) 3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) module_name, _ = os.path.splitext(filename) 3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if "." in module_name: 3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return module_name 3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) names = [module_name] 3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) while self.is_package_dir(dir): 3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parent, package_name = os.path.split(dir) 3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if parent == dir: 3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) break 3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) names.append(package_name) 3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) dir = parent 3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) names.reverse() 3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return ".".join(names) 3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def setup_errors(self, options, result): 3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Errors.reset() # clear any remaining error state 3555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if options.use_listing_file: 3565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result.listing_file = Utils.replace_suffix(source, ".lis") 3575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) path = result.listing_file 3585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) else: 3595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) path = None 3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Errors.open_listing_file(path=path, 3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) echo_to_stderr=options.errors_to_stderr) 3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def teardown_errors(self, err, options, result): 3645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) source_desc = result.compilation_source.source_desc 3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if not isinstance(source_desc, FileSourceDescriptor): 3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) raise RuntimeError("Only file sources for code supported") 3675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Errors.close_listing_file() 3685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result.num_errors = Errors.num_errors 3695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if result.num_errors > 0: 3705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) err = True 3715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if err and result.c_file: 3725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) try: 3735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Utils.castrate_file(result.c_file, os.stat(source_desc.filename)) 3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) except EnvironmentError: 3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pass 3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result.c_file = None 3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def create_default_resultobj(compilation_source, options): 3795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result = CompilationResult() 3805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result.main_source_file = compilation_source.source_desc.filename 3815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result.compilation_source = compilation_source 3825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) source_desc = compilation_source.source_desc 3835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if options.output_file: 3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result.c_file = os.path.join(compilation_source.cwd, options.output_file) 3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) else: 3865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if options.cplus: 3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) c_suffix = ".cpp" 3885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) else: 3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) c_suffix = ".c" 3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result.c_file = Utils.replace_suffix(source_desc.filename, c_suffix) 3915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return result 3925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def run_pipeline(source, options, full_module_name=None, context=None): 3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) import Pipeline 3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) source_ext = os.path.splitext(source)[1] 3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) options.configure_language_defaults(source_ext[1:]) # py/pyx 3985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if context is None: 3995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) context = options.create_context() 4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # Set up source object 4025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cwd = os.getcwd() 4035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) abs_path = os.path.abspath(source) 4045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) full_module_name = full_module_name or context.extract_module_name(source, options) 4055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if options.relative_path_in_code_position_comments: 4075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rel_path = full_module_name.replace('.', os.sep) + source_ext 4085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if not abs_path.endswith(rel_path): 4095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rel_path = source # safety measure to prevent printing incorrect paths 4105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) else: 4115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rel_path = abs_path 4125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) source_desc = FileSourceDescriptor(abs_path, rel_path) 4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) source = CompilationSource(source_desc, full_module_name, cwd) 4145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # Set up result object 4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result = create_default_resultobj(source, options) 4175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if options.annotate is None: 4195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # By default, decide based on whether an html file already exists. 4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) html_filename = os.path.splitext(result.c_file)[0] + ".html" 4215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if os.path.exists(html_filename): 4225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) line = codecs.open(html_filename, "r", encoding="UTF-8").readline() 4235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if line.startswith(u'<!-- Generated by Cython'): 4245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) options.annotate = True 4255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # Get pipeline 4275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if source_ext.lower() == '.py' or not source_ext: 4285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pipeline = Pipeline.create_py_pipeline(context, options, result) 4295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) else: 4305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pipeline = Pipeline.create_pyx_pipeline(context, options, result) 4315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) context.setup_errors(options, result) 4335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) err, enddata = Pipeline.run_pipeline(pipeline, source) 4345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) context.teardown_errors(err, options, result) 4355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return result 4365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#------------------------------------------------------------------------ 4395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# 4405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Main Python entry points 4415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# 4425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#------------------------------------------------------------------------ 4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class CompilationSource(object): 4455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) """ 4465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Contains the data necesarry to start up a compilation pipeline for 4475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) a single compilation unit. 4485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) """ 4495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def __init__(self, source_desc, full_module_name, cwd): 4505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.source_desc = source_desc 4515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.full_module_name = full_module_name 4525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.cwd = cwd 4535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class CompilationOptions(object): 4555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) """ 4565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Options to the Cython compiler: 4575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) show_version boolean Display version number 4595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) use_listing_file boolean Generate a .lis file 4605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) errors_to_stderr boolean Echo errors to stderr when using .lis 4615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) include_path [string] Directories to search for include files 4625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) output_file string Name of generated .c file 4635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) generate_pxi boolean Generate .pxi file for public declarations 4645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) capi_reexport_cincludes 4655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) boolean Add cincluded headers to any auto-generated 4665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) header files. 4675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) timestamps boolean Only compile changed source files. 4685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) verbose boolean Always print source names being compiled 4695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) compiler_directives dict Overrides for pragma options (see Options.py) 4705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) evaluate_tree_assertions boolean Test support: evaluate parse tree assertions 4715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) language_level integer The Python language level: 2 or 3 4725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cplus boolean Compile as c++ code 4745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) """ 4755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def __init__(self, defaults = None, **kw): 4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.include_path = [] 4785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if defaults: 4795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if isinstance(defaults, CompilationOptions): 4805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) defaults = defaults.__dict__ 4815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) else: 4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) defaults = default_options 4835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) options = dict(defaults) 4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) options.update(kw) 4865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) directives = dict(options['compiler_directives']) # copy mutable field 4885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) options['compiler_directives'] = directives 4895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if 'language_level' in directives and 'language_level' not in kw: 4905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) options['language_level'] = int(directives['language_level']) 4915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if 'cache' in options: 4925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if options['cache'] is True: 4935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) options['cache'] = os.path.expanduser("~/.cycache") 4945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) elif options['cache'] in (False, None): 4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) del options['cache'] 4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.__dict__.update(options) 4985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def configure_language_defaults(self, source_extension): 5005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if source_extension == 'py': 5015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if self.compiler_directives.get('binding') is None: 5025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.compiler_directives['binding'] = True 5035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def create_context(self): 5055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return Context(self.include_path, self.compiler_directives, 5065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.cplus, self.language_level, options=self) 5075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class CompilationResult(object): 5105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) """ 5115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Results from the Cython compiler: 5125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) c_file string or None The generated C source file 5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) h_file string or None The generated C header file 5155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) i_file string or None The generated .pxi file 5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) api_file string or None The generated C API .h file 5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) listing_file string or None File of error messages 5185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) object_file string or None Result of compiling the C file 5195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extension_file string or None Result of linking the object file 5205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) num_errors integer Number of compilation errors 5215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) compilation_source CompilationSource 5225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) """ 5235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def __init__(self): 5255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.c_file = None 5265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.h_file = None 5275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.i_file = None 5285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.api_file = None 5295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.listing_file = None 5305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.object_file = None 5315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.extension_file = None 5325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.main_source_file = None 5335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class CompilationResultSet(dict): 5365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) """ 5375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Results from compiling multiple Pyrex source files. A mapping 5385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) from source file paths to CompilationResult instances. Also 5395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) has the following attributes: 5405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) num_errors integer Total number of compilation errors 5425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) """ 5435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) num_errors = 0 5455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) def add(self, source, result): 5475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self[source] = result 5485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) self.num_errors += result.num_errors 5495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def compile_single(source, options, full_module_name = None): 5525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) """ 5535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) compile_single(source, options, full_module_name) 5545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Compile the given Pyrex implementation file and return a CompilationResult. 5565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Always compiles a single file; does not perform timestamp checking or 5575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) recursion. 5585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) """ 5595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return run_pipeline(source, options, full_module_name) 5605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def compile_multiple(sources, options): 5635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) """ 5645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) compile_multiple(sources, options) 5655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Compiles the given sequence of Pyrex implementation files and returns 5675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) a CompilationResultSet. Performs timestamp checking and/or recursion 5685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if these are specified in the options. 5695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) """ 5705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # run_pipeline creates the context 5715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # context = options.create_context() 5725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sources = [os.path.abspath(source) for source in sources] 5735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) processed = set() 5745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results = CompilationResultSet() 5755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) timestamps = options.timestamps 5765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) verbose = options.verbose 5775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) context = None 5785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for source in sources: 5795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if source not in processed: 5805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if context is None: 5815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) context = options.create_context() 5825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if not timestamps or context.c_file_out_of_date(source): 5835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if verbose: 5845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sys.stderr.write("Compiling %s\n" % source) 5855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result = run_pipeline(source, options, context=context) 5875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) results.add(source, result) 5885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # Compiling multiple sources in one context doesn't quite 5895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) # work properly yet. 5905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) context = None 5915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) processed.add(source) 5925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return results 5935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def compile(source, options = None, full_module_name = None, **kwds): 5955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) """ 5965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) compile(source [, options], [, <option> = <value>]...) 5975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Compile one or more Pyrex implementation files, with optional timestamp 5995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) checking and recursing on dependecies. The source argument may be a string 6005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) or a sequence of strings If it is a string and no recursion or timestamp 6015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) checking is requested, a CompilationResult is returned, otherwise a 6025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CompilationResultSet is returned. 6035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) """ 6045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) options = CompilationOptions(defaults = options, **kwds) 6055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if isinstance(source, basestring) and not options.timestamps: 6065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return compile_single(source, options, full_module_name) 6075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) else: 6085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return compile_multiple(source, options) 6095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#------------------------------------------------------------------------ 6115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# 6125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Main command-line entry point 6135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# 6145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#------------------------------------------------------------------------ 6155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def setuptools_main(): 6165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return main(command_line = 1) 6175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def main(command_line = 0): 6195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) args = sys.argv[1:] 6205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) any_failures = 0 6215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if command_line: 6225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) from CmdLine import parse_command_line 6235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) options, sources = parse_command_line(args) 6245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) else: 6255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) options = CompilationOptions(default_options) 6265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sources = args 6275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if options.show_version: 6295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sys.stderr.write("Cython version %s\n" % Version.version) 6305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if options.working_path!="": 6315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) os.chdir(options.working_path) 6325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) try: 6335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result = compile(sources, options) 6345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if result.num_errors > 0: 6355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) any_failures = 1 6365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) except (EnvironmentError, PyrexError), e: 6375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sys.stderr.write(str(e) + '\n') 6385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) any_failures = 1 6395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if any_failures: 6405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sys.exit(1) 6415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#------------------------------------------------------------------------ 6455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# 6465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Set the default options depending on the platform 6475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# 6485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#------------------------------------------------------------------------ 6495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)default_options = dict( 6515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) show_version = 0, 6525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) use_listing_file = 0, 6535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) errors_to_stderr = 1, 6545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cplus = 0, 6555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) output_file = None, 6565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) annotate = None, 6575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) generate_pxi = 0, 6585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) capi_reexport_cincludes = 0, 6595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) working_path = "", 6605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) timestamps = None, 6615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) verbose = 0, 6625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) quiet = 0, 6635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) compiler_directives = {}, 6645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) evaluate_tree_assertions = False, 6655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) emit_linenums = False, 6665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) relative_path_in_code_position_comments = True, 6675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) c_line_in_traceback = True, 6685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) language_level = 2, 6695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gdb_debug = False, 6705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) compile_time_env = None, 6715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) common_utility_include_dir = None, 6725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)) 673