@ -248,21 +248,34 @@ class BuilderThread(threading.Thread):
if self . toolchain :
# Checkout the right commit
if commit_upto is not None :
if self . builder . commits :
commit = self . builder . commits [ commit_upto ]
if self . builder . checkout :
git_dir = os . path . join ( work_dir , ' .git ' )
gitutil . Checkout ( commit . hash , git_dir , work_dir ,
force = True )
else :
commit = self . builder . commit # Ick, fix this for BuildCommits()
commit = ' current '
# Set up the environment and command line
env = self . toolchain . MakeEnvironment ( )
Mkdir ( out_dir )
args = [ ]
cwd = work_dir
if not self . builder . in_tree :
args . append ( ' O=build ' )
if commit_upto is None :
# In this case we are building in the original source
# directory (i.e. the current directory where buildman
# is invoked. The output directory is set to this
# thread's selected work directory.
#
# Symlinks can confuse U-Boot's Makefile since
# we may use '..' in our path, so remove them.
work_dir = os . path . realpath ( work_dir )
args . append ( ' O= %s /build ' % work_dir )
cwd = None
else :
args . append ( ' O=build ' )
args . append ( ' -s ' )
if self . builder . num_jobs is not None :
args . extend ( [ ' -j ' , str ( self . builder . num_jobs ) ] )
@ -272,14 +285,14 @@ class BuilderThread(threading.Thread):
# If we need to reconfigure, do that now
if do_config :
result = self . Make ( commit , brd , ' distclean ' , work_ dir ,
result = self . Make ( commit , brd , ' distclean ' , c wd,
' distclean ' , * args , env = env )
result = self . Make ( commit , brd , ' config ' , work_ dir ,
result = self . Make ( commit , brd , ' config ' , c wd,
* ( args + config_args ) , env = env )
config_out = result . combined
do_config = False # No need to configure next time
if result . return_code == 0 :
result = self . Make ( commit , brd , ' build ' , work_ dir , * args ,
result = self . Make ( commit , brd , ' build ' , c wd, * args ,
env = env )
result . stdout = config_out + result . stdout
else :
@ -478,8 +491,10 @@ class BuilderThread(threading.Thread):
self . builder . out_queue . put ( result )
else :
# Just build the currently checked-out build
result = self . RunCommit ( None , True )
result . commit_upto = self . builder . upto
result , request_config = self . RunCommit ( None , brd , work_dir , True ,
True , self . builder . force_build_failures )
result . commit_upto = 0
self . _WriteResult ( result , job . keep_outputs )
self . builder . out_queue . put ( result )
def run ( self ) :
@ -491,12 +506,16 @@ class BuilderThread(threading.Thread):
alive = True
while True :
job = self . builder . queue . get ( )
if self . builder . active and alive :
self . RunJob ( job )
'''
try :
if self . builder . active and alive :
self . RunJob ( job )
except Exception as err :
alive = False
print err
'''
self . builder . queue . task_done ( )
@ -763,10 +782,13 @@ class Builder:
Args :
commit_upto : Commit number to use ( 0. . self . count - 1 )
"""
commit = self . commits [ commit_upto ]
subject = commit . subject . translate ( trans_valid_chars )
commit_dir = ( ' %02d _of_ %02d _g %s _ %s ' % ( commit_upto + 1 ,
self . commit_count , commit . hash , subject [ : 20 ] ) )
if self . commits :
commit = self . commits [ commit_upto ]
subject = commit . subject . translate ( trans_valid_chars )
commit_dir = ( ' %02d _of_ %02d _g %s _ %s ' % ( commit_upto + 1 ,
self . commit_count , commit . hash , subject [ : 20 ] ) )
else :
commit_dir = ' current '
output_dir = os . path . join ( self . base_dir , commit_dir )
return output_dir
@ -1308,14 +1330,18 @@ class Builder:
show_detail : Show detail for each board
show_bloat : Show detail for each function
"""
self . commit_count = len ( commits )
self . commit_count = len ( commits ) if commits else 1
self . commits = commits
self . ResetResultSummary ( board_selected )
for commit_upto in range ( 0 , self . commit_count , self . _step ) :
board_dict , err_lines = self . GetResultSummary ( board_selected ,
commit_upto , read_func_sizes = show_bloat )
msg = ' %02d : %s ' % ( commit_upto + 1 , commits [ commit_upto ] . subject )
if commits :
msg = ' %02d : %s ' % ( commit_upto + 1 ,
commits [ commit_upto ] . subject )
else :
msg = ' current '
print self . col . Color ( self . col . BLUE , msg )
self . PrintResultSummary ( board_selected , board_dict ,
err_lines if show_errors else [ ] , show_sizes , show_detail ,
@ -1330,7 +1356,7 @@ class Builder:
commits : Selected commits to build
"""
# First work out how many commits we will build
count = ( len ( commits ) + self . _step - 1 ) / self . _step
count = ( self . commit_count + self . _step - 1 ) / self . _step
self . count = len ( board_selected ) * count
self . upto = self . warned = self . fail = 0
self . _timestamps = collections . deque ( )
@ -1377,13 +1403,14 @@ class Builder:
"""
return os . path . join ( self . _working_dir , ' %02d ' % thread_num )
def _PrepareThread ( self , thread_num ) :
def _PrepareThread ( self , thread_num , setup_git ) :
""" Prepare the working directory for a thread.
This clones or fetches the repo into the thread ' s work directory.
Args :
thread_num : Thread number ( 0 , 1 , . . . )
setup_git : True to set up a git repo clone
"""
thread_dir = self . GetThreadDir ( thread_num )
Mkdir ( thread_dir )
@ -1392,7 +1419,7 @@ class Builder:
# Clone the repo if it doesn't already exist
# TODO(sjg@chromium): Perhaps some git hackery to symlink instead, so
# we have a private index but uses the origin repo's contents?
if self . git_dir :
if setup_git and self . git_dir :
src_dir = os . path . abspath ( self . git_dir )
if os . path . exists ( git_dir ) :
gitutil . Fetch ( git_dir , thread_dir )
@ -1400,17 +1427,18 @@ class Builder:
print ' Cloning repo for thread %d ' % thread_num
gitutil . Clone ( src_dir , thread_dir )
def _PrepareWorkingSpace ( self , max_threads ) :
def _PrepareWorkingSpace ( self , max_threads , setup_git ) :
""" Prepare the working directory for use.
Set up the git repo for each thread .
Args :
max_threads : Maximum number of threads we expect to need .
setup_git : True to set up a git repo clone
"""
Mkdir ( self . _working_dir )
for thread in range ( max_threads ) :
self . _PrepareThread ( thread )
self . _PrepareThread ( thread , setup_git )
def _PrepareOutputSpace ( self ) :
""" Get the output directories ready to receive files.
@ -1437,12 +1465,13 @@ class Builder:
show_errors : True to show summarised error / warning info
keep_outputs : True to save build output files
"""
self . commit_count = len ( commits )
self . commit_count = len ( commits ) if commits else 1
self . commits = commits
self . ResetResultSummary ( board_selected )
Mkdir ( self . base_dir )
self . _PrepareWorkingSpace ( min ( self . num_threads , len ( board_selected ) ) )
self . _PrepareWorkingSpace ( min ( self . num_threads , len ( board_selected ) ) ,
commits is not None )
self . _PrepareOutputSpace ( )
self . SetupBuild ( board_selected , commits )
self . ProcessResult ( None )