Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
ffiplatform.py114 linesDownload Raw Back to cffi
1import sys, os
2from .error import VerificationError
3
4
5LIST_OF_FILE_NAMES = ['sources', 'include_dirs', 'library_dirs',
6                      'extra_objects', 'depends']
7
8def get_extension(srcfilename, modname, sources=(), **kwds):
9    from cffi._shimmed_dist_utils import Extension
10    allsources = [srcfilename]
11    for src in sources:
12        allsources.append(os.path.normpath(src))
13    return Extension(name=modname, sources=allsources, **kwds)
14
15def compile(tmpdir, ext, compiler_verbose=0, debug=None):
16    """Compile a C extension module using distutils."""
17
18    saved_environ = os.environ.copy()
19    try:
20        outputfilename = _build(tmpdir, ext, compiler_verbose, debug)
21        outputfilename = os.path.abspath(outputfilename)
22    finally:
23        # workaround for a distutils bugs where some env vars can
24        # become longer and longer every time it is used
25        for key, value in saved_environ.items():
26            if os.environ.get(key) != value:
27                os.environ[key] = value
28    return outputfilename
29
30def _build(tmpdir, ext, compiler_verbose=0, debug=None):
31    # XXX compact but horrible :-(
32    from cffi._shimmed_dist_utils import Distribution, CompileError, LinkError, set_threshold, set_verbosity
33
34    dist = Distribution({'ext_modules': [ext]})
35    dist.parse_config_files()
36    options = dist.get_option_dict('build_ext')
37    if debug is None:
38        debug = sys.flags.debug
39    options['debug'] = ('ffiplatform', debug)
40    options['force'] = ('ffiplatform', True)
41    options['build_lib'] = ('ffiplatform', tmpdir)
42    options['build_temp'] = ('ffiplatform', tmpdir)
43    #
44    try:
45        old_level = set_threshold(0) or 0
46        try:
47            set_verbosity(compiler_verbose)
48            dist.run_command('build_ext')
49            cmd_obj = dist.get_command_obj('build_ext')
50            [soname] = cmd_obj.get_outputs()
51        finally:
52            set_threshold(old_level)
53    except (CompileError, LinkError) as e:
54        raise VerificationError('%s: %s' % (e.__class__.__name__, e))
55    #
56    return soname
57
58try:
59    from os.path import samefile
60except ImportError:
61    def samefile(f1, f2):
62        return os.path.abspath(f1) == os.path.abspath(f2)
63
64def maybe_relative_path(path):
65    if not os.path.isabs(path):
66        return path      # already relative
67    dir = path
68    names = []
69    while True:
70        prevdir = dir
71        dir, name = os.path.split(prevdir)
72        if dir == prevdir or not dir:
73            return path     # failed to make it relative
74        names.append(name)
75        try:
76            if samefile(dir, os.curdir):
77                names.reverse()
78                return os.path.join(*names)
79        except OSError:
80            pass
81
82# ____________________________________________________________
83
84try:
85    int_or_long = (int, long)
86    import cStringIO
87except NameError:
88    int_or_long = int      # Python 3
89    import io as cStringIO
90
91def _flatten(x, f):
92    if isinstance(x, str):
93        f.write('%ds%s' % (len(x), x))
94    elif isinstance(x, dict):
95        keys = sorted(x.keys())
96        f.write('%dd' % len(keys))
97        for key in keys:
98            _flatten(key, f)
99            _flatten(x[key], f)
100    elif isinstance(x, (list, tuple)):
101        f.write('%dl' % len(x))
102        for value in x:
103            _flatten(value, f)
104    elif isinstance(x, int_or_long):
105        f.write('%di' % (x,))
106    else:
107        raise TypeError(
108            "the keywords to verify() contains unsupported object %r" % (x,))
109
110def flatten(x):
111    f = cStringIO.StringIO()
112    _flatten(x, f)
113    return f.getvalue()
114 
codekingpro/portable-devtools · Team Ai