blob: 5b6a64e1e130604ff9e69435db5bac51d54b018e [file] [log] [blame]
bjanakiraman7f4a4852013-02-15 04:35:28 +00001#!/usr/bin/python2.6
2#
3# Copyright 2010 Google Inc. All Rights Reserved.
4
5"""Utilities for toolchain build."""
6
7
8__author__ = "asharif@google.com (Ahmad Sharif)"
9
10import os
11import subprocess
12
13
14class Logger(object):
15
16 """Logging helper class."""
17
18 def __init__ (self, rootdir, basefilename):
19 self._logdir = rootdir + "/logs/"
20 AtomicMkdir(self._logdir)
21 self._basefilename = basefilename
22 self._cmdfd = open(self._logdir + self._basefilename + ".cmd", "w", 0755)
23 self._stout = open(self._logdir + self._basefilename + ".out", "w")
24 self._sterr = open(self._logdir + self._basefilename + ".err", "w")
25
26 def Stdout(self):
27 return self._stout
28
29 def Stderr(self):
30 return self._sterr
31
32 def Logcmd(self, cmd):
33 self._cmdfd.write(str(cmd) + "\n")
34
35 def __del__ (self):
36 self._cmdfd.close()
37 self._stout.close()
38 self._sterr.close()
39 return
40
41
42main_logger = None
43
44
45def InitLogger(rootdir, basefilename):
46 """Initialize a global logger. To be called only once."""
47 global main_logger
48 main_logger = Logger(rootdir, basefilename)
49
50
51def GetRoot(scr_name):
52 """Break up pathname into (dir+name)."""
53 abs_path = os.path.abspath(scr_name)
54 return (os.path.dirname(abs_path), os.path.basename(abs_path))
55
56
57def RunCommand(cmd):
58 """"Run a command while redirecting stdout and stderr to predefined files."""
59 cmdlist = ["bash", "-c", cmd]
60 main_logger.Logcmd(cmdlist)
61 stout = main_logger.Stdout()
62 sterr = main_logger.Stderr()
63 p = subprocess.Popen(cmdlist, stdout=stout, stderr=sterr)
64 p.wait()
65 return p.returncode
66
67
68def RunCommands(cmdlist):
69 cmd = " ; " .join(cmdlist)
70 print "CMD=", cmd
71 return RunCommand(cmd)
72
73
74def DoCommand(cmd):
75 """"Run a command and return stdout and stderr as string. Log output."""
76 cmdlist = ["bash", "-c", cmd]
77 main_logger.Logcmd(cmdlist)
78 p = subprocess.Popen(cmdlist, stdout=subprocess.PIPE,
79 stderr=subprocess.PIPE)
80 (out, err) = p.communicate()
81 # For now, log the output and error in the standard place. May need to revisit
82 # if its making out files too large.
83 stout = main_logger.Stdout()
84 sterr = main_logger.Stderr()
85 stout.write(out)
86 sterr.write(err)
87 stout.flush()
88 sterr.flush()
89 return (p.returncode, out, err)
90
91
92def DoCommands(cmdlist):
93 cmd = " ; " .join(cmdlist)
94 return DoCommand(cmd)
95
96
97def AtomicMkdir(newdir):
98 try:
99 os.makedirs(newdir)
100 except OSError:
101 # Check if it has been created, perhaps by another process
102 if os.path.exists(newdir):
103 return