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