@ -413,63 +413,95 @@ class Indicator:
sys . stdout . write ( ' \r ' + msg )
sys . stdout . flush ( )
def __gen_boards_cfg ( jobs ) :
""" Generate boards.cfg file.
class BoardsFileGenerator :
Arguments :
jobs : The number of jobs to run simultaneously
""" Generator of boards.cfg. """
Note :
The incomplete boards . cfg is left over when an error ( including
the termination by the keyboard interrupt ) occurs on the halfway .
"""
check_top_directory ( )
print ' Generating %s ... (jobs: %d ) ' % ( BOARD_FILE , jobs )
# All the defconfig files to be processed
defconfigs = [ ]
for ( dirpath , dirnames , filenames ) in os . walk ( CONFIG_DIR ) :
dirpath = dirpath [ len ( CONFIG_DIR ) + 1 : ]
for filename in fnmatch . filter ( filenames , ' *_defconfig ' ) :
if fnmatch . fnmatch ( filename , ' .* ' ) :
continue
defconfigs . append ( os . path . join ( dirpath , filename ) )
# Parse all the MAINTAINERS files
maintainers_database = MaintainersDatabase ( )
for ( dirpath , dirnames , filenames ) in os . walk ( ' . ' ) :
if ' MAINTAINERS ' in filenames :
maintainers_database . parse_file ( os . path . join ( dirpath ,
' MAINTAINERS ' ) )
# Output lines should be piped into the reformat tool
reformat_process = subprocess . Popen ( REFORMAT_CMD , stdin = subprocess . PIPE ,
stdout = open ( BOARD_FILE , ' w ' ) )
pipe = reformat_process . stdin
pipe . write ( COMMENT_BLOCK )
indicator = Indicator ( len ( defconfigs ) )
slots = Slots ( jobs , pipe , maintainers_database )
# Main loop to process defconfig files:
# Add a new subprocess into a vacant slot.
# Sleep if there is no available slot.
for defconfig in defconfigs :
while not slots . add ( defconfig ) :
while not slots . available ( ) :
# No available slot: sleep for a while
time . sleep ( SLEEP_TIME )
indicator . inc ( )
# wait until all the subprocesses finish
while not slots . empty ( ) :
time . sleep ( SLEEP_TIME )
print ' '
# wait until the reformat tool finishes
reformat_process . communicate ( )
if reformat_process . returncode != 0 :
sys . exit ( ' " %s " failed ' % REFORMAT_CMD [ 0 ] )
def __init__ ( self ) :
""" Prepare basic things for generating boards.cfg. """
# All the defconfig files to be processed
defconfigs = [ ]
for ( dirpath , dirnames , filenames ) in os . walk ( CONFIG_DIR ) :
dirpath = dirpath [ len ( CONFIG_DIR ) + 1 : ]
for filename in fnmatch . filter ( filenames , ' *_defconfig ' ) :
if fnmatch . fnmatch ( filename , ' .* ' ) :
continue
defconfigs . append ( os . path . join ( dirpath , filename ) )
self . defconfigs = defconfigs
self . indicator = Indicator ( len ( defconfigs ) )
# Parse all the MAINTAINERS files
maintainers_database = MaintainersDatabase ( )
for ( dirpath , dirnames , filenames ) in os . walk ( ' . ' ) :
if ' MAINTAINERS ' in filenames :
maintainers_database . parse_file ( os . path . join ( dirpath ,
' MAINTAINERS ' ) )
self . maintainers_database = maintainers_database
def __del__ ( self ) :
""" Delete the incomplete boards.cfg
This destructor deletes boards . cfg if the private member ' in_progress '
is defined as True . The ' in_progress ' member is set to True at the
beginning of the generate ( ) method and set to False at its end .
So , in_progress == True means generating boards . cfg was terminated
on the way .
"""
if hasattr ( self , ' in_progress ' ) and self . in_progress :
try :
os . remove ( BOARD_FILE )
except OSError as exception :
# Ignore 'No such file or directory' error
if exception . errno != errno . ENOENT :
raise
print ' Removed incomplete %s ' % BOARD_FILE
def generate ( self , jobs ) :
""" Generate boards.cfg
This method sets the ' in_progress ' member to True at the beginning
and sets it to False on success . The boards . cfg should not be
touched before / after this method because ' in_progress ' is used
to detect the incomplete boards . cfg .
Arguments :
jobs : The number of jobs to run simultaneously
"""
self . in_progress = True
print ' Generating %s ... (jobs: %d ) ' % ( BOARD_FILE , jobs )
# Output lines should be piped into the reformat tool
reformat_process = subprocess . Popen ( REFORMAT_CMD ,
stdin = subprocess . PIPE ,
stdout = open ( BOARD_FILE , ' w ' ) )
pipe = reformat_process . stdin
pipe . write ( COMMENT_BLOCK )
slots = Slots ( jobs , pipe , self . maintainers_database )
# Main loop to process defconfig files:
# Add a new subprocess into a vacant slot.
# Sleep if there is no available slot.
for defconfig in self . defconfigs :
while not slots . add ( defconfig ) :
while not slots . available ( ) :
# No available slot: sleep for a while
time . sleep ( SLEEP_TIME )
self . indicator . inc ( )
# wait until all the subprocesses finish
while not slots . empty ( ) :
time . sleep ( SLEEP_TIME )
print ' '
# wait until the reformat tool finishes
reformat_process . communicate ( )
if reformat_process . returncode != 0 :
sys . exit ( ' " %s " failed ' % REFORMAT_CMD [ 0 ] )
self . in_progress = False
def gen_boards_cfg ( jobs ) :
""" Generate boards.cfg file.
@ -480,17 +512,9 @@ def gen_boards_cfg(jobs):
Arguments :
jobs : The number of jobs to run simultaneously
"""
try :
__gen_boards_cfg ( jobs )
except :
# We should remove incomplete boards.cfg
try :
os . remove ( BOARD_FILE )
except OSError as exception :
# Ignore 'No such file or directory' error
if exception . errno != errno . ENOENT :
raise
raise
check_top_directory ( )
generator = BoardsFileGenerator ( )
generator . generate ( jobs )
def main ( ) :
parser = optparse . OptionParser ( )