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