diff mbox

[U-Boot,v3,02/10] moveconfig: Continue moving even if one board fails

Message ID 1431556137-8426-2-git-send-email-joe.hershberger@ni.com
State Superseded
Delegated to: Masahiro Yamada
Headers show

Commit Message

Joe Hershberger May 13, 2015, 10:28 p.m. UTC
Some compilers are hard to come by or have so few boards they are not
worth messing with for this tool. Provide a list that need manual
intervention and continue moving the bulk of boards.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>

---

Changes in v3: None
Changes in v2:
-Print which compiler is missing

 tools/moveconfig.py | 35 ++++++++++++++++++++++++++++++-----
 1 file changed, 30 insertions(+), 5 deletions(-)

Comments

Masahiro Yamada May 14, 2015, 1:09 p.m. UTC | #1
2015-05-14 7:28 GMT+09:00 Joe Hershberger <joe.hershberger@ni.com>:
> Some compilers are hard to come by or have so few boards they are not
> worth messing with for this tool. Provide a list that need manual
> intervention and continue moving the bulk of boards.
>
> Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
>
> ---
>
> Changes in v3: None
> Changes in v2:
> -Print which compiler is missing
>
>  tools/moveconfig.py | 35 ++++++++++++++++++++++++++++++-----
>  1 file changed, 30 insertions(+), 5 deletions(-)
>
> diff --git a/tools/moveconfig.py b/tools/moveconfig.py
> index 30dc4f6..d9ae859 100755
> --- a/tools/moveconfig.py
> +++ b/tools/moveconfig.py
> @@ -17,6 +17,7 @@ import os
>  import re
>  import shutil
>  import subprocess
> +from subprocess import PIPE
>  import sys
>  import tempfile
>  import time
> @@ -276,6 +277,13 @@ class Slot:
>          self.state = STATE_DEFCONFIG
>          return True
>
> +    def defconfig_error(self, errmsg):
> +        output = self.defconfig[:-len('_defconfig')].ljust(37) + ': '
> +        print output + errmsg
> +
> +        """Save a list of targets that have to be checked by hand"""
> +        open('moveconfig.failed', 'a+').write("%s\n" % self.defconfig)
> +
>      def poll(self):
>          """Check if the subprocess is running and invoke the .config
>          parser if the subprocess is terminated.
> @@ -290,19 +298,25 @@ class Slot:
>              return False
>
>          if self.ps.poll() != 0:
> -            sys.exit("failed to process '%s'" % self.defconfig)
> +            errmsg = 'ERROR - build error'
> +            errout = self.ps.stderr.read()
> +            if errout.find('gcc: command not found') != -1:
> +                errmsg = 'ERROR - compiler not found (%s)' % self.cross_compile
> +            self.defconfig_error(errmsg)
> +            self.state = STATE_IDLE
> +            return True
>
>          if self.state == STATE_SILENTOLDCONFIG:
>              self.parser.update_defconfig(self.defconfig)
>              self.state = STATE_IDLE
>              return True
>
> -        cross_compile = self.parser.get_cross_compile()
> +        self.cross_compile = self.parser.get_cross_compile()
>          cmd = list(self.make_cmd)
> -        if cross_compile:
> -            cmd.append('CROSS_COMPILE=%s' % cross_compile)
> +        if self.cross_compile:
> +            cmd.append('CROSS_COMPILE=%s' % self.cross_compile)
>          cmd.append('include/autoconf.mk')
> -        self.ps = subprocess.Popen(cmd, stdout=self.devnull)
> +        self.ps = subprocess.Popen(cmd, stdout=self.devnull, stderr=PIPE)
>          self.state = STATE_SILENTOLDCONFIG
>          return False
>
> @@ -362,6 +376,7 @@ class Slots:
>
>  def move_config(config_attr, jobs=1):
>      check_top_directory()
> +
>      print 'Moving %s (type: %s, default: %s, no_spl: %s) ...  (jobs: %d)' % (
>          config_attr['config'],
>          config_attr['type'],
> @@ -378,6 +393,10 @@ def move_config(config_attr, jobs=1):
>                  continue
>              defconfigs.append(os.path.join(dirpath, filename))
>
> +    """Clean up any previous log of failed moves"""
> +    if os.path.exists('moveconfig.failed'):
> +        os.remove('moveconfig.failed')
> +
>      slots = Slots(config_attr, jobs)
>
>      # Main loop to process defconfig files:
> @@ -395,6 +414,12 @@ def move_config(config_attr, jobs=1):
>
>      cleanup_headers(config_attr['config'])
>
> +    if os.path.exists('moveconfig.failed'):
> +        print '!!!  Some boards were not processed; move the config manually.'
> +        print '!!!  The list of failed boards are saved in moveconfig.failed'
> +        print
> +        print open('moveconfig.failed', 'r').read()
> +
>  def main():
>      try:
>          cpu_count = multiprocessing.cpu_count()



I could successfully convert all the defconfigs with my toolchains,
but I thought this feature would be helpful.

I merged this feature in my new version with your signed-off-by
although the implementation is a bit different.
diff mbox

Patch

diff --git a/tools/moveconfig.py b/tools/moveconfig.py
index 30dc4f6..d9ae859 100755
--- a/tools/moveconfig.py
+++ b/tools/moveconfig.py
@@ -17,6 +17,7 @@  import os
 import re
 import shutil
 import subprocess
+from subprocess import PIPE
 import sys
 import tempfile
 import time
@@ -276,6 +277,13 @@  class Slot:
         self.state = STATE_DEFCONFIG
         return True
 
+    def defconfig_error(self, errmsg):
+        output = self.defconfig[:-len('_defconfig')].ljust(37) + ': '
+        print output + errmsg
+
+        """Save a list of targets that have to be checked by hand"""
+        open('moveconfig.failed', 'a+').write("%s\n" % self.defconfig)
+
     def poll(self):
         """Check if the subprocess is running and invoke the .config
         parser if the subprocess is terminated.
@@ -290,19 +298,25 @@  class Slot:
             return False
 
         if self.ps.poll() != 0:
-            sys.exit("failed to process '%s'" % self.defconfig)
+            errmsg = 'ERROR - build error'
+            errout = self.ps.stderr.read()
+            if errout.find('gcc: command not found') != -1:
+                errmsg = 'ERROR - compiler not found (%s)' % self.cross_compile
+            self.defconfig_error(errmsg)
+            self.state = STATE_IDLE
+            return True
 
         if self.state == STATE_SILENTOLDCONFIG:
             self.parser.update_defconfig(self.defconfig)
             self.state = STATE_IDLE
             return True
 
-        cross_compile = self.parser.get_cross_compile()
+        self.cross_compile = self.parser.get_cross_compile()
         cmd = list(self.make_cmd)
-        if cross_compile:
-            cmd.append('CROSS_COMPILE=%s' % cross_compile)
+        if self.cross_compile:
+            cmd.append('CROSS_COMPILE=%s' % self.cross_compile)
         cmd.append('include/autoconf.mk')
-        self.ps = subprocess.Popen(cmd, stdout=self.devnull)
+        self.ps = subprocess.Popen(cmd, stdout=self.devnull, stderr=PIPE)
         self.state = STATE_SILENTOLDCONFIG
         return False
 
@@ -362,6 +376,7 @@  class Slots:
 
 def move_config(config_attr, jobs=1):
     check_top_directory()
+
     print 'Moving %s (type: %s, default: %s, no_spl: %s) ...  (jobs: %d)' % (
         config_attr['config'],
         config_attr['type'],
@@ -378,6 +393,10 @@  def move_config(config_attr, jobs=1):
                 continue
             defconfigs.append(os.path.join(dirpath, filename))
 
+    """Clean up any previous log of failed moves"""
+    if os.path.exists('moveconfig.failed'):
+        os.remove('moveconfig.failed')
+
     slots = Slots(config_attr, jobs)
 
     # Main loop to process defconfig files:
@@ -395,6 +414,12 @@  def move_config(config_attr, jobs=1):
 
     cleanup_headers(config_attr['config'])
 
+    if os.path.exists('moveconfig.failed'):
+        print '!!!  Some boards were not processed; move the config manually.'
+        print '!!!  The list of failed boards are saved in moveconfig.failed'
+        print
+        print open('moveconfig.failed', 'r').read()
+
 def main():
     try:
         cpu_count = multiprocessing.cpu_count()