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()