tools/genboardscfg.py: improve performance

I guess some developers are already getting sick of this tool
because it generally takes a few minites to generate the boards.cfg
on a reasonable computer.

The idea popped up on my mind was to skip Makefiles and
to run script/kconfig/conf directly.
This tool should become about 4 times faster.
You might still not be satisfied, but better than doing nothing.

Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
Acked-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Masahiro Yamada 2014-08-25 12:39:48 +09:00 committed by Tom Rini
parent d1bf4afda6
commit 9a65cb7ffe

View File

@ -30,7 +30,7 @@ CONFIG_DIR = 'configs'
REFORMAT_CMD = [os.path.join('tools', 'reformat.py'), REFORMAT_CMD = [os.path.join('tools', 'reformat.py'),
'-i', '-d', '-', '-s', '8'] '-i', '-d', '-', '-s', '8']
SHOW_GNU_MAKE = 'scripts/show-gnu-make' SHOW_GNU_MAKE = 'scripts/show-gnu-make'
SLEEP_TIME=0.03 SLEEP_TIME=0.003
COMMENT_BLOCK = '''# COMMENT_BLOCK = '''#
# List of boards # List of boards
@ -312,13 +312,20 @@ class Slot:
Arguments: Arguments:
output: File object which the result is written to output: File object which the result is written to
maintainers_database: An instance of class MaintainersDatabase maintainers_database: An instance of class MaintainersDatabase
devnull: file object of 'dev/null'
make_cmd: the command name of Make
""" """
self.occupied = False
self.build_dir = tempfile.mkdtemp() self.build_dir = tempfile.mkdtemp()
self.devnull = devnull self.devnull = devnull
self.make_cmd = make_cmd self.ps = subprocess.Popen([make_cmd, 'O=' + self.build_dir,
'allnoconfig'], stdout=devnull)
self.occupied = True
self.parser = DotConfigParser(self.build_dir, output, self.parser = DotConfigParser(self.build_dir, output,
maintainers_database) maintainers_database)
self.env = os.environ.copy()
self.env['srctree'] = os.getcwd()
self.env['UBOOTVERSION'] = 'dummy'
self.env['KCONFIG_OBJDIR'] = ''
def __del__(self): def __del__(self):
"""Delete the working directory""" """Delete the working directory"""
@ -341,13 +348,31 @@ class Slot:
""" """
if self.occupied: if self.occupied:
return False return False
o = 'O=' + self.build_dir
self.ps = subprocess.Popen([self.make_cmd, o, defconfig], with open(os.path.join(self.build_dir, '.tmp_defconfig'), 'w') as f:
stdout=self.devnull) for line in open(os.path.join(CONFIG_DIR, defconfig)):
colon = line.find(':CONFIG_')
if colon == -1:
f.write(line)
else:
f.write(line[colon + 1:])
self.ps = subprocess.Popen([os.path.join('scripts', 'kconfig', 'conf'),
'--defconfig=.tmp_defconfig', 'Kconfig'],
stdout=self.devnull,
cwd=self.build_dir,
env=self.env)
self.defconfig = defconfig self.defconfig = defconfig
self.occupied = True self.occupied = True
return True return True
def wait(self):
"""Wait until the current subprocess finishes."""
while self.occupied and self.ps.poll() == None:
time.sleep(SLEEP_TIME)
self.occupied = False
def poll(self): def poll(self):
"""Check if the subprocess is running and invoke the .config """Check if the subprocess is running and invoke the .config
parser if the subprocess is terminated. parser if the subprocess is terminated.
@ -385,6 +410,8 @@ class Slots:
for i in range(jobs): for i in range(jobs):
self.slots.append(Slot(output, maintainers_database, self.slots.append(Slot(output, maintainers_database,
devnull, make_cmd)) devnull, make_cmd))
for slot in self.slots:
slot.wait()
def add(self, defconfig): def add(self, defconfig):
"""Add a new subprocess if a vacant slot is available. """Add a new subprocess if a vacant slot is available.