ambuild2/util.py
author David Anderson <dvander@alliedmods.net>
Sun Sep 29 02:10:49 2013 -0700 (2013-09-29)
changeset 75 7119ae4a5419
parent 68 f6119b15c6aa
child 90 1fd8ec354d47
permissions -rw-r--r--
Add a new IPC layer; implement it for Linux using epoll().
danderson@56
     1
# vim: set sts=2 ts=8 sw=2 tw=99 et: 
dvander@75
     2
import errno
dvander@75
     3
import os, sys
danderson@56
     4
import subprocess
danderson@56
     5
import multiprocessing
dvander@67
     6
try:
dvander@67
     7
  import __builtin__ as builtins
dvander@67
     8
except:
dvander@67
     9
  import builtins
dvander@67
    10
try:
dvander@67
    11
  import cPickle as pickle
dvander@67
    12
except:
dvander@67
    13
  import pickle
danderson@56
    14
danderson@56
    15
def Platform():
danderson@56
    16
  if IsWindows():
danderson@56
    17
    return 'windows'
danderson@56
    18
  if IsMac():
danderson@56
    19
    return 'mac'
dvander@75
    20
  if IsLinux():
danderson@56
    21
    return 'linux'
dvander@75
    22
  if IsFreeBSD():
dvander@75
    23
    return 'freebsd'
dvander@75
    24
  if IsOpenBSD():
dvander@75
    25
    return 'openbsd'
dvander@75
    26
  if IsNetBSD():
dvander@75
    27
    return 'netbsd'
dvander@75
    28
  if IsSolaris():
dvander@75
    29
    return 'solaris'
danderson@56
    30
  return 'unknown'
danderson@56
    31
dvander@75
    32
def IsLinux():
dvander@75
    33
  return sys.platform[0:5] == 'linux'
dvander@75
    34
dvander@75
    35
def IsFreeBSD():
dvander@75
    36
  return sys.platform[0:7] == 'freebsd'
dvander@75
    37
dvander@75
    38
def IsNetBSD():
dvander@75
    39
  return sys.platform[0:6] == 'netbsd'
dvander@75
    40
dvander@75
    41
def IsOpenBSD():
dvander@75
    42
  return sys.platform[0:7] == 'openbsd'
dvander@75
    43
danderson@56
    44
def IsWindows():
danderson@56
    45
  return sys.platform == 'win32' or sys.platform == 'cygwin'
danderson@56
    46
danderson@56
    47
def IsMac():
dvander@75
    48
  return sys.platform == 'darwin' or sys.platform[0:6] == 'Darwin'
dvander@75
    49
dvander@75
    50
def IsSolaris():
dvander@75
    51
  return sys.platform[0:5] == 'sunos'
danderson@56
    52
danderson@56
    53
def IsUnixy():
dvander@75
    54
  return not IsWindows()
dvander@75
    55
dvander@75
    56
def IsBSD():
dvander@75
    57
  return IsMac() or IsFreeBSD() or IsOpenBSD() or IsNetBSD()
danderson@56
    58
danderson@56
    59
def ExecutableSuffix():
danderson@56
    60
  if IsWindows():
danderson@56
    61
    return '.exe'
danderson@56
    62
  else:
danderson@56
    63
    return ''
danderson@56
    64
danderson@56
    65
def SharedLibSuffix():
danderson@56
    66
  if IsWindows():
danderson@56
    67
    return '.dll'
danderson@56
    68
  elif sys.platform == 'darwin':
danderson@56
    69
    return '.dylib'
danderson@56
    70
  else:
danderson@56
    71
    return '.so'
danderson@56
    72
danderson@56
    73
def StaticLibSuffix():
danderson@56
    74
  if IsUnixy():
danderson@56
    75
    return '.a'
danderson@56
    76
  return '.lib'
danderson@56
    77
danderson@56
    78
def StaticLibPrefix():
danderson@56
    79
  if IsWindows():
danderson@56
    80
    return ''
danderson@56
    81
  else:
danderson@56
    82
    return 'lib'
danderson@56
    83
danderson@56
    84
def WaitForProcess(process):
danderson@56
    85
  out, err = process.communicate()
danderson@56
    86
  process.stdoutText = out.decode()
danderson@56
    87
  process.stderrText = err.decode()
danderson@56
    88
  return process.returncode
danderson@56
    89
danderson@56
    90
def CreateProcess(argv, executable = None):
danderson@56
    91
  pargs = { 'args': argv }
danderson@56
    92
  pargs['stdout'] = subprocess.PIPE
danderson@56
    93
  pargs['stderr'] = subprocess.PIPE
danderson@56
    94
  if executable != None:
danderson@56
    95
    pargs['executable'] = executable
danderson@56
    96
  try:
danderson@56
    97
    process = subprocess.Popen(**pargs)
danderson@56
    98
  except:
danderson@56
    99
    return None
danderson@56
   100
  return process
danderson@56
   101
danderson@56
   102
def MakePath(*list):
danderson@56
   103
  path = os.path.join(*list)
danderson@56
   104
  if IsWindows():
danderson@56
   105
    path = path.replace('\\\\', '\\')
danderson@56
   106
  return path
danderson@56
   107
danderson@56
   108
def RemoveFolderAndContents(path):
danderson@56
   109
  for file in os.listdir(path):
danderson@56
   110
    subpath = os.path.join(path, file)
danderson@56
   111
    try:
danderson@56
   112
      if os.path.isfile(subpath) or os.path.islink(subpath):
danderson@56
   113
        os.unlink(subpath)
danderson@56
   114
      elif os.path.isdir(subpath):
danderson@56
   115
        RemoveFolderAndContents(subpath)
danderson@56
   116
    except:
danderson@56
   117
      pass
danderson@56
   118
  os.rmdir(path)
danderson@56
   119
danderson@56
   120
class FolderChanger:
danderson@56
   121
  def __init__(self, folder):
danderson@56
   122
    self.old = os.getcwd()
danderson@56
   123
    self.new = folder
danderson@56
   124
danderson@56
   125
  def __enter__(self):
danderson@56
   126
    os.chdir(self.new)
danderson@56
   127
danderson@56
   128
  def __exit__(self, type, value, traceback):
danderson@56
   129
    os.chdir(self.old)
danderson@56
   130
danderson@56
   131
class Guard:
danderson@56
   132
  def __init__(self, obj):
danderson@56
   133
    self.obj = obj
danderson@56
   134
danderson@56
   135
  def __enter__(self):
danderson@56
   136
    return self.obj
danderson@56
   137
danderson@56
   138
  def __exit__(self, type, value, traceback):
danderson@56
   139
    self.obj.close()
danderson@56
   140
dvander@61
   141
def Execute(argv):
dvander@61
   142
  p = subprocess.Popen(
dvander@61
   143
      args=argv,
dvander@61
   144
      stdout=subprocess.PIPE,
dvander@61
   145
      stderr=subprocess.PIPE,
dvander@61
   146
      shell=False
dvander@61
   147
  )
danderson@56
   148
  stdout, stderr = p.communicate()
dvander@61
   149
  out = stdout.decode()
dvander@61
   150
  err = stderr.decode()
danderson@56
   151
dvander@61
   152
  out = (' '.join([i for i in argv])) + out
dvander@61
   153
  return p, out, err
dvander@67
   154
dvander@67
   155
def typeof(x):
dvander@67
   156
  return builtins.type(x)
dvander@67
   157
dvander@67
   158
if str == bytes:
dvander@67
   159
  # Python 2.7. sqlite blob is buffer
dvander@67
   160
  BlobType = buffer
dvander@67
   161
else:
dvander@67
   162
  BlobType = bytes
dvander@68
   163
dvander@68
   164
def Unpickle(blob):
dvander@68
   165
  if type(blob) != bytes:
dvander@68
   166
    blob = bytes(blob)
dvander@68
   167
  return pickle.loads(blob)
dvander@75
   168