All of lore.kernel.org
 help / color / mirror / Atom feed
From: Joe Hershberger <joe.hershberger@ni.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 08/10] moveconfig: Handle moving multiple configs at once
Date: Wed, 13 May 2015 17:28:54 -0500	[thread overview]
Message-ID: <1431556137-8426-8-git-send-email-joe.hershberger@ni.com> (raw)
In-Reply-To: <1431556137-8426-1-git-send-email-joe.hershberger@ni.com>

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 <joe.hershberger@ni.com>

---

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

  parent reply	other threads:[~2015-05-13 22:28 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-19 12:12 [U-Boot] [PATCH] Don't apply: tools: add a tool to move automatically CONFIGs from headers to defconfigs Masahiro Yamada
2015-03-04  0:18 ` Simon Glass
2015-03-11  5:53   ` Masahiro Yamada
2015-05-07 21:22 ` [U-Boot] [PATCH 1/5] moveconfig: Actually build autoconf.mk Joe Hershberger
2015-05-07 21:22   ` [U-Boot] [PATCH 2/5] moveconfig: Add a mapping for the arc cross-compiler Joe Hershberger
2015-05-07 21:22   ` [U-Boot] [PATCH 3/5] moveconfig: Continue moving even if one board fails Joe Hershberger
2015-05-07 21:22   ` [U-Boot] [PATCH 4/5] moveconfig: Error if missing the include/autoconf.mk Joe Hershberger
2015-05-07 21:23   ` [U-Boot] [PATCH 5/5] moveconfig: Always run savedefconfig on the moved config Joe Hershberger
2015-05-11 17:23   ` [U-Boot] [PATCH v2 1/7] moveconfig: Actually build autoconf.mk Joe Hershberger
2015-05-11 17:23     ` [U-Boot] [PATCH v2 2/7] moveconfig: Add a mapping for the arc cross-compiler Joe Hershberger
2015-05-13  2:14       ` Masahiro Yamada
2015-05-13 15:34         ` Joe Hershberger
2015-05-11 17:23     ` [U-Boot] [PATCH v2 3/7] moveconfig: Continue moving even if one board fails Joe Hershberger
2015-05-11 17:23     ` [U-Boot] [PATCH v2 4/7] moveconfig: Error if missing the include/autoconf.mk Joe Hershberger
2015-05-11 17:23     ` [U-Boot] [PATCH v2 5/7] moveconfig: Always run savedefconfig on the moved config Joe Hershberger
2015-05-11 17:23     ` [U-Boot] [PATCH v2 6/7] moveconfig: Add a parameter to accept a list to build Joe Hershberger
2015-05-11 17:23     ` [U-Boot] [PATCH v2 7/7] moveconfig: Add a switch to enable printing errors Joe Hershberger
2015-05-13 22:28     ` [U-Boot] [PATCH v3 01/10] moveconfig: Actually build autoconf.mk Joe Hershberger
2015-05-13 22:28       ` [U-Boot] [PATCH v3 02/10] moveconfig: Continue moving even if one board fails Joe Hershberger
2015-05-14 13:09         ` Masahiro Yamada
2015-05-13 22:28       ` [U-Boot] [PATCH v3 03/10] moveconfig: Error if missing the include/autoconf.mk Joe Hershberger
2015-05-13 22:28       ` [U-Boot] [PATCH v3 04/10] moveconfig: Always run savedefconfig on the moved config Joe Hershberger
2015-05-14 15:15         ` Masahiro Yamada
2015-05-14 17:57           ` Joe Hershberger
2015-05-13 22:28       ` [U-Boot] [PATCH v3 05/10] moveconfig: Add a parameter to accept a list to build Joe Hershberger
2015-05-14 13:06         ` Masahiro Yamada
2015-05-13 22:28       ` [U-Boot] [PATCH v3 06/10] moveconfig: Add a switch to enable printing errors Joe Hershberger
2015-05-13 22:28       ` [U-Boot] [PATCH v3 07/10] moveconfig: Ignore duplicate configs when moving Joe Hershberger
2015-05-14 15:36         ` Masahiro Yamada
2015-05-14 18:02           ` Joe Hershberger
2015-05-15  5:10             ` Masahiro Yamada
2015-05-16  2:57               ` Joe Hershberger
2015-05-13 22:28       ` Joe Hershberger [this message]
2015-05-14 14:37         ` [U-Boot] [PATCH v3 08/10] moveconfig: Handle moving multiple configs at once Masahiro Yamada
2015-05-14 18:05           ` Joe Hershberger
2015-05-13 22:28       ` [U-Boot] [PATCH v3 09/10] moveconfig: Print status about the processed defconfigs Joe Hershberger
2015-05-13 22:28       ` [U-Boot] [PATCH v3 10/10] moveconfig: Add a switch to only cleanup headers Joe Hershberger
2015-05-14 14:51         ` Masahiro Yamada
2015-05-14 18:03           ` Joe Hershberger
2015-05-14 13:04       ` [U-Boot] [PATCH v3 01/10] moveconfig: Actually build autoconf.mk Masahiro Yamada
2015-05-15 21:40       ` [U-Boot] [PATCH v4 01/10] moveconfig: Always run savedefconfig on the moved config Joe Hershberger
2015-05-15 21:40         ` [U-Boot] [PATCH v4 02/10] moveconfig: Ignore duplicate configs when moving Joe Hershberger
2015-05-19  4:37           ` Masahiro Yamada
2015-05-15 21:40         ` [U-Boot] [PATCH v4 03/10] moveconfig: Add a parameter to accept a list to build Joe Hershberger
2015-05-19  4:33           ` Masahiro Yamada
2015-05-19 17:58             ` Joe Hershberger
2015-05-20  3:01               ` Masahiro Yamada
2015-05-15 21:40         ` [U-Boot] [PATCH v4 04/10] moveconfig: Add a switch to only cleanup headers Joe Hershberger
2015-05-19  2:03           ` Masahiro Yamada
2015-05-19 15:36             ` Joe Hershberger
2015-05-15 21:40         ` [U-Boot] [PATCH v4 05/10] moveconfig: Cleanup headers in arch and board Joe Hershberger
2015-05-19  1:41           ` Masahiro Yamada
2015-05-19 14:33             ` Joe Hershberger
2015-05-15 21:40         ` [U-Boot] [PATCH v4 06/10] moveconfig: Remove probable debug print Joe Hershberger
2015-05-19  2:10           ` Masahiro Yamada
2015-05-19 15:36             ` Joe Hershberger
2015-05-15 21:40         ` [U-Boot] [PATCH v4 07/10] moveconfig: Output a list of failed boards Joe Hershberger
2015-05-19  3:12           ` Masahiro Yamada
2015-05-19 15:40             ` Joe Hershberger
2015-05-15 21:40         ` [U-Boot] [PATCH v4 08/10] moveconfig: Print a message for missing compiler Joe Hershberger
2015-05-19  3:23           ` Masahiro Yamada
2015-05-19 17:51             ` Joe Hershberger
2015-05-20  3:04               ` Masahiro Yamada
2015-05-15 21:40         ` [U-Boot] [PATCH v4 09/10] moveconfig: Add a switch to enable printing errors Joe Hershberger
2015-05-19  3:25           ` Masahiro Yamada
2015-05-19 17:52             ` Joe Hershberger
2015-05-15 21:40         ` [U-Boot] [PATCH v4 10/10] moveconfig: Print status about the processed defconfigs Joe Hershberger
2015-05-19  4:05           ` Masahiro Yamada
2015-05-19  1:58         ` [U-Boot] [PATCH v4 01/10] moveconfig: Always run savedefconfig on the moved config Masahiro Yamada
2015-05-19 15:35           ` Joe Hershberger
2015-05-19 18:07           ` Joe Hershberger
2015-05-19 18:21         ` [U-Boot] [PATCH v5 1/9] " Joe Hershberger
2015-05-19 18:21           ` [U-Boot] [PATCH v5 2/9] moveconfig: Ignore duplicate configs when moving Joe Hershberger
2015-05-19 18:21           ` [U-Boot] [PATCH v5 3/9] moveconfig: Add a parameter to accept a list to build Joe Hershberger
2015-05-19 18:21           ` [U-Boot] [PATCH v5 4/9] moveconfig: Add a switch to only cleanup headers Joe Hershberger
2015-05-19 18:21           ` [U-Boot] [PATCH v5 5/9] moveconfig: Cleanup headers in arch and board Joe Hershberger
2015-05-19 18:21           ` [U-Boot] [PATCH v5 6/9] moveconfig: Output a list of failed boards Joe Hershberger
2015-05-19 18:21           ` [U-Boot] [PATCH v5 7/9] moveconfig: Print a message for missing compiler Joe Hershberger
2015-05-19 18:21           ` [U-Boot] [PATCH v5 8/9] moveconfig: Add a switch to enable printing errors Joe Hershberger
2015-05-19 18:21           ` [U-Boot] [PATCH v5 9/9] moveconfig: Print status about the processed defconfigs Joe Hershberger
2015-05-20  4:48           ` [U-Boot] [PATCH v5 1/9] moveconfig: Always run savedefconfig on the moved config Masahiro Yamada
2015-05-26 23:43           ` Masahiro Yamada

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1431556137-8426-8-git-send-email-joe.hershberger@ni.com \
    --to=joe.hershberger@ni.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.