Source

cffi / cffi / ffiplatform.py

Full commit
Armin Rigo 0685657 
Armin Rigo 2eb031e 










Armin Rigo b8bff87 
Armin Rigo f348e98 
Armin Rigo 006f22f 
Armin Rigo f348e98 


Armin Rigo 006f22f 

Armin Rigo b8bff87 



Armin Rigo 1189d3c 
Armin Rigo b8bff87 








Armin Rigo 1189d3c 
Armin Rigo b8bff87 
Armin Rigo 006f22f 
Armin Rigo 69aa45b 

Armin Rigo b8bff87 


Armin Rigo 1189d3c 

Armin Rigo b8bff87 
Armin Rigo 69aa45b 


Amaury Forgeot d… 203dc42 
Armin Rigo d5897c6 
Armin Rigo b8bff87 



Armin Rigo f4f64f8 




import os


class VerificationError(Exception):
    """ An error raised when verification fails
    """

class VerificationMissing(Exception):
    """ An error raised when incomplete structures are passed into
    cdef, but no verification has been done
    """


def get_extension(srcfilename, modname, sources=(), **kwds):
    from distutils.core import Extension
    allsources = [srcfilename]
    allsources.extend(sources)
    return Extension(name=modname, sources=allsources, **kwds)

def compile(tmpdir, ext):
    """Compile a C extension module using distutils."""

    saved_environ = os.environ.copy()
    try:
        outputfilename = _build(tmpdir, ext)
        outputfilename = os.path.abspath(outputfilename)
    finally:
        # workaround for a distutils bugs where some env vars can
        # become longer and longer every time it is used
        for key, value in saved_environ.items():
            if os.environ.get(key) != value:
                os.environ[key] = value
    return outputfilename

def _build(tmpdir, ext):
    # XXX compact but horrible :-(
    from distutils.core import Distribution
    import distutils.errors
    #
    dist = Distribution({'ext_modules': [ext]})
    options = dist.get_option_dict('build_ext')
    options['force'] = ('ffiplatform', True)
    options['build_lib'] = ('ffiplatform', tmpdir)
    options['build_temp'] = ('ffiplatform', tmpdir)
    #
    try:
        dist.run_command('build_ext')
    except (distutils.errors.CompileError,
            distutils.errors.LinkError) as e:
        raise VerificationError('%s: %s' % (e.__class__.__name__, e))
    #
    cmd_obj = dist.get_command_obj('build_ext')
    [soname] = cmd_obj.get_outputs()
    return soname

try:
    from os.path import samefile
except ImportError:
    def samefile(f1, f2):
        return os.path.abspath(f1) == os.path.abspath(f2)