|
@@ -30,13 +30,17 @@ The tool walks through all the defconfig files and move the given CONFIGs.
|
|
|
|
|
|
The log is also displayed on the terminal.
|
|
|
|
|
|
-Each line is printed in the format
|
|
|
-<defconfig_name> : <action>
|
|
|
+The log is printed for each defconfig as follows:
|
|
|
|
|
|
-<defconfig_name> is the name of the defconfig
|
|
|
-(without the suffix _defconfig).
|
|
|
+<defconfig_name>
|
|
|
+ <action1>
|
|
|
+ <action2>
|
|
|
+ <action3>
|
|
|
+ ...
|
|
|
|
|
|
-<action> shows what the tool did for that defconfig.
|
|
|
+<defconfig_name> is the name of the defconfig.
|
|
|
+
|
|
|
+<action*> shows what the tool did for that defconfig.
|
|
|
It looks like one of the followings:
|
|
|
|
|
|
- Move 'CONFIG_... '
|
|
@@ -249,15 +253,13 @@ def get_make_cmd():
|
|
|
def color_text(color_enabled, color, string):
|
|
|
"""Return colored string."""
|
|
|
if color_enabled:
|
|
|
- return '\033[' + color + 'm' + string + '\033[0m'
|
|
|
+ # LF should not be surrounded by the escape sequence.
|
|
|
+ # Otherwise, additional whitespace or line-feed might be printed.
|
|
|
+ return '\n'.join([ '\033[' + color + 'm' + s + '\033[0m' if s else ''
|
|
|
+ for s in string.split('\n') ])
|
|
|
else:
|
|
|
return string
|
|
|
|
|
|
-def log_msg(color_enabled, color, defconfig, msg):
|
|
|
- """Return the formated line for the log."""
|
|
|
- return defconfig[:-len('_defconfig')].ljust(37) + ': ' + \
|
|
|
- color_text(color_enabled, color, msg) + '\n'
|
|
|
-
|
|
|
def update_cross_compile(color_enabled):
|
|
|
"""Update per-arch CROSS_COMPILE via environment variables
|
|
|
|
|
@@ -483,7 +485,7 @@ class KconfigParser:
|
|
|
|
|
|
return (ACTION_MOVE, new_val)
|
|
|
|
|
|
- def update_dotconfig(self, defconfig):
|
|
|
+ def update_dotconfig(self):
|
|
|
"""Parse files for the config options and update the .config.
|
|
|
|
|
|
This function parses the generated .config and include/autoconf.mk
|
|
@@ -526,7 +528,7 @@ class KconfigParser:
|
|
|
else:
|
|
|
sys.exit("Internal Error. This should not happen.")
|
|
|
|
|
|
- log += log_msg(self.options.color, log_color, defconfig, actlog)
|
|
|
+ log += color_text(self.options.color, log_color, actlog) + '\n'
|
|
|
|
|
|
with open(self.dotconfig, 'a') as f:
|
|
|
for (action, value) in results:
|
|
@@ -602,6 +604,7 @@ class Slot:
|
|
|
stderr=subprocess.PIPE)
|
|
|
self.defconfig = defconfig
|
|
|
self.state = STATE_DEFCONFIG
|
|
|
+ self.log = ''
|
|
|
return True
|
|
|
|
|
|
def poll(self):
|
|
@@ -624,14 +627,12 @@ class Slot:
|
|
|
return False
|
|
|
|
|
|
if self.ps.poll() != 0:
|
|
|
- print >> sys.stderr, log_msg(self.options.color, COLOR_LIGHT_RED,
|
|
|
- self.defconfig, "Failed to process."),
|
|
|
+ self.log += color_text(self.options.color, COLOR_LIGHT_RED,
|
|
|
+ "Failed to process.\n")
|
|
|
if self.options.verbose:
|
|
|
- print >> sys.stderr, color_text(self.options.color,
|
|
|
- COLOR_LIGHT_CYAN,
|
|
|
- self.ps.stderr.read())
|
|
|
- self.progress.inc()
|
|
|
- self.progress.show()
|
|
|
+ self.log += color_text(self.options.color, COLOR_LIGHT_CYAN,
|
|
|
+ self.ps.stderr.read())
|
|
|
+ self.show_log(sys.stderr)
|
|
|
if self.options.exit_on_error:
|
|
|
sys.exit("Exit on error.")
|
|
|
# If --exit-on-error flag is not set, skip this board and continue.
|
|
@@ -641,7 +642,7 @@ class Slot:
|
|
|
return True
|
|
|
|
|
|
if self.state == STATE_AUTOCONF:
|
|
|
- self.log = self.parser.update_dotconfig(self.defconfig)
|
|
|
+ self.log += self.parser.update_dotconfig()
|
|
|
|
|
|
"""Save off the defconfig in a consistent way"""
|
|
|
cmd = list(self.make_cmd)
|
|
@@ -655,21 +656,15 @@ class Slot:
|
|
|
if not self.options.dry_run:
|
|
|
shutil.move(os.path.join(self.build_dir, 'defconfig'),
|
|
|
os.path.join('configs', self.defconfig))
|
|
|
- # Some threads are running in parallel.
|
|
|
- # Print log in one shot to not mix up logs from different threads.
|
|
|
- print self.log,
|
|
|
- self.progress.inc()
|
|
|
- self.progress.show()
|
|
|
+ self.show_log()
|
|
|
self.state = STATE_IDLE
|
|
|
return True
|
|
|
|
|
|
self.cross_compile = self.parser.get_cross_compile()
|
|
|
if self.cross_compile is None:
|
|
|
- print >> sys.stderr, log_msg(self.options.color, COLOR_YELLOW,
|
|
|
- self.defconfig,
|
|
|
- "Compiler is missing. Do nothing."),
|
|
|
- self.progress.inc()
|
|
|
- self.progress.show()
|
|
|
+ self.log += color_text(self.options.color, COLOR_YELLOW,
|
|
|
+ "Compiler is missing. Do nothing.\n")
|
|
|
+ self.show_log(sys.stderr)
|
|
|
if self.options.exit_on_error:
|
|
|
sys.exit("Exit on error.")
|
|
|
# If --exit-on-error flag is not set, skip this board and continue.
|
|
@@ -688,6 +683,22 @@ class Slot:
|
|
|
self.state = STATE_AUTOCONF
|
|
|
return False
|
|
|
|
|
|
+ def show_log(self, file=sys.stdout):
|
|
|
+ """Display log along with progress.
|
|
|
+
|
|
|
+ Arguments:
|
|
|
+ file: A file object to which the log string is sent.
|
|
|
+ """
|
|
|
+ # output at least 30 characters to hide the "* defconfigs out of *".
|
|
|
+ log = self.defconfig.ljust(30) + '\n'
|
|
|
+
|
|
|
+ log += '\n'.join([ ' ' + s for s in self.log.split('\n') ])
|
|
|
+ # Some threads are running in parallel.
|
|
|
+ # Print log atomically to not mix up logs from different threads.
|
|
|
+ print >> file, log
|
|
|
+ self.progress.inc()
|
|
|
+ self.progress.show()
|
|
|
+
|
|
|
def get_failed_boards(self):
|
|
|
"""Returns a list of failed boards (defconfigs) in this slot.
|
|
|
"""
|