From mboxrd@z Thu Jan 1 00:00:00 1970 From: Joe Hershberger Date: Wed, 13 May 2015 17:28:54 -0500 Subject: [U-Boot] [PATCH v3 08/10] moveconfig: Handle moving multiple configs at once In-Reply-To: <1431556137-8426-1-git-send-email-joe.hershberger@ni.com> References: <1431364998-2905-1-git-send-email-joe.hershberger@ni.com> <1431556137-8426-1-git-send-email-joe.hershberger@ni.com> Message-ID: <1431556137-8426-8-git-send-email-joe.hershberger@ni.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Moving configs is a fairly slow process since each board config must pass through a compiler to evaluate the configs. Also, many configs are related in a way that makes sense to atomically move. Add support to tools/moveconfig.py to read multiple lines from the .moveconfig file and create a parser for each. After compiling the configs, simply run all the parsers on the autoconf.mk to find the state of each of those configs. Signed-off-by: Joe Hershberger --- Changes in v3: -New for version 3 Changes in v2: None tools/moveconfig.py | 75 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 33 deletions(-) diff --git a/tools/moveconfig.py b/tools/moveconfig.py index 97ff597..798f717 100755 --- a/tools/moveconfig.py +++ b/tools/moveconfig.py @@ -91,9 +91,9 @@ def cleanup_header(header_path, patterns): if not i in matched: f.write(line) -def cleanup_headers(config): +def cleanup_headers(config_attrs): while True: - choice = raw_input('Clean up %s in headers? [y/n]: ' % config).lower() + choice = raw_input('Clean up headers? [y/n]: ').lower() print choice if choice == 'y' or choice == 'n': break @@ -102,8 +102,9 @@ def cleanup_headers(config): return patterns = [] - patterns.append(re.compile(r'#\s*define\s+%s\W' % config)) - patterns.append(re.compile(r'#\s*undef\s+%s\W' % config)) + for config_attr in config_attrs: + patterns.append(re.compile(r'#\s*define\s+%s\W' % config_attr['config'])) + patterns.append(re.compile(r'#\s*undef\s+%s\W' % config_attr['config'])) for (dirpath, dirnames, filenames) in os.walk('include'): for filename in filenames: @@ -126,7 +127,7 @@ class KconfigParser: PREFIX = { '.': '+', 'spl': 'S', 'tpl': 'T' } def __init__(self, build_dir, config_attr): - """Create a new .config perser. + """Create a new .config parser. Arguments: build_dir: Build directory where .config is located @@ -141,6 +142,7 @@ class KconfigParser: else: self.no_spl_support = False self.re = re.compile(r'%s=(.*)' % self.config) + self.dotconfig = os.path.join(self.build_dir, '.config') def get_cross_compile(self): """Parse .config file and return CROSS_COMPILE @@ -150,7 +152,6 @@ class KconfigParser: """ arch = '' cpu = '' - self.dotconfig = os.path.join(self.build_dir, '.config') for line in open(self.dotconfig): m = self.re_arch.match(line) if m: @@ -204,7 +205,6 @@ class KconfigParser: value = '(default)' values.append(value) - os.remove(autoconf) if value == '(undef)' or value == '(default)': continue @@ -220,6 +220,7 @@ class KconfigParser: prefixes[output_line] = self.PREFIX[img] output = defconfig[:-len('_defconfig')].ljust(37) + ': ' + output += self.config.replace('CONFIG_','').ljust(18) + ': ' for value in values: output += value.ljust(12) @@ -241,7 +242,7 @@ class Slot: for faster processing. """ - def __init__(self, config_attr, devnull, make_cmd, options): + def __init__(self, config_attrs, devnull, make_cmd, options): """Create a new slot. Arguments: @@ -251,7 +252,9 @@ class Slot: self.devnull = devnull self.make_cmd = (make_cmd, 'O=' + self.build_dir) self.options = options - self.parser = KconfigParser(self.build_dir, config_attr) + self.parsers = [] + for config_attr in config_attrs: + self.parsers.append(KconfigParser(self.build_dir, config_attr)) self.state = STATE_IDLE def __del__(self): @@ -314,10 +317,11 @@ class Slot: return True if self.state == STATE_SILENTOLDCONFIG: - if self.parser.update_defconfig(self.defconfig): - self.defconfig_error('ERROR - autoconf.mk not found') - self.state = STATE_IDLE - return True + for parser in self.parsers: + if parser.update_defconfig(self.defconfig): + self.defconfig_error('ERROR - autoconf.mk not found') + self.state = STATE_IDLE + return True """Save off the defconfig in a consistent way""" cmd = list(self.make_cmd) @@ -336,7 +340,7 @@ class Slot: self.state = STATE_IDLE return True - self.cross_compile = self.parser.get_cross_compile() + self.cross_compile = self.parsers[0].get_cross_compile() cmd = list(self.make_cmd) if self.cross_compile: cmd.append('CROSS_COMPILE=%s' % self.cross_compile) @@ -350,7 +354,7 @@ class Slots: """Controller of the array of subprocess slots.""" - def __init__(self, config_attr, options): + def __init__(self, config_attrs, options): """Create a new slots controller. Arguments: @@ -360,7 +364,7 @@ class Slots: devnull = get_devnull() make_cmd = get_make_cmd() for i in range(options.jobs): - self.slots.append(Slot(config_attr, devnull, make_cmd, options)) + self.slots.append(Slot(config_attrs, devnull, make_cmd, options)) def add(self, defconfig): """Add a new subprocess if a vacant slot is available. @@ -400,15 +404,16 @@ class Slots: ret = False return ret -def move_config(config_attr, options): +def move_config(config_attrs, options): check_top_directory() - print 'Moving %s (type: %s, default: %s, no_spl: %s) ... (jobs: %d)' % ( - config_attr['config'], - config_attr['type'], - config_attr['default'], - config_attr['no_spl_support'], - options.jobs) + for config_attr in config_attrs: + print 'Moving %s (type: %s, default: %s, no_spl: %s)' % ( + config_attr['config'], + config_attr['type'], + config_attr['default'], + config_attr['no_spl_support']) + print '%d jobs...' % options.jobs if options.defconfigs: defconfigs = [line.strip() for line in open(options.defconfigs, 'r')] @@ -426,7 +431,7 @@ def move_config(config_attr, options): if os.path.exists('moveconfig.failed'): os.remove('moveconfig.failed') - slots = Slots(config_attr, options) + slots = Slots(config_attrs, options) # Main loop to process defconfig files: # Add a new subprocess into a vacant slot. @@ -441,7 +446,7 @@ def move_config(config_attr, options): while not slots.empty(): time.sleep(SLEEP_TIME) - cleanup_headers(config_attr['config']) + cleanup_headers(config_attrs) if os.path.exists('moveconfig.failed'): print '!!! Some boards were not processed; move the config manually.' @@ -468,31 +473,35 @@ def main(): (options, args) = parser.parse_args() args_key = ('config', 'type', 'default', 'no_spl_support') - config_attr = {} + config_attrs = [] if len(args) >= len(args_key): saved_attr = '' for i, key in enumerate(args_key): - config_attr[key] = args[i] + config_attrs.append({}) + config_attrs[0][key] = args[i] saved_attr = saved_attr + ' %s' % args[i] with open('.moveconfig', 'w') as f: f.write(saved_attr) elif os.path.exists('.moveconfig'): f = open('.moveconfig') try: - saved_attr = f.readline().split() - for i, key in enumerate(args_key): - config_attr[key] = saved_attr[i] + for j, line in enumerate(f): + config_attrs.append({}) + saved_attr = line.split() + for i, key in enumerate(args_key): + config_attrs[j][key] = saved_attr[i] except: sys.exit('%s: broken format' % '.moveconfig') else: parser.print_usage() sys.exit(1) - if not config_attr['config'].startswith('CONFIG_'): - config_attr['config'] = 'CONFIG_' + config_attr['config'] + for config_attr in config_attrs: + if not config_attr['config'].startswith('CONFIG_'): + config_attr['config'] = 'CONFIG_' + config_attr['config'] - move_config(config_attr, options) + move_config(config_attrs, options) if __name__ == '__main__': main() -- 1.7.11.5