blob: e2a50edb0f58bcd1fc57962c3b6ff9180114369c [file] [log] [blame]
# Copyright 2010 Google Inc. All Rights Reserved.
# This file contains a set of utilities functions used
# by both SConstruct and other Python-based scripts.
import commands
import os
import platform
import re
import subprocess
class ChangedWorkingDirectory(object):
def __init__(self, new_dir):
self._new_dir = new_dir
def __enter__(self):
self._old_dir = os.getcwd()
os.chdir(self._new_dir)
return self._new_dir
def __exit__(self, *_):
os.chdir(self._old_dir)
# Try to guess the host operating system.
def guessOS():
id = platform.system()
if id == "Linux":
return "linux"
elif id == "Darwin":
return "mac"
elif id == "Windows" or id == "Microsoft":
# On Windows Vista platform.system() can return "Microsoft" with some
# versions of Python, see http://bugs.python.org/issue1082 for details.
return "win"
else:
return None
# Try to guess the host architecture.
def guessArchitecture():
id = platform.machine()
if id.startswith('arm'):
return 'arm'
elif (not id) or (not re.match('(x|i[3-6])86', id) is None):
return 'x86'
elif id == 'i86pc':
return 'x86'
else:
return None
# Try to guess the number of cpus on this machine.
def guessCpus():
if os.path.exists("/proc/cpuinfo"):
return int(commands.getoutput("grep -E '^processor' /proc/cpuinfo | wc -l"))
if os.path.exists("/usr/bin/hostinfo"):
return int(commands.getoutput('/usr/bin/hostinfo | grep "processors are logically available." | awk "{ print \$1 }"'))
win_cpu_count = os.getenv("NUMBER_OF_PROCESSORS")
if win_cpu_count:
return int(win_cpu_count)
return int(os.getenv("PARFAIT_NUMBER_OF_CORES", 2))
# Returns true if we're running under Windows.
def isWindows():
return guessOS() == 'win32'
# Reads a text file into an array of strings - one for each
# line. Strips comments in the process.
def readLinesFrom(name):
result = []
for line in open(name):
if '#' in line:
line = line[:line.find('#')]
line = line.strip()
if len(line) == 0:
continue
result.append(line)
return result
def listArgCallback(option, opt_str, value, parser):
if value is None:
value = []
for arg in parser.rargs:
if arg[:2].startswith('--'):
break
value.append(arg)
del parser.rargs[:len(value)]
setattr(parser.values, option.dest, value)
def getCommandOutput(cmd):
print cmd
pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = pipe.communicate()
if pipe.returncode == 0:
return output[0]
else:
print output[1]
raise Exception('Failed to run command. return code=%s' % pipe.returncode)
def runCommand(cmd, env_update=None):
if env_update is None:
env_update = {}
print 'Running: ' + ' '.join(["%s='%s'" % (k, v) for k, v in env_update.iteritems()]) + ' ' + ' '.join(cmd)
env_copy = dict(os.environ.items())
env_copy.update(env_update)
p = subprocess.Popen(cmd, env=env_copy)
if p.wait() != 0:
raise Exception('Failed to run command. return code=%s' % p.returncode)
def main(argv):
print "GuessOS() -> ", guessOS()
print "GuessArchitecture() -> ", guessArchitecture()
print "GuessCpus() -> ", guessCpus()
print "IsWindows() -> ", isWindows()
if __name__ == "__main__":
import sys
main(sys.argv)