[U-Boot] [PATCH v9 0/14] Add some missing buildman features and deprecate MAKEALL

Buildman has been around for a little over a year and is used by a fair number of U-Boot developers. However quite a few people still use MAKEALL.
Buildman was intended to replace MAKEALL, so perhaps now is a good time to start that process.
The reasons to deprecate MAKEALL are: - We don't want to maintain two build systems - Buildman is typically faster - Buildman has a lot more features
This series adds a few features to buildman to fill some gaps, adds some information into the README on how to migrate from MAKEALL, and adds a deprecation message to MAKEALL.
Changes in v9: - Add new patch to avoid changing the order of tags - Add new patch to set the return code to indicate build result - Add new patch to allow make-flags variables to include '-' and '_' - Add new patch to implement --exclude option - Add new patch to remove the directory prefix from each error line - Add new patch to support showing which boards caused which errors - Add new patch to separate out display of warnings and errors - Add new patch to fix detection of git version
Changes in v8: - Add new patch to disable the pager in git
Changes in v7: - Add new patch to fix the 'reverse' bug - Remove already-applied patches from the series - Add the deprecation message at the end of the build also - Drop the 'colour' patch sadly
Changes in v6: - Add new patch to fix indentation in teminal.py - Add new patch to fix patman unit tests - Add new patch to remove patman's -a option
Changes in v5: - Drop patch to search for *cc instead of *gcc for the compiler
Simon Glass (14): patman: Support the 'reverse' option for 'git log' patman: Fix indentation in terminal.py patman: Correct unit tests to run correctly patman: Remove the -a option patman: Use --no-pager' to stop git from forking a pager patman: Avoid changing the order of tags buildman: Set the return code to indicate build result buildman: Allow make-flags variables to include '-' and '_' buildman: Implement an option to exclude boards from the build buildman: Remove the directory prefix from each error line buildman: Add an option to show which boards caused which errors buildman: Separate out display of warnings and errors patman: Fix detection of git version RFC: Deprecate MAKEALL
MAKEALL | 10 +++ tools/buildman/README | 27 ++++++-- tools/buildman/board.py | 31 +++++++--- tools/buildman/builder.py | 133 ++++++++++++++++++++++++++++++++++------ tools/buildman/builderthread.py | 22 ++++++- tools/buildman/buildman.py | 8 ++- tools/buildman/control.py | 20 ++++-- tools/buildman/toolchain.py | 2 +- tools/patman/gitutil.py | 102 +++--------------------------- tools/patman/patchstream.py | 21 ++----- tools/patman/patman.py | 7 --- tools/patman/terminal.py | 112 +++++++++++++++++---------------- tools/patman/test.py | 13 ++-- 13 files changed, 298 insertions(+), 210 deletions(-)

This option is currently not supported, but needs to be, for buildman to operate as expected.
Reported-by: York Sun yorksun@freescale.com Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v9: None Changes in v8: None Changes in v7: - Add new patch to fix the 'reverse' bug
Changes in v6: None Changes in v5: None
tools/patman/gitutil.py | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/tools/patman/gitutil.py b/tools/patman/gitutil.py index 735c8dd..e2b4959 100644 --- a/tools/patman/gitutil.py +++ b/tools/patman/gitutil.py @@ -38,6 +38,8 @@ def LogCmd(commit_range, git_dir=None, oneline=False, reverse=False, cmd.append('--oneline') if use_no_decorate: cmd.append('--no-decorate') + if reverse: + cmd.append('--reverse') if count is not None: cmd.append('-n%d' % count) if commit_range:

This code came from a different project with 2-character indentation. Fix it for U-Boot.
Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v9: None Changes in v8: None Changes in v7: None Changes in v6: - Add new patch to fix indentation in teminal.py
Changes in v5: None
tools/patman/terminal.py | 108 ++++++++++++++++++++++++----------------------- 1 file changed, 55 insertions(+), 53 deletions(-)
diff --git a/tools/patman/terminal.py b/tools/patman/terminal.py index 597d526..11f80d8 100644 --- a/tools/patman/terminal.py +++ b/tools/patman/terminal.py @@ -15,66 +15,68 @@ import sys COLOR_IF_TERMINAL, COLOR_ALWAYS, COLOR_NEVER = range(3)
class Color(object): - """Conditionally wraps text in ANSI color escape sequences.""" - BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8) - BOLD = -1 - BRIGHT_START = '\033[1;%dm' - NORMAL_START = '\033[22;%dm' - BOLD_START = '\033[1m' - RESET = '\033[0m' + """Conditionally wraps text in ANSI color escape sequences.""" + BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8) + BOLD = -1 + BRIGHT_START = '\033[1;%dm' + NORMAL_START = '\033[22;%dm' + BOLD_START = '\033[1m' + RESET = '\033[0m'
- def __init__(self, colored=COLOR_IF_TERMINAL): - """Create a new Color object, optionally disabling color output. + def __init__(self, colored=COLOR_IF_TERMINAL): + """Create a new Color object, optionally disabling color output.
- Args: - enabled: True if color output should be enabled. If False then this - class will not add color codes at all. - """ - self._enabled = (colored == COLOR_ALWAYS or - (colored == COLOR_IF_TERMINAL and os.isatty(sys.stdout.fileno()))) + Args: + enabled: True if color output should be enabled. If False then this + class will not add color codes at all. + """ + self._enabled = (colored == COLOR_ALWAYS or + (colored == COLOR_IF_TERMINAL and os.isatty(sys.stdout.fileno())))
- def Start(self, color, bright=True): - """Returns a start color code. + def Start(self, color, bright=True): + """Returns a start color code.
- Args: - color: Color to use, .e.g BLACK, RED, etc. + Args: + color: Color to use, .e.g BLACK, RED, etc.
- Returns: - If color is enabled, returns an ANSI sequence to start the given color, - otherwise returns empty string - """ - if self._enabled: - base = self.BRIGHT_START if bright else self.NORMAL_START - return base % (color + 30) - return '' + Returns: + If color is enabled, returns an ANSI sequence to start the given + color, otherwise returns empty string + """ + if self._enabled: + base = self.BRIGHT_START if bright else self.NORMAL_START + return base % (color + 30) + return ''
- def Stop(self): - """Retruns a stop color code. + def Stop(self): + """Retruns a stop color code.
- Returns: - If color is enabled, returns an ANSI color reset sequence, otherwise - returns empty string - """ - if self._enabled: - return self.RESET - return '' + Returns: + If color is enabled, returns an ANSI color reset sequence, + otherwise returns empty string + """ + if self._enabled: + return self.RESET + return ''
- def Color(self, color, text, bright=True): - """Returns text with conditionally added color escape sequences. + def Color(self, color, text, bright=True): + """Returns text with conditionally added color escape sequences.
- Keyword arguments: - color: Text color -- one of the color constants defined in this class. - text: The text to color. + Keyword arguments: + color: Text color -- one of the color constants defined in this + class. + text: The text to color.
- Returns: - If self._enabled is False, returns the original text. If it's True, - returns text with color escape sequences based on the value of color. - """ - if not self._enabled: - return text - if color == self.BOLD: - start = self.BOLD_START - else: - base = self.BRIGHT_START if bright else self.NORMAL_START - start = base % (color + 30) - return start + text + self.RESET + Returns: + If self._enabled is False, returns the original text. If it's True, + returns text with color escape sequences based on the value of + color. + """ + if not self._enabled: + return text + if color == self.BOLD: + start = self.BOLD_START + else: + base = self.BRIGHT_START if bright else self.NORMAL_START + start = base % (color + 30) + return start + text + self.RESET

It seems that doctest behaves differently now, and some of the unit tests do not run. Adjust the tests to work correctly.
./tools/patman/patman --test <unittest.result.TestResult run=10 errors=0 failures=0>
Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v9: None Changes in v8: None Changes in v7: None Changes in v6: - Add new patch to fix patman unit tests
Changes in v5: None
tools/patman/gitutil.py | 8 ++++---- tools/patman/patchstream.py | 7 +++++-- tools/patman/terminal.py | 8 ++++++-- tools/patman/test.py | 13 +++++++------ 4 files changed, 22 insertions(+), 14 deletions(-)
diff --git a/tools/patman/gitutil.py b/tools/patman/gitutil.py index e2b4959..29e6fdd 100644 --- a/tools/patman/gitutil.py +++ b/tools/patman/gitutil.py @@ -478,13 +478,13 @@ def LookupEmail(lookup_name, alias=None, raise_on_error=True, level=0): ... OSError: Recursive email alias at 'other' >>> LookupEmail('odd', alias, raise_on_error=False) - \033[1;31mAlias 'odd' not found\033[0m + Alias 'odd' not found [] >>> # In this case the loop part will effectively be ignored. >>> LookupEmail('loop', alias, raise_on_error=False) - \033[1;31mRecursive email alias at 'other'\033[0m - \033[1;31mRecursive email alias at 'john'\033[0m - \033[1;31mRecursive email alias at 'mary'\033[0m + Recursive email alias at 'other' + Recursive email alias at 'john' + Recursive email alias at 'mary' ['j.bloggs@napier.co.nz', 'm.poppins@cloud.net'] """ if not alias: diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index 0040468..322374c 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -275,7 +275,7 @@ class PatchStream:
# Suppress duplicate signoffs elif signoff_match: - if (self.is_log or + if (self.is_log or not self.commit or self.commit.CheckDuplicateSignoff(signoff_match.group(1))): out = [line]
@@ -312,7 +312,10 @@ class PatchStream: out = [] log = self.series.MakeChangeLog(self.commit) out += self.FormatTags(self.tags) - out += [line] + self.commit.notes + [''] + log + out += [line] + if self.commit: + out += self.commit.notes + out += [''] + log elif self.found_test: if not re_allowed_after_test.match(line): self.lines_after_test += 1 diff --git a/tools/patman/terminal.py b/tools/patman/terminal.py index 11f80d8..963f2f8 100644 --- a/tools/patman/terminal.py +++ b/tools/patman/terminal.py @@ -30,8 +30,12 @@ class Color(object): enabled: True if color output should be enabled. If False then this class will not add color codes at all. """ - self._enabled = (colored == COLOR_ALWAYS or - (colored == COLOR_IF_TERMINAL and os.isatty(sys.stdout.fileno()))) + try: + self._enabled = (colored == COLOR_ALWAYS or + (colored == COLOR_IF_TERMINAL and + os.isatty(sys.stdout.fileno()))) + except: + self._enabled = False
def Start(self, color, bright=True): """Returns a start color code. diff --git a/tools/patman/test.py b/tools/patman/test.py index 8fcfe53..e8f7472 100644 --- a/tools/patman/test.py +++ b/tools/patman/test.py @@ -55,6 +55,7 @@ This adds functions to enable/disable clocks and reset to on-chip peripherals.
Signed-off-by: Simon Glass sjg@chromium.org --- + arch/arm/cpu/armv7/tegra2/Makefile | 2 +- arch/arm/cpu/armv7/tegra2/ap20.c | 57 ++---- arch/arm/cpu/armv7/tegra2/clock.c | 163 +++++++++++++++++ @@ -200,7 +201,7 @@ index 0000000..2234c87 self.assertEqual(result.errors, 0) self.assertEqual(result.warnings, 0) self.assertEqual(result.checks, 0) - self.assertEqual(result.lines, 67) + self.assertEqual(result.lines, 56) os.remove(inf)
def testNoSignoff(self): @@ -211,18 +212,18 @@ index 0000000..2234c87 self.assertEqual(result.errors, 1) self.assertEqual(result.warnings, 0) self.assertEqual(result.checks, 0) - self.assertEqual(result.lines, 67) + self.assertEqual(result.lines, 56) os.remove(inf)
def testSpaces(self): inf = self.SetupData('spaces') result = checkpatch.CheckPatch(inf) self.assertEqual(result.ok, False) - self.assertEqual(len(result.problems), 1) + self.assertEqual(len(result.problems), 2) self.assertEqual(result.errors, 0) - self.assertEqual(result.warnings, 1) + self.assertEqual(result.warnings, 2) self.assertEqual(result.checks, 0) - self.assertEqual(result.lines, 67) + self.assertEqual(result.lines, 56) os.remove(inf)
def testIndent(self): @@ -233,7 +234,7 @@ index 0000000..2234c87 self.assertEqual(result.errors, 0) self.assertEqual(result.warnings, 0) self.assertEqual(result.checks, 1) - self.assertEqual(result.lines, 67) + self.assertEqual(result.lines, 56) os.remove(inf)

It seems that this is no longer needed, since checkpatch.pl will catch whitespace problems in patches. Also the option is not widely used, so it seems safe to just remove it.
Suggested-by: Masahiro Yamada yamada.m@jp.panasonic.com Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v9: None Changes in v8: None Changes in v7: None Changes in v6: - Add new patch to remove patman's -a option
Changes in v5: None
tools/patman/gitutil.py | 88 ------------------------------------------------- tools/patman/patman.py | 7 ---- 2 files changed, 95 deletions(-)
diff --git a/tools/patman/gitutil.py b/tools/patman/gitutil.py index 29e6fdd..45276e6 100644 --- a/tools/patman/gitutil.py +++ b/tools/patman/gitutil.py @@ -215,94 +215,6 @@ def CreatePatches(start, count, series): else: return None, files
-def ApplyPatch(verbose, fname): - """Apply a patch with git am to test it - - TODO: Convert these to use command, with stderr option - - Args: - fname: filename of patch file to apply - """ - col = terminal.Color() - cmd = ['git', 'am', fname] - pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - stdout, stderr = pipe.communicate() - re_error = re.compile('^error: patch failed: (.+):(\d+)') - for line in stderr.splitlines(): - if verbose: - print line - match = re_error.match(line) - if match: - print checkpatch.GetWarningMsg(col, 'warning', match.group(1), - int(match.group(2)), 'Patch failed') - return pipe.returncode == 0, stdout - -def ApplyPatches(verbose, args, start_point): - """Apply the patches with git am to make sure all is well - - Args: - verbose: Print out 'git am' output verbatim - args: List of patch files to apply - start_point: Number of commits back from HEAD to start applying. - Normally this is len(args), but it can be larger if a start - offset was given. - """ - error_count = 0 - col = terminal.Color() - - # Figure out our current position - cmd = ['git', 'name-rev', 'HEAD', '--name-only'] - pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE) - stdout, stderr = pipe.communicate() - if pipe.returncode: - str = 'Could not find current commit name' - print col.Color(col.RED, str) - print stdout - return False - old_head = stdout.splitlines()[0] - if old_head == 'undefined': - str = "Invalid HEAD '%s'" % stdout.strip() - print col.Color(col.RED, str) - return False - - # Checkout the required start point - cmd = ['git', 'checkout', 'HEAD~%d' % start_point] - pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - stdout, stderr = pipe.communicate() - if pipe.returncode: - str = 'Could not move to commit before patch series' - print col.Color(col.RED, str) - print stdout, stderr - return False - - # Apply all the patches - for fname in args: - ok, stdout = ApplyPatch(verbose, fname) - if not ok: - print col.Color(col.RED, 'git am returned errors for %s: will ' - 'skip this patch' % fname) - if verbose: - print stdout - error_count += 1 - cmd = ['git', 'am', '--skip'] - pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE) - stdout, stderr = pipe.communicate() - if pipe.returncode != 0: - print col.Color(col.RED, 'Unable to skip patch! Aborting...') - print stdout - break - - # Return to our previous position - cmd = ['git', 'checkout', old_head] - pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stdout, stderr = pipe.communicate() - if pipe.returncode: - print col.Color(col.RED, 'Could not move back to head commit') - print stdout, stderr - return error_count == 0 - def BuildEmailList(in_list, tag=None, alias=None, raise_on_error=True): """Build a list of email addresses based on an input list.
diff --git a/tools/patman/patman.py b/tools/patman/patman.py index ca34cb9..5ab74fa 100755 --- a/tools/patman/patman.py +++ b/tools/patman/patman.py @@ -25,9 +25,6 @@ import test
parser = OptionParser() -parser.add_option('-a', '--no-apply', action='store_false', - dest='apply_patches', default=True, - help="Don't test-apply patches with git am") parser.add_option('-H', '--full-help', action='store_true', dest='full_help', default=False, help='Display the README file') parser.add_option('-c', '--count', dest='count', type='int', @@ -143,10 +140,6 @@ else: ok = checkpatch.CheckPatches(options.verbose, args) else: ok = True - if options.apply_patches: - if not gitutil.ApplyPatches(options.verbose, args, - options.count + options.start): - ok = False
cc_file = series.MakeCcFile(options.process_tags, cover_fname, not options.ignore_bad_tags)

In a headless environment the pager can apparently hang. We don't want a pager anyway so let's request that none be used.
Reported-by: Tom Rini trini@ti.com Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v9: None Changes in v8: - Add new patch to disable the pager in git
Changes in v7: None Changes in v6: None Changes in v5: None
tools/patman/gitutil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/patman/gitutil.py b/tools/patman/gitutil.py index 45276e6..fbd170f 100644 --- a/tools/patman/gitutil.py +++ b/tools/patman/gitutil.py @@ -33,7 +33,7 @@ def LogCmd(commit_range, git_dir=None, oneline=False, reverse=False, cmd = ['git'] if git_dir: cmd += ['--git-dir', git_dir] - cmd += ['log', '--no-color'] + cmd += ['--no-pager', 'log', '--no-color'] if oneline: cmd.append('--oneline') if use_no_decorate:

patman collects tags that it sees in the commit and places them nicely sorted at the end of the patch. However, this is not really necessary and in fact is apparently not desirable.
Suggested-by: Masahiro Yamada yamada.m@jp.panasonic.com Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v9: - Add new patch to avoid changing the order of tags
Changes in v8: None Changes in v7: None Changes in v6: None Changes in v5: None
tools/patman/patchstream.py | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-)
diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index 322374c..b0b8153 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -72,7 +72,6 @@ class PatchStream: self.in_change = 0 # Non-zero if we are in a change list self.blank_count = 0 # Number of blank lines stored up self.state = STATE_MSG_HEADER # What state are we in? - self.tags = [] # Tags collected, like Tested-by... self.signoff = [] # Contents of signoff line self.commit = None # Current commit
@@ -113,16 +112,6 @@ class PatchStream: self.series.AddCommit(self.commit) self.commit = None
- def FormatTags(self, tags): - out_list = [] - for tag in sorted(tags): - if tag.startswith('Cc:'): - tag_list = tag[4:].split(',') - out_list += gitutil.BuildEmailList(tag_list, 'Cc:') - else: - out_list.append(tag) - return out_list - def ProcessLine(self, line): """Process a single line of a patch file or commit log
@@ -271,7 +260,7 @@ class PatchStream: elif tag_match.group(1) == 'Patch-cc': self.commit.AddCc(tag_match.group(2).split(',')) else: - self.tags.append(line); + out = [line]
# Suppress duplicate signoffs elif signoff_match: @@ -311,7 +300,6 @@ class PatchStream: # Output the tags (signeoff first), then change list out = [] log = self.series.MakeChangeLog(self.commit) - out += self.FormatTags(self.tags) out += [line] if self.commit: out += self.commit.notes

When buildman finds errors/warnings when building, set the return code to indicate this.
Suggested-by: York Sun yorksun@freescale.com Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v9: - Add new patch to set the return code to indicate build result
Changes in v8: None Changes in v7: None Changes in v6: None Changes in v5: None
tools/buildman/README | 6 ++++++ tools/buildman/builder.py | 5 +++++ tools/buildman/buildman.py | 3 ++- tools/buildman/control.py | 9 +++++++-- 4 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/tools/buildman/README b/tools/buildman/README index d4e8404..d20508f 100644 --- a/tools/buildman/README +++ b/tools/buildman/README @@ -690,6 +690,12 @@ Other options
Buildman has various other command line options. Try --help to see them.
+When doing builds, Buildman's return code will reflect the overall result: + + 0 (success) No errors or warnings found + 128 Errors found + 129 Warnings found +
How to change from MAKEALL ========================== diff --git a/tools/buildman/builder.py b/tools/buildman/builder.py index a555bd8..106fde0 100644 --- a/tools/buildman/builder.py +++ b/tools/buildman/builder.py @@ -1031,6 +1031,10 @@ class Builder: value is Board object keep_outputs: True to save build output files verbose: Display build results as they are completed + Returns: + Tuple containing: + - number of boards that failed to build + - number of boards that issued warnings """ self.commit_count = len(commits) if commits else 1 self.commits = commits @@ -1060,3 +1064,4 @@ class Builder: self.out_queue.join() print self.ClearLine(0) + return (self.fail, self.warned) diff --git a/tools/buildman/buildman.py b/tools/buildman/buildman.py index e18859b..fbd3125 100755 --- a/tools/buildman/buildman.py +++ b/tools/buildman/buildman.py @@ -136,4 +136,5 @@ elif options.full_help:
# Build selected commits for selected boards else: - control.DoBuildman(options, args) + ret_code = control.DoBuildman(options, args) + sys.exit(ret_code) diff --git a/tools/buildman/control.py b/tools/buildman/control.py index d98e50a..239c423 100644 --- a/tools/buildman/control.py +++ b/tools/buildman/control.py @@ -94,7 +94,7 @@ def DoBuildman(options, args): if options.list_tool_chains: toolchains.List() print - return + return 0
# Work out how many commits to build. We want to build everything on the # branch. We also build the upstream commit as a control so we can see @@ -219,5 +219,10 @@ def DoBuildman(options, args): options.show_detail = True builder.ShowSummary(commits, board_selected) else: - builder.BuildBoards(commits, board_selected, + fail, warned = builder.BuildBoards(commits, board_selected, options.keep_outputs, options.verbose) + if fail: + return 128 + elif warned: + return 129 + return 0

These characters are commonly used in variables, so permit them. Also document the permitted characters.
Reported-by: Tom Rini trini@ti.com Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v9: - Add new patch to allow make-flags variables to include '-' and '_'
Changes in v8: None Changes in v7: None Changes in v6: None Changes in v5: None
tools/buildman/README | 4 +++- tools/buildman/toolchain.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/tools/buildman/README b/tools/buildman/README index d20508f..68465b4 100644 --- a/tools/buildman/README +++ b/tools/buildman/README @@ -670,7 +670,9 @@ snapper9g45=${at91-boards} BUILD_TAG=443 This will use 'make ENABLE_AT91_TEST=1 BUILD_TAG=442' for snapper9260 and 'make ENABLE_AT91_TEST=1 BUILD_TAG=443' for snapper9g45. A special variable ${target} is available to access the target name (snapper9260 and -snapper9g20 in this case). Variables are resolved recursively. +snapper9g20 in this case). Variables are resolved recursively. Note that +variables can only contain the characters A-Z, a-z, 0-9, hyphen (-) and +underscore (_).
It is expected that any variables added are dealt with in U-Boot's config.mk file and documented in the README. diff --git a/tools/buildman/toolchain.py b/tools/buildman/toolchain.py index 1b9771f..0e91294 100644 --- a/tools/buildman/toolchain.py +++ b/tools/buildman/toolchain.py @@ -198,7 +198,7 @@ class Toolchains: >>> tcs.ResolveReferences(var_dict, 'this=${oblique}_set${first}nd') 'this=OBLIQUE_setfi2ndrstnd' """ - re_var = re.compile('(${[a-z0-9A-Z]{1,}})') + re_var = re.compile('(${[-_a-z0-9A-Z]{1,}})')
while True: m = re_var.search(args)

Some boards are known to be broken and it is convenient to be able to exclude them from the build.
Add an --exclude option to specific boards to exclude. This uses the same matching rules as the normal 'include' arguments, and is a comma- separated list of regular expressions.
Suggested-by: York Sun yorksun@freescale.com Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v9: - Add new patch to implement --exclude option
Changes in v8: None Changes in v7: None Changes in v6: None Changes in v5: None
tools/buildman/README | 7 +++++++ tools/buildman/board.py | 31 ++++++++++++++++++++++++------- tools/buildman/buildman.py | 3 +++ tools/buildman/control.py | 8 +++++++- 4 files changed, 41 insertions(+), 8 deletions(-)
diff --git a/tools/buildman/README b/tools/buildman/README index 68465b4..b8c2bd6 100644 --- a/tools/buildman/README +++ b/tools/buildman/README @@ -114,6 +114,13 @@ the '&' operator to limit the selection: * 'freescale & arm sandbox' All Freescale boards with ARM architecture, plus sandbox
+You can also use -x to specifically exclude some boards. For example: + + buildmand arm -x nvidia,freescale,.*ball$ + +means to build all arm boards except nvidia, freescale and anything ending +with 'ball'. + It is convenient to use the -n option to see whaat will be built based on the subset given.
diff --git a/tools/buildman/board.py b/tools/buildman/board.py index a333287..5d536d5 100644 --- a/tools/buildman/board.py +++ b/tools/buildman/board.py @@ -239,13 +239,14 @@ class Boards: terms.append(term) return terms
- def SelectBoards(self, args): + def SelectBoards(self, args, exclude=[]): """Mark boards selected based on args
Args: - List of strings specifying boards to include, either named, or - by their target, architecture, cpu, vendor or soc. If empty, all - boards are selected. + args: List of strings specifying boards to include, either named, + or by their target, architecture, cpu, vendor or soc. If + empty, all boards are selected. + exclude: List of boards to exclude, regardless of 'args'
Returns: Dictionary which holds the number of boards which were selected @@ -258,17 +259,33 @@ class Boards: for term in terms: result[str(term)] = 0
+ exclude_list = [] + for expr in exclude: + exclude_list.append(Expr(expr)) + for board in self._boards: + matching_term = None + build_it = False if terms: match = False for term in terms: if term.Matches(board.props): - board.build_it = True - result[str(term)] += 1 - result['all'] += 1 + matching_term = str(term) + build_it = True break else: + build_it = True + + # Check that it is not specifically excluded + for expr in exclude_list: + if expr.Matches(board.props): + build_it = False + break + + if build_it: board.build_it = True + if matching_term: + result[matching_term] += 1 result['all'] += 1
return result diff --git a/tools/buildman/buildman.py b/tools/buildman/buildman.py index fbd3125..53592e5 100755 --- a/tools/buildman/buildman.py +++ b/tools/buildman/buildman.py @@ -117,6 +117,9 @@ parser.add_option('-u', '--show_unknown', action='store_true', default=False, help='Show boards with unknown build result') parser.add_option('-v', '--verbose', action='store_true', default=False, help='Show build results while the build progresses') +parser.add_option('-x', '--exclude', dest='exclude', + type='string', action='append', + help='Specify a list of boards to exclude, separated by comma')
parser.usage += """
diff --git a/tools/buildman/control.py b/tools/buildman/control.py index 239c423..7991c74 100644 --- a/tools/buildman/control.py +++ b/tools/buildman/control.py @@ -129,7 +129,13 @@ def DoBuildman(options, args):
boards = board.Boards() boards.ReadBoards(os.path.join(options.git, 'boards.cfg')) - why_selected = boards.SelectBoards(args) + + exclude = [] + if options.exclude: + for arg in options.exclude: + exclude += arg.split(',') + + why_selected = boards.SelectBoards(args, exclude) selected = boards.GetSelected() if not len(selected): sys.exit(col.Color(col.RED, 'No matching boards found'))

The full path is long and also includes buildman private directories. Clean this up, so that only a relative U-Boot path is shown.
This will change warnings like these:
/home/sjg/c/src/third_party/u-boot/buildman5/.bm-work/00/arch/sandbox/cpu/cpu.c: In function 'timer_get_us': /home/sjg/c/src/third_party/u-boot/buildman5/.bm-work/00/arch/sandbox/cpu/cpu.c:40:9: warning: unused variable 'i' [-Wunused-variable]
/home/sjg/c/src/third_party/u-boot/files/arch/sandbox/cpu/cpu.c: In function 'timer_get_us': /home/sjg/c/src/third_party/u-boot/files/arch/sandbox/cpu/cpu.c:40:9: warning: unused variable 'i' [-Wunused-variable]
to:
arch/sandbox/cpu/cpu.c: In function 'timer_get_us': arch/sandbox/cpu/cpu.c:40:9: warning: unused variable 'i' [-Wunused-variable]
Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v9: - Add new patch to remove the directory prefix from each error line
Changes in v8: None Changes in v7: None Changes in v6: None Changes in v5: None
tools/buildman/builderthread.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/tools/buildman/builderthread.py b/tools/buildman/builderthread.py index 8214662..7fb24bc 100644 --- a/tools/buildman/builderthread.py +++ b/tools/buildman/builderthread.py @@ -103,6 +103,23 @@ class BuilderThread(threading.Thread): return self.builder.do_make(commit, brd, stage, cwd, *args, **kwargs)
+ def _FilterOutDir(self, text, dirname): + """Filter out a directory name from each line of a block of text + + Args: + text: Text to process (can be multiple lines separated by \n) + dirname: Directory name to remove from the start of each text + line + Returns: + Filtered text. + """ + out = [] + for line in text.split('\n'): + if line.startswith(dirname): + line = line[len(dirname):] + out.append(line) + return '\n'.join(out) + def RunCommit(self, commit_upto, brd, work_dir, do_config, force_build, force_build_failures): """Build a particular commit. @@ -177,6 +194,7 @@ class BuilderThread(threading.Thread): Mkdir(out_dir) args = [] cwd = work_dir + src_dir = os.path.realpath(work_dir) if not self.builder.in_tree: if commit_upto is None: # In this case we are building in the original source @@ -189,6 +207,7 @@ class BuilderThread(threading.Thread): work_dir = os.path.realpath(work_dir) args.append('O=%s/build' % work_dir) cwd = None + src_dir = os.getcwd() else: args.append('O=build') args.append('-s') @@ -209,7 +228,8 @@ class BuilderThread(threading.Thread): if result.return_code == 0: result = self.Make(commit, brd, 'build', cwd, *args, env=env) - result.stdout = config_out + result.stdout + result.stderr = self._FilterOutDir(result.stderr, + src_dir + '/') else: result.return_code = 1 result.stderr = 'No tool chain for %s\n' % brd.arch

On Mon, Aug 25, 2014 at 09:58:31AM -0600, Simon Glass wrote:
The full path is long and also includes buildman private directories. Clean this up, so that only a relative U-Boot path is shown.
This is missing a global somewhere perhaps? I do buildman ... -o /tmp/username/toolchain/ and see things like: "In file included from /tmp/username/toolchain/master/.bm-work/00/..path in u-boot"
But other things are corrected.

Hi Tom,
On 26 August 2014 08:13, Tom Rini trini@ti.com wrote:
On Mon, Aug 25, 2014 at 09:58:31AM -0600, Simon Glass wrote:
The full path is long and also includes buildman private directories. Clean this up, so that only a relative U-Boot path is shown.
This is missing a global somewhere perhaps? I do buildman ... -o /tmp/username/toolchain/ and see things like: "In file included from /tmp/username/toolchain/master/.bm-work/00/..path in u-boot"
But other things are corrected.
Sorry, you've hit a case that isn't covered. I'll see if I can tweak it.
Regards, Simon

Add a -l option to display a list of offending boards against each error/warning line. The information will be shown in brackets as below:
02: wip sandbox: + sandbox arm: + seaboard +(sandbox) arch/sandbox/cpu/cpu.c: In function 'timer_get_us': +(sandbox) arch/sandbox/cpu/cpu.c:40:9: warning: unused variable 'i' [-Wunused-variable] +(seaboard) board/nvidia/seaboard/seaboard.c: In function 'pin_mux_mmc': +(seaboard) board/nvidia/seaboard/seaboard.c:36:9: warning: unused variable 'fred' [-Wunused-variable] +(seaboard) int fred; +(seaboard) ^
Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v9: - Add new patch to support showing which boards caused which errors
Changes in v8: None Changes in v7: None Changes in v6: None Changes in v5: None
tools/buildman/README | 7 ++++--- tools/buildman/builder.py | 51 ++++++++++++++++++++++++++++++++++++++-------- tools/buildman/buildman.py | 2 ++ tools/buildman/control.py | 3 ++- 4 files changed, 50 insertions(+), 13 deletions(-)
diff --git a/tools/buildman/README b/tools/buildman/README index b8c2bd6..fbc8449 100644 --- a/tools/buildman/README +++ b/tools/buildman/README @@ -442,7 +442,8 @@ is fixed, but there is a new one at line 126. This is probably only because we added some code and moved the broken line father down the file.
If many boards have the same error, then -e will display the error only -once. This makes the output as concise as possible. +once. This makes the output as concise as possible. To see which boards have +each error, use -l.
The full build output in this case is available in:
@@ -745,10 +746,10 @@ followed by (afterwards, or perhaps concurrently in another terminal): to see the results of the build. Rather than showing you all the output, buildman just shows a summary, with red indicating that a commit introduced an error and green indicating that a commit fixed an error. Use the -e -flag to see the full errors. +flag to see the full errors and -l to see which boards caused which errors.
If you really want to see build results as they happen, use -v when doing a -build (and -e if you want to see errors as well). +build (-e will be enabled automatically).
You don't need to stick around on that branch while buildman is running. It checks out its own copy of the source code, so you can change branches, diff --git a/tools/buildman/builder.py b/tools/buildman/builder.py index 106fde0..b90d7e1 100644 --- a/tools/buildman/builder.py +++ b/tools/buildman/builder.py @@ -237,18 +237,21 @@ class Builder: del t
def SetDisplayOptions(self, show_errors=False, show_sizes=False, - show_detail=False, show_bloat=False): + show_detail=False, show_bloat=False, + list_error_boards=False): """Setup display options for the builder.
show_errors: True to show summarised error/warning info show_sizes: Show size deltas show_detail: Show detail for each board show_bloat: Show detail for each function + list_error_boards: Show the boards which caused each error/warning """ self._show_errors = show_errors self._show_sizes = show_sizes self._show_detail = show_detail self._show_bloat = show_bloat + self._list_error_boards = list_error_boards
def _AddTimestamp(self): """Add a new timestamp to the list and record the build period. @@ -570,18 +573,26 @@ class Builder: Dict containing boards which passed building this commit. keyed by board.target List containing a summary of error/warning lines + Dict keyed by error line, containing a list of the Board + objects with that error """ board_dict = {} err_lines_summary = [] + err_lines_boards = {}
for board in boards_selected.itervalues(): outcome = self.GetBuildOutcome(commit_upto, board.target, read_func_sizes) board_dict[board.target] = outcome for err in outcome.err_lines: - if err and not err.rstrip() in err_lines_summary: - err_lines_summary.append(err.rstrip()) - return board_dict, err_lines_summary + if err: + err = err.rstrip() + if err in err_lines_boards: + err_lines_boards[err].append(board) + else: + err_lines_boards[err] = [board] + err_lines_summary.append(err.rstrip()) + return board_dict, err_lines_summary, err_lines_boards
def AddOutcome(self, board_dict, arch_list, changes, char, color): """Add an output to our list of outcomes for each architecture @@ -828,7 +839,8 @@ class Builder:
def PrintResultSummary(self, board_selected, board_dict, err_lines, - show_sizes, show_detail, show_bloat): + err_line_boards, show_sizes, show_detail, + show_bloat): """Compare results with the base results and display delta.
Only boards mentioned in board_selected will be considered. This @@ -843,10 +855,30 @@ class Builder: commit, keyed by board.target. The value is an Outcome object. err_lines: A list of errors for this commit, or [] if there is none, or we don't want to print errors + err_line_boards: Dict keyed by error line, containing a list of + the Board objects with that error show_sizes: Show image size deltas show_detail: Show detail for each board show_bloat: Show detail for each function """ + def _BoardList(line): + """Helper function to get a line of boards containing a line + + Args: + line: Error line to search for + Return: + String containing a list of boards with that error line, or + '' if the user has not requested such a list + """ + if self._list_error_boards: + names = [] + for board in err_line_boards[line]: + names.append(board.target) + names_str = '(%s) ' % ','.join(names) + else: + names_str = '' + return names_str + better = [] # List of boards fixed since last commit worse = [] # List of new broken boards since last commit new = [] # List of boards that didn't exist last time @@ -874,7 +906,7 @@ class Builder: worse_err = [] for line in err_lines: if line not in self._base_err_lines: - worse_err.append('+' + line) + worse_err.append('+' + _BoardList(line) + line) for line in self._base_err_lines: if line not in err_lines: better_err.append('-' + line) @@ -918,14 +950,15 @@ class Builder: ', '.join(not_built))
def ProduceResultSummary(self, commit_upto, commits, board_selected): - board_dict, err_lines = self.GetResultSummary(board_selected, - commit_upto, read_func_sizes=self._show_bloat) + board_dict, err_lines, err_line_boards = self.GetResultSummary( + board_selected, commit_upto, + read_func_sizes=self._show_bloat) if commits: msg = '%02d: %s' % (commit_upto + 1, commits[commit_upto].subject) print self.col.Color(self.col.BLUE, msg) self.PrintResultSummary(board_selected, board_dict, - err_lines if self._show_errors else [], + err_lines if self._show_errors else [], err_line_boards, self._show_sizes, self._show_detail, self._show_bloat)
def ShowSummary(self, commits, board_selected): diff --git a/tools/buildman/buildman.py b/tools/buildman/buildman.py index 53592e5..1258b76 100755 --- a/tools/buildman/buildman.py +++ b/tools/buildman/buildman.py @@ -94,6 +94,8 @@ parser.add_option('-j', '--jobs', dest='jobs', type='int', default=None, help='Number of jobs to run at once (passed to make)') parser.add_option('-k', '--keep-outputs', action='store_true', default=False, help='Keep all build output files (e.g. binaries)') +parser.add_option('-l', '--list-error-boards', action='store_true', + default=False, help='Show a list of boards next to each error/warning') parser.add_option('--list-tool-chains', action='store_true', default=False, help='List available tool chains') parser.add_option('-n', '--dry-run', action='store_true', dest='dry_run', diff --git a/tools/buildman/control.py b/tools/buildman/control.py index 7991c74..0785840 100644 --- a/tools/buildman/control.py +++ b/tools/buildman/control.py @@ -218,7 +218,8 @@ def DoBuildman(options, args): options)
builder.SetDisplayOptions(options.show_errors, options.show_sizes, - options.show_detail, options.show_bloat) + options.show_detail, options.show_bloat, + options.list_error_boards) if options.summary: # We can't show function sizes without board details at present if options.show_bloat:

On Mon, Aug 25, 2014 at 09:58:32AM -0600, Simon Glass wrote:
Add a -l option to display a list of offending boards against each error/warning line. The information will be shown in brackets as below:
02: wip sandbox: + sandbox arm: + seaboard +(sandbox) arch/sandbox/cpu/cpu.c: In function 'timer_get_us': +(sandbox) arch/sandbox/cpu/cpu.c:40:9: warning: unused variable 'i' [-Wunused-variable] +(seaboard) board/nvidia/seaboard/seaboard.c: In function 'pin_mux_mmc': +(seaboard) board/nvidia/seaboard/seaboard.c:36:9: warning: unused variable 'fred' [-Wunused-variable] +(seaboard) int fred; +(seaboard) ^
Signed-off-by: Simon Glass sjg@chromium.org
Doing buildman ... ; buildman ... -svl (since I want to spit out the summary at once due to how LSF mangles output to file), I don't see anything for what caused powerpc failures say (where there's lot of things complaining about generic board). So something isn't right, is this something you can reproduce locally? I'm going to make sure that -e really is implied like the doc says. Thanks!

On Mon, Aug 25, 2014 at 03:14:38PM -0400, Tom Rini wrote:
On Mon, Aug 25, 2014 at 09:58:32AM -0600, Simon Glass wrote:
Add a -l option to display a list of offending boards against each error/warning line. The information will be shown in brackets as below:
02: wip sandbox: + sandbox arm: + seaboard +(sandbox) arch/sandbox/cpu/cpu.c: In function 'timer_get_us': +(sandbox) arch/sandbox/cpu/cpu.c:40:9: warning: unused variable 'i' [-Wunused-variable] +(seaboard) board/nvidia/seaboard/seaboard.c: In function 'pin_mux_mmc': +(seaboard) board/nvidia/seaboard/seaboard.c:36:9: warning: unused variable 'fred' [-Wunused-variable] +(seaboard) int fred; +(seaboard) ^
Signed-off-by: Simon Glass sjg@chromium.org
Doing buildman ... ; buildman ... -svl (since I want to spit out the summary at once due to how LSF mangles output to file), I don't see anything for what caused powerpc failures say (where there's lot of things complaining about generic board). So something isn't right, is this something you can reproduce locally? I'm going to make sure that -e really is implied like the doc says. Thanks!
yeah, OK, the doc is wrong and it needs to have -e passed as well.

Hi Tom,
On 25 August 2014 13:14, Tom Rini trini@ti.com wrote:
On Mon, Aug 25, 2014 at 09:58:32AM -0600, Simon Glass wrote:
Add a -l option to display a list of offending boards against each error/warning line. The information will be shown in brackets as below:
02: wip sandbox: + sandbox arm: + seaboard +(sandbox) arch/sandbox/cpu/cpu.c: In function 'timer_get_us': +(sandbox) arch/sandbox/cpu/cpu.c:40:9: warning: unused variable 'i' [-Wunused-variable] +(seaboard) board/nvidia/seaboard/seaboard.c: In function 'pin_mux_mmc': +(seaboard) board/nvidia/seaboard/seaboard.c:36:9: warning: unused variable 'fred' [-Wunused-variable] +(seaboard) int fred; +(seaboard) ^
Signed-off-by: Simon Glass sjg@chromium.org
Doing buildman ... ; buildman ... -svl (since I want to spit out the summary at once due to how LSF mangles output to file), I don't see
What is -s?
anything for what caused powerpc failures say (where there's lot of things complaining about generic board). So something isn't right, is this something you can reproduce locally? I'm going to make sure that -e really is implied like the doc says. Thanks!
./tools/buildman/buildman -vl sandbox Building current source for 1 boards (1 thread, 4 jobs per thread) sandbox: + sandbox +(sandbox) arch/sandbox/cpu/cpu.c: In function ‘__udelay’: +(sandbox) arch/sandbox/cpu/cpu.c:36:5: error: unknown type name ‘oijew’ +(sandbox) arch/sandbox/cpu/cpu.c:37:2: error: conflicting types for ‘os_usleep’ +(sandbox) include/os.h:155:6: note: previous declaration of ‘os_usleep’ was here +(sandbox) make[2]: *** [arch/sandbox/cpu/cpu.o] Error 1 +(sandbox) make[1]: *** [arch/sandbox/cpu] Error 2 +(sandbox) make: *** [sub-make] Error 2 w+(sandbox) arch/sandbox/cpu/cpu.c: In function ‘do_reset’: w+(sandbox) arch/sandbox/cpu/cpu.c:27:13: warning: unused variable ‘i’ [-Wunused-variable] w+(sandbox) arch/sandbox/cpu/cpu.c:37:2: warning: parameter names (without types) in function declaration [enabled by default] 0 0 1 /1 sandbox
This shows warnings and errors, and -e is implied (but note you should test with both series - I pushed 'buildman5' to u-boot-x86.git just in case you only have one).
I might be able to repeat your problem, except for the LSF part. What command line are you using?
Regards, Simon

On Tue, Aug 26, 2014 at 08:59:52PM -0600, Simon Glass wrote:
Hi Tom,
On 25 August 2014 13:14, Tom Rini trini@ti.com wrote:
On Mon, Aug 25, 2014 at 09:58:32AM -0600, Simon Glass wrote:
Add a -l option to display a list of offending boards against each error/warning line. The information will be shown in brackets as below:
02: wip sandbox: + sandbox arm: + seaboard +(sandbox) arch/sandbox/cpu/cpu.c: In function 'timer_get_us': +(sandbox) arch/sandbox/cpu/cpu.c:40:9: warning: unused variable 'i' [-Wunused-variable] +(seaboard) board/nvidia/seaboard/seaboard.c: In function 'pin_mux_mmc': +(seaboard) board/nvidia/seaboard/seaboard.c:36:9: warning: unused variable 'fred' [-Wunused-variable] +(seaboard) int fred; +(seaboard) ^
Signed-off-by: Simon Glass sjg@chromium.org
Doing buildman ... ; buildman ... -svl (since I want to spit out the summary at once due to how LSF mangles output to file), I don't see
What is -s?
summary.
anything for what caused powerpc failures say (where there's lot of things complaining about generic board). So something isn't right, is this something you can reproduce locally? I'm going to make sure that -e really is implied like the doc says. Thanks!
./tools/buildman/buildman -vl sandbox Building current source for 1 boards (1 thread, 4 jobs per thread) sandbox: + sandbox +(sandbox) arch/sandbox/cpu/cpu.c: In function ‘__udelay’: +(sandbox) arch/sandbox/cpu/cpu.c:36:5: error: unknown type name ‘oijew’ +(sandbox) arch/sandbox/cpu/cpu.c:37:2: error: conflicting types for ‘os_usleep’ +(sandbox) include/os.h:155:6: note: previous declaration of ‘os_usleep’ was here +(sandbox) make[2]: *** [arch/sandbox/cpu/cpu.o] Error 1 +(sandbox) make[1]: *** [arch/sandbox/cpu] Error 2 +(sandbox) make: *** [sub-make] Error 2 w+(sandbox) arch/sandbox/cpu/cpu.c: In function ‘do_reset’: w+(sandbox) arch/sandbox/cpu/cpu.c:27:13: warning: unused variable ‘i’ [-Wunused-variable] w+(sandbox) arch/sandbox/cpu/cpu.c:37:2: warning: parameter names (without types) in function declaration [enabled by default] 0 0 1 /1 sandbox
This shows warnings and errors, and -e is implied (but note you should test with both series - I pushed 'buildman5' to u-boot-x86.git just in case you only have one).
I might be able to repeat your problem, except for the LSF part. What command line are you using?
I do: ./tools/buildman/buildman -b master -c 1 -T 1 -j 24 \ -o /tmp/trini/eldk521 -G ~/.buildman.eldk521 'arm|powerpc' ./tools/buildman/buildman -b master -c 1 -T 1 -j 24 \ -o /tmp/trini/eldk521 -G ~/.buildman.eldk521 'arm|powerpc' -svel
Doing '-svl' would omit the information I expected, adding in -e worked. I do it this way since LSF only lets me log raw stdout to a file so doing a build then a summary pass gives me more easily readable output.

Hi Tom,
On 28 August 2014 05:51, Tom Rini trini@ti.com wrote:
On Tue, Aug 26, 2014 at 08:59:52PM -0600, Simon Glass wrote:
Hi Tom,
On 25 August 2014 13:14, Tom Rini trini@ti.com wrote:
On Mon, Aug 25, 2014 at 09:58:32AM -0600, Simon Glass wrote:
Add a -l option to display a list of offending boards against each error/warning line. The information will be shown in brackets as below:
02: wip sandbox: + sandbox arm: + seaboard +(sandbox) arch/sandbox/cpu/cpu.c: In function 'timer_get_us': +(sandbox) arch/sandbox/cpu/cpu.c:40:9: warning: unused variable 'i' [-Wunused-variable] +(seaboard) board/nvidia/seaboard/seaboard.c: In function 'pin_mux_mmc': +(seaboard) board/nvidia/seaboard/seaboard.c:36:9: warning: unused variable 'fred' [-Wunused-variable] +(seaboard) int fred; +(seaboard) ^
Signed-off-by: Simon Glass sjg@chromium.org
Doing buildman ... ; buildman ... -svl (since I want to spit out the summary at once due to how LSF mangles output to file), I don't see
What is -s?
summary.
anything for what caused powerpc failures say (where there's lot of things complaining about generic board). So something isn't right, is this something you can reproduce locally? I'm going to make sure that -e really is implied like the doc says. Thanks!
./tools/buildman/buildman -vl sandbox Building current source for 1 boards (1 thread, 4 jobs per thread) sandbox: + sandbox +(sandbox) arch/sandbox/cpu/cpu.c: In function ‘__udelay’: +(sandbox) arch/sandbox/cpu/cpu.c:36:5: error: unknown type name ‘oijew’ +(sandbox) arch/sandbox/cpu/cpu.c:37:2: error: conflicting types for ‘os_usleep’ +(sandbox) include/os.h:155:6: note: previous declaration of ‘os_usleep’ was here +(sandbox) make[2]: *** [arch/sandbox/cpu/cpu.o] Error 1 +(sandbox) make[1]: *** [arch/sandbox/cpu] Error 2 +(sandbox) make: *** [sub-make] Error 2 w+(sandbox) arch/sandbox/cpu/cpu.c: In function ‘do_reset’: w+(sandbox) arch/sandbox/cpu/cpu.c:27:13: warning: unused variable ‘i’ [-Wunused-variable] w+(sandbox) arch/sandbox/cpu/cpu.c:37:2: warning: parameter names (without types) in function declaration [enabled by default] 0 0 1 /1 sandbox
This shows warnings and errors, and -e is implied (but note you should test with both series - I pushed 'buildman5' to u-boot-x86.git just in case you only have one).
I might be able to repeat your problem, except for the LSF part. What command line are you using?
I do: ./tools/buildman/buildman -b master -c 1 -T 1 -j 24 \ -o /tmp/trini/eldk521 -G ~/.buildman.eldk521 'arm|powerpc' ./tools/buildman/buildman -b master -c 1 -T 1 -j 24 \ -o /tmp/trini/eldk521 -G ~/.buildman.eldk521 'arm|powerpc' -svel
Doing '-svl' would omit the information I expected, adding in -e worked. I do it this way since LSF only lets me log raw stdout to a file so doing a build then a summary pass gives me more easily readable output.
OK I missed that you were doing two steps.
-v is only meaningful *without* -s: it makes the *build* verbose. When building, -v implies -e,
The summary (-s) is always verbose, so doesn't need -v.
Regards, Simon

On Sun, Aug 31, 2014 at 10:09:44PM -0700, Simon Glass wrote:
Hi Tom,
On 28 August 2014 05:51, Tom Rini trini@ti.com wrote:
On Tue, Aug 26, 2014 at 08:59:52PM -0600, Simon Glass wrote:
Hi Tom,
On 25 August 2014 13:14, Tom Rini trini@ti.com wrote:
On Mon, Aug 25, 2014 at 09:58:32AM -0600, Simon Glass wrote:
Add a -l option to display a list of offending boards against each error/warning line. The information will be shown in brackets as below:
02: wip sandbox: + sandbox arm: + seaboard +(sandbox) arch/sandbox/cpu/cpu.c: In function 'timer_get_us': +(sandbox) arch/sandbox/cpu/cpu.c:40:9: warning: unused variable 'i' [-Wunused-variable] +(seaboard) board/nvidia/seaboard/seaboard.c: In function 'pin_mux_mmc': +(seaboard) board/nvidia/seaboard/seaboard.c:36:9: warning: unused variable 'fred' [-Wunused-variable] +(seaboard) int fred; +(seaboard) ^
Signed-off-by: Simon Glass sjg@chromium.org
Doing buildman ... ; buildman ... -svl (since I want to spit out the summary at once due to how LSF mangles output to file), I don't see
What is -s?
summary.
anything for what caused powerpc failures say (where there's lot of things complaining about generic board). So something isn't right, is this something you can reproduce locally? I'm going to make sure that -e really is implied like the doc says. Thanks!
./tools/buildman/buildman -vl sandbox Building current source for 1 boards (1 thread, 4 jobs per thread) sandbox: + sandbox +(sandbox) arch/sandbox/cpu/cpu.c: In function ‘__udelay’: +(sandbox) arch/sandbox/cpu/cpu.c:36:5: error: unknown type name ‘oijew’ +(sandbox) arch/sandbox/cpu/cpu.c:37:2: error: conflicting types for ‘os_usleep’ +(sandbox) include/os.h:155:6: note: previous declaration of ‘os_usleep’ was here +(sandbox) make[2]: *** [arch/sandbox/cpu/cpu.o] Error 1 +(sandbox) make[1]: *** [arch/sandbox/cpu] Error 2 +(sandbox) make: *** [sub-make] Error 2 w+(sandbox) arch/sandbox/cpu/cpu.c: In function ‘do_reset’: w+(sandbox) arch/sandbox/cpu/cpu.c:27:13: warning: unused variable ‘i’ [-Wunused-variable] w+(sandbox) arch/sandbox/cpu/cpu.c:37:2: warning: parameter names (without types) in function declaration [enabled by default] 0 0 1 /1 sandbox
This shows warnings and errors, and -e is implied (but note you should test with both series - I pushed 'buildman5' to u-boot-x86.git just in case you only have one).
I might be able to repeat your problem, except for the LSF part. What command line are you using?
I do: ./tools/buildman/buildman -b master -c 1 -T 1 -j 24 \ -o /tmp/trini/eldk521 -G ~/.buildman.eldk521 'arm|powerpc' ./tools/buildman/buildman -b master -c 1 -T 1 -j 24 \ -o /tmp/trini/eldk521 -G ~/.buildman.eldk521 'arm|powerpc' -svel
Doing '-svl' would omit the information I expected, adding in -e worked. I do it this way since LSF only lets me log raw stdout to a file so doing a build then a summary pass gives me more easily readable output.
OK I missed that you were doing two steps.
-v is only meaningful *without* -s: it makes the *build* verbose. When building, -v implies -e,
The summary (-s) is always verbose, so doesn't need -v.
OK, but in step #2, -svl _doesn't_ give me information about what boards have what problem and -svel does. You're saying -sel should work too, but commit text (and help text?) says that -l implies -e, but it's not.

Hi Tom,
On 1 September 2014 04:23, Tom Rini trini@ti.com wrote:
On Sun, Aug 31, 2014 at 10:09:44PM -0700, Simon Glass wrote:
Hi Tom,
On 28 August 2014 05:51, Tom Rini trini@ti.com wrote:
On Tue, Aug 26, 2014 at 08:59:52PM -0600, Simon Glass wrote:
Hi Tom,
On 25 August 2014 13:14, Tom Rini trini@ti.com wrote:
On Mon, Aug 25, 2014 at 09:58:32AM -0600, Simon Glass wrote:
Add a -l option to display a list of offending boards against each error/warning line. The information will be shown in brackets as below:
02: wip sandbox: + sandbox arm: + seaboard +(sandbox) arch/sandbox/cpu/cpu.c: In function 'timer_get_us': +(sandbox) arch/sandbox/cpu/cpu.c:40:9: warning: unused variable 'i' [-Wunused-variable] +(seaboard) board/nvidia/seaboard/seaboard.c: In function 'pin_mux_mmc': +(seaboard) board/nvidia/seaboard/seaboard.c:36:9: warning: unused variable 'fred' [-Wunused-variable] +(seaboard) int fred; +(seaboard) ^
Signed-off-by: Simon Glass sjg@chromium.org
Doing buildman ... ; buildman ... -svl (since I want to spit out the summary at once due to how LSF mangles output to file), I don't see
What is -s?
summary.
anything for what caused powerpc failures say (where there's lot of things complaining about generic board). So something isn't right, is this something you can reproduce locally? I'm going to make sure that -e really is implied like the doc says. Thanks!
./tools/buildman/buildman -vl sandbox Building current source for 1 boards (1 thread, 4 jobs per thread) sandbox: + sandbox +(sandbox) arch/sandbox/cpu/cpu.c: In function ‘__udelay’: +(sandbox) arch/sandbox/cpu/cpu.c:36:5: error: unknown type name ‘oijew’ +(sandbox) arch/sandbox/cpu/cpu.c:37:2: error: conflicting types for ‘os_usleep’ +(sandbox) include/os.h:155:6: note: previous declaration of ‘os_usleep’ was here +(sandbox) make[2]: *** [arch/sandbox/cpu/cpu.o] Error 1 +(sandbox) make[1]: *** [arch/sandbox/cpu] Error 2 +(sandbox) make: *** [sub-make] Error 2 w+(sandbox) arch/sandbox/cpu/cpu.c: In function ‘do_reset’: w+(sandbox) arch/sandbox/cpu/cpu.c:27:13: warning: unused variable ‘i’ [-Wunused-variable] w+(sandbox) arch/sandbox/cpu/cpu.c:37:2: warning: parameter names (without types) in function declaration [enabled by default] 0 0 1 /1 sandbox
This shows warnings and errors, and -e is implied (but note you should test with both series - I pushed 'buildman5' to u-boot-x86.git just in case you only have one).
I might be able to repeat your problem, except for the LSF part. What command line are you using?
I do: ./tools/buildman/buildman -b master -c 1 -T 1 -j 24 \ -o /tmp/trini/eldk521 -G ~/.buildman.eldk521 'arm|powerpc' ./tools/buildman/buildman -b master -c 1 -T 1 -j 24 \ -o /tmp/trini/eldk521 -G ~/.buildman.eldk521 'arm|powerpc' -svel
Doing '-svl' would omit the information I expected, adding in -e worked. I do it this way since LSF only lets me log raw stdout to a file so doing a build then a summary pass gives me more easily readable output.
OK I missed that you were doing two steps.
-v is only meaningful *without* -s: it makes the *build* verbose. When building, -v implies -e,
The summary (-s) is always verbose, so doesn't need -v.
OK, but in step #2, -svl _doesn't_ give me information about what boards have what problem and -svel does. You're saying -sel should work too, but commit text (and help text?) says that -l implies -e, but it's not.
-v implies -e if you are building (no -s) -v means nothing if you are not building (-s)
I don't think -l implies anything. I suspect I have stuffed up something in the docs but I can't see what, so will await your response. Sorry for the trouble.
Regards, Simon

Some boards unfortunately build with warnings and it is useful to be able to easily distinguish the warnings from the errors.
Use a simple pattern match to categorise gcc output into warnings and errors, and display each separately. New warnings are shown in magenta (with a w+ prefix) and fixed warnings are shown in yellow with a w- prefix.
Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v9: - Add new patch to separate out display of warnings and errors
Changes in v8: None Changes in v7: None Changes in v6: None Changes in v5: None
tools/buildman/README | 3 ++ tools/buildman/builder.py | 105 ++++++++++++++++++++++++++++++++++++---------- 2 files changed, 85 insertions(+), 23 deletions(-)
diff --git a/tools/buildman/README b/tools/buildman/README index fbc8449..8ba19ec 100644 --- a/tools/buildman/README +++ b/tools/buildman/README @@ -445,6 +445,9 @@ If many boards have the same error, then -e will display the error only once. This makes the output as concise as possible. To see which boards have each error, use -l.
+Buildman tries to distinguish warnings from errors, and shows warning lines +separately with a 'w' prefix. + The full build output in this case is available in:
../lcd9b/12_of_18_gd92aff7_lcd--Add-support-for/lubbock/ diff --git a/tools/buildman/builder.py b/tools/buildman/builder.py index b90d7e1..40cb8cc 100644 --- a/tools/buildman/builder.py +++ b/tools/buildman/builder.py @@ -140,6 +140,7 @@ class Builder: Private members: _base_board_dict: Last-summarised Dict of boards _base_err_lines: Last-summarised list of errors + _base_warn_lines: Last-summarised list of warnings _build_period_us: Time taken for a single build (float object). _complete_delay: Expected delay until completion (timedelta) _next_delay_update: Next time we plan to display a progress update @@ -214,6 +215,9 @@ class Builder:
self.col = terminal.Color()
+ self._re_function = re.compile('(.*): In function.*') + self._re_warning = re.compile('(.*):(\d*):(\d*): warning: .*') + self.queue = Queue.Queue() self.out_queue = Queue.Queue() for i in range(self.num_threads): @@ -572,27 +576,53 @@ class Builder: Tuple: Dict containing boards which passed building this commit. keyed by board.target - List containing a summary of error/warning lines + List containing a summary of error lines Dict keyed by error line, containing a list of the Board objects with that error + List containing a summary of warning lines + Dict keyed by error line, containing a list of the Board + objects with that warning """ + def AddLine(lines_summary, lines_boards, line, board): + line = line.rstrip() + if line in lines_boards: + lines_boards[line].append(board) + else: + lines_boards[line] = [board] + lines_summary.append(line) + board_dict = {} err_lines_summary = [] err_lines_boards = {} + warn_lines_summary = [] + warn_lines_boards = {}
for board in boards_selected.itervalues(): outcome = self.GetBuildOutcome(commit_upto, board.target, read_func_sizes) board_dict[board.target] = outcome - for err in outcome.err_lines: - if err: - err = err.rstrip() - if err in err_lines_boards: - err_lines_boards[err].append(board) + last_func = None + for line in outcome.err_lines: + if line: + if self._re_function.match(line): + last_func = line else: - err_lines_boards[err] = [board] - err_lines_summary.append(err.rstrip()) - return board_dict, err_lines_summary, err_lines_boards + is_error = not self._re_warning.match(line) + if is_error: + if last_func: + AddLine(err_lines_summary, err_lines_boards, + last_func, board) + AddLine(err_lines_summary, err_lines_boards, + line, board) + else: + if last_func: + AddLine(warn_lines_summary, warn_lines_boards, + last_func, board) + AddLine(warn_lines_summary, warn_lines_boards, + line, board) + last_func = None + return (board_dict, err_lines_summary, err_lines_boards, + warn_lines_summary, warn_lines_boards)
def AddOutcome(self, board_dict, arch_list, changes, char, color): """Add an output to our list of outcomes for each architecture @@ -647,6 +677,9 @@ class Builder: for board in board_selected: self._base_board_dict[board] = Builder.Outcome(0, [], [], {}) self._base_err_lines = [] + self._base_warn_lines = [] + self._base_err_line_boards = {} + self._base_warn_line_boards = {}
def PrintFuncSizeDetail(self, fname, old, new): grow, shrink, add, remove, up, down = 0, 0, 0, 0, 0, 0 @@ -839,8 +872,8 @@ class Builder:
def PrintResultSummary(self, board_selected, board_dict, err_lines, - err_line_boards, show_sizes, show_detail, - show_bloat): + err_line_boards, warn_lines, warn_line_boards, + show_sizes, show_detail, show_bloat): """Compare results with the base results and display delta.
Only boards mentioned in board_selected will be considered. This @@ -857,11 +890,15 @@ class Builder: none, or we don't want to print errors err_line_boards: Dict keyed by error line, containing a list of the Board objects with that error + warn_lines: A list of warnings for this commit, or [] if there is + none, or we don't want to print errors + warn_line_boards: Dict keyed by warning line, containing a list of + the Board objects with that warning show_sizes: Show image size deltas show_detail: Show detail for each board show_bloat: Show detail for each function """ - def _BoardList(line): + def _BoardList(line, line_boards): """Helper function to get a line of boards containing a line
Args: @@ -872,13 +909,27 @@ class Builder: """ if self._list_error_boards: names = [] - for board in err_line_boards[line]: + for board in line_boards[line]: names.append(board.target) names_str = '(%s) ' % ','.join(names) else: names_str = '' return names_str
+ def _CalcErrorDelta(base_lines, base_line_boards, lines, line_boards, + char): + better_lines = [] + worse_lines = [] + for line in lines: + if line not in base_lines: + worse_lines.append(char + '+' + + _BoardList(line, line_boards) + line) + for line in base_lines: + if line not in lines: + better_lines.append(char + '-' + + _BoardList(line, base_line_boards) + line) + return better_lines, worse_lines + better = [] # List of boards fixed since last commit worse = [] # List of new broken boards since last commit new = [] # List of boards that didn't exist last time @@ -902,17 +953,14 @@ class Builder: new.append(target)
# Get a list of errors that have appeared, and disappeared - better_err = [] - worse_err = [] - for line in err_lines: - if line not in self._base_err_lines: - worse_err.append('+' + _BoardList(line) + line) - for line in self._base_err_lines: - if line not in err_lines: - better_err.append('-' + line) + better_err, worse_err = _CalcErrorDelta(self._base_err_lines, + self._base_err_line_boards, err_lines, err_line_boards, '') + better_warn, worse_warn = _CalcErrorDelta(self._base_warn_lines, + self._base_warn_line_boards, warn_lines, warn_line_boards, 'w')
# Display results by arch - if better or worse or unknown or new or worse_err or better_err: + if (better or worse or unknown or new or worse_err or better_err + or worse_warn or better_warn): arch_list = {} self.AddOutcome(board_selected, arch_list, better, '', self.col.GREEN) @@ -931,6 +979,12 @@ class Builder: if worse_err: print self.col.Color(self.col.RED, '\n'.join(worse_err)) self._error_lines += 1 + if better_warn: + print self.col.Color(self.col.YELLOW, '\n'.join(better_warn)) + self._error_lines += 1 + if worse_warn: + print self.col.Color(self.col.MAGENTA, '\n'.join(worse_warn)) + self._error_lines += 1
if show_sizes: self.PrintSizeSummary(board_selected, board_dict, show_detail, @@ -939,6 +993,9 @@ class Builder: # Save our updated information for the next call to this function self._base_board_dict = board_dict self._base_err_lines = err_lines + self._base_warn_lines = warn_lines + self._base_err_line_boards = err_line_boards + self._base_warn_line_boards = warn_line_boards
# Get a list of boards that did not get built, if needed not_built = [] @@ -950,7 +1007,8 @@ class Builder: ', '.join(not_built))
def ProduceResultSummary(self, commit_upto, commits, board_selected): - board_dict, err_lines, err_line_boards = self.GetResultSummary( + (board_dict, err_lines, err_line_boards, warn_lines, + warn_line_boards) = self.GetResultSummary( board_selected, commit_upto, read_func_sizes=self._show_bloat) if commits: @@ -959,6 +1017,7 @@ class Builder: print self.col.Color(self.col.BLUE, msg) self.PrintResultSummary(board_selected, board_dict, err_lines if self._show_errors else [], err_line_boards, + warn_lines if self._show_errors else [], warn_line_boards, self._show_sizes, self._show_detail, self._show_bloat)
def ShowSummary(self, commits, board_selected):

A missing 'global' declaration means that this feature does not currently work. Fix it.
Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v9: - Add new patch to fix detection of git version
Changes in v8: None Changes in v7: None Changes in v6: None Changes in v5: None
tools/patman/gitutil.py | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/tools/patman/gitutil.py b/tools/patman/gitutil.py index fbd170f..80edc7c 100644 --- a/tools/patman/gitutil.py +++ b/tools/patman/gitutil.py @@ -481,6 +481,8 @@ def GetDefaultUserEmail(): def Setup(): """Set up git utils, by reading the alias files.""" # Check for a git alias file also + global use_no_decorate + alias_fname = GetAliasFile() if alias_fname: settings.ReadGitAliases(alias_fname)

Since buildman now includes most of the features of MAKEALL it is probably time to talk about deprecating MAKEALL.
Comments welcome.
Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v9: None Changes in v8: None Changes in v7: - Remove already-applied patches from the series - Add the deprecation message at the end of the build also - Drop the 'colour' patch sadly
Changes in v6: None Changes in v5: - Drop patch to search for *cc instead of *gcc for the compiler
MAKEALL | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/MAKEALL b/MAKEALL index 392ea8d..2321df0 100755 --- a/MAKEALL +++ b/MAKEALL @@ -60,6 +60,14 @@ usage() exit ${ret} }
+deprecation() { + echo "** Note: MAKEALL is deprecated - please use buildman instead" + echo "** See tools/buildman/README for details" + echo +} + +deprecation + SHORT_OPTS="ha:c:v:s:b:lmMCnr" LONG_OPTS="help,arch:,cpu:,vendor:,soc:,board:,list,maintainers,mails,check,continue,rebuild-errors"
@@ -849,6 +857,8 @@ print_stats() { kill_children fi
+ deprecation + exit $RC }

On Mon, Aug 25, 2014 at 09:58:21AM -0600, Simon Glass wrote:
Buildman has been around for a little over a year and is used by a fair number of U-Boot developers. However quite a few people still use MAKEALL.
Buildman was intended to replace MAKEALL, so perhaps now is a good time to start that process.
The reasons to deprecate MAKEALL are:
- We don't want to maintain two build systems
- Buildman is typically faster
- Buildman has a lot more features
This series adds a few features to buildman to fill some gaps, adds some information into the README on how to migrate from MAKEALL, and adds a deprecation message to MAKEALL.
I'm testing this out again in the Ubuntu 10.04 / LSF environment I have access to but so far I'm still finding that test for --no-decorate isn't working and I have to manually set it to False.

Hi Tom,
On 25 August 2014 12:54, Tom Rini trini@ti.com wrote:
On Mon, Aug 25, 2014 at 09:58:21AM -0600, Simon Glass wrote:
Buildman has been around for a little over a year and is used by a fair number of U-Boot developers. However quite a few people still use MAKEALL.
Buildman was intended to replace MAKEALL, so perhaps now is a good time to start that process.
The reasons to deprecate MAKEALL are:
- We don't want to maintain two build systems
- Buildman is typically faster
- Buildman has a lot more features
This series adds a few features to buildman to fill some gaps, adds some information into the README on how to migrate from MAKEALL, and adds a deprecation message to MAKEALL.
I'm testing this out again in the Ubuntu 10.04 / LSF environment I have access to but so far I'm still finding that test for --no-decorate isn't working and I have to manually set it to False.
Oh dear. I wrote a test for this in the second series. So if you apply that series, do the tests pass? It is in func_test.py and is called testGitSetup().
Regards, Simon

On Mon, Aug 25, 2014 at 01:00:05PM -0600, Simon Glass wrote:
Hi Tom,
On 25 August 2014 12:54, Tom Rini trini@ti.com wrote:
On Mon, Aug 25, 2014 at 09:58:21AM -0600, Simon Glass wrote:
Buildman has been around for a little over a year and is used by a fair number of U-Boot developers. However quite a few people still use MAKEALL.
Buildman was intended to replace MAKEALL, so perhaps now is a good time to start that process.
The reasons to deprecate MAKEALL are:
- We don't want to maintain two build systems
- Buildman is typically faster
- Buildman has a lot more features
This series adds a few features to buildman to fill some gaps, adds some information into the README on how to migrate from MAKEALL, and adds a deprecation message to MAKEALL.
I'm testing this out again in the Ubuntu 10.04 / LSF environment I have access to but so far I'm still finding that test for --no-decorate isn't working and I have to manually set it to False.
Oh dear. I wrote a test for this in the second series. So if you apply that series, do the tests pass? It is in func_test.py and is called testGitSetup().
With my local kludge removed yes, all tests pass.

Hi Tom,
On 25 August 2014 14:21, Tom Rini trini@ti.com wrote:
On Mon, Aug 25, 2014 at 01:00:05PM -0600, Simon Glass wrote:
Hi Tom,
On 25 August 2014 12:54, Tom Rini trini@ti.com wrote:
On Mon, Aug 25, 2014 at 09:58:21AM -0600, Simon Glass wrote:
Buildman has been around for a little over a year and is used by a fair number of U-Boot developers. However quite a few people still use MAKEALL.
Buildman was intended to replace MAKEALL, so perhaps now is a good time to start that process.
The reasons to deprecate MAKEALL are:
- We don't want to maintain two build systems
- Buildman is typically faster
- Buildman has a lot more features
This series adds a few features to buildman to fill some gaps, adds some information into the README on how to migrate from MAKEALL, and adds a deprecation message to MAKEALL.
I'm testing this out again in the Ubuntu 10.04 / LSF environment I have access to but so far I'm still finding that test for --no-decorate isn't working and I have to manually set it to False.
Oh dear. I wrote a test for this in the second series. So if you apply that series, do the tests pass? It is in func_test.py and is called testGitSetup().
With my local kludge removed yes, all tests pass.
It's quite mysterious. I installed Ubuntu 10.04 and it runs python 2.6.5.
The --no-decorate patch does work, although it does print an error. I could suppress that easily enough, just adding another arg 'capture_stderr=True' to the RunPipe() call in gitutil.py.Setup().
I see a problem with timedelta not having total_seconds. After that the threading dies. So I'm quite impressed you can get buildman to run at all. Are you using one of the later 10.04 releases?
Regards, Simon

On Tue, Aug 26, 2014 at 08:54:03PM -0600, Simon Glass wrote:
Hi Tom,
On 25 August 2014 14:21, Tom Rini trini@ti.com wrote:
On Mon, Aug 25, 2014 at 01:00:05PM -0600, Simon Glass wrote:
Hi Tom,
On 25 August 2014 12:54, Tom Rini trini@ti.com wrote:
On Mon, Aug 25, 2014 at 09:58:21AM -0600, Simon Glass wrote:
Buildman has been around for a little over a year and is used by a fair number of U-Boot developers. However quite a few people still use MAKEALL.
Buildman was intended to replace MAKEALL, so perhaps now is a good time to start that process.
The reasons to deprecate MAKEALL are:
- We don't want to maintain two build systems
- Buildman is typically faster
- Buildman has a lot more features
This series adds a few features to buildman to fill some gaps, adds some information into the README on how to migrate from MAKEALL, and adds a deprecation message to MAKEALL.
I'm testing this out again in the Ubuntu 10.04 / LSF environment I have access to but so far I'm still finding that test for --no-decorate isn't working and I have to manually set it to False.
Oh dear. I wrote a test for this in the second series. So if you apply that series, do the tests pass? It is in func_test.py and is called testGitSetup().
With my local kludge removed yes, all tests pass.
It's quite mysterious. I installed Ubuntu 10.04 and it runs python 2.6.5.
The --no-decorate patch does work, although it does print an error. I could suppress that easily enough, just adding another arg 'capture_stderr=True' to the RunPipe() call in gitutil.py.Setup().
I see a problem with timedelta not having total_seconds. After that the threading dies. So I'm quite impressed you can get buildman to run at all. Are you using one of the later 10.04 releases?
*shakes fist at corporate IT*
The box I use to launch jobs is Ubuntu 10.04.4. The boxes the jobs run on are actually Ubuntu 12.04.1 (I had assumed it was all the same for some reason.
They also have git 1.7.9.5.

Hi Tom,
On 28 August 2014 05:48, Tom Rini trini@ti.com wrote:
On Tue, Aug 26, 2014 at 08:54:03PM -0600, Simon Glass wrote:
Hi Tom,
On 25 August 2014 14:21, Tom Rini trini@ti.com wrote:
On Mon, Aug 25, 2014 at 01:00:05PM -0600, Simon Glass wrote:
Hi Tom,
On 25 August 2014 12:54, Tom Rini trini@ti.com wrote:
On Mon, Aug 25, 2014 at 09:58:21AM -0600, Simon Glass wrote:
Buildman has been around for a little over a year and is used by a fair number of U-Boot developers. However quite a few people still use MAKEALL.
Buildman was intended to replace MAKEALL, so perhaps now is a good time to start that process.
The reasons to deprecate MAKEALL are:
- We don't want to maintain two build systems
- Buildman is typically faster
- Buildman has a lot more features
This series adds a few features to buildman to fill some gaps, adds some information into the README on how to migrate from MAKEALL, and adds a deprecation message to MAKEALL.
I'm testing this out again in the Ubuntu 10.04 / LSF environment I have access to but so far I'm still finding that test for --no-decorate isn't working and I have to manually set it to False.
Oh dear. I wrote a test for this in the second series. So if you apply that series, do the tests pass? It is in func_test.py and is called testGitSetup().
With my local kludge removed yes, all tests pass.
It's quite mysterious. I installed Ubuntu 10.04 and it runs python 2.6.5.
The --no-decorate patch does work, although it does print an error. I could suppress that easily enough, just adding another arg 'capture_stderr=True' to the RunPipe() call in gitutil.py.Setup().
I see a problem with timedelta not having total_seconds. After that the threading dies. So I'm quite impressed you can get buildman to run at all. Are you using one of the later 10.04 releases?
*shakes fist at corporate IT*
The box I use to launch jobs is Ubuntu 10.04.4. The boxes the jobs run on are actually Ubuntu 12.04.1 (I had assumed it was all the same for some reason.
They also have git 1.7.9.5.
Well they obviously can't make it *too* easy. So where does this leave us in trying to figure this out?
Regards, Simon

Hi Tom,
On 31 August 2014 23:07, Simon Glass sjg@chromium.org wrote:
Hi Tom,
On 28 August 2014 05:48, Tom Rini trini@ti.com wrote:
On Tue, Aug 26, 2014 at 08:54:03PM -0600, Simon Glass wrote:
Hi Tom,
On 25 August 2014 14:21, Tom Rini trini@ti.com wrote:
On Mon, Aug 25, 2014 at 01:00:05PM -0600, Simon Glass wrote:
Hi Tom,
On 25 August 2014 12:54, Tom Rini trini@ti.com wrote:
On Mon, Aug 25, 2014 at 09:58:21AM -0600, Simon Glass wrote:
> Buildman has been around for a little over a year and is used by
a fair
> number of U-Boot developers. However quite a few people still use
MAKEALL.
> > Buildman was intended to replace MAKEALL, so perhaps now is a
good time to
> start that process. > > The reasons to deprecate MAKEALL are: > - We don't want to maintain two build systems > - Buildman is typically faster > - Buildman has a lot more features > > This series adds a few features to buildman to fill some gaps,
adds some
> information into the README on how to migrate from MAKEALL, and
adds a
> deprecation message to MAKEALL.
I'm testing this out again in the Ubuntu 10.04 / LSF environment I
have
access to but so far I'm still finding that test for --no-decorate
isn't
working and I have to manually set it to False.
Oh dear. I wrote a test for this in the second series. So if you
apply
that series, do the tests pass? It is in func_test.py and is called testGitSetup().
With my local kludge removed yes, all tests pass.
It's quite mysterious. I installed Ubuntu 10.04 and it runs python
2.6.5.
The --no-decorate patch does work, although it does print an error. I could suppress that easily enough, just adding another arg 'capture_stderr=True' to the RunPipe() call in gitutil.py.Setup().
I see a problem with timedelta not having total_seconds. After that the threading dies. So I'm quite impressed you can get buildman to run at all. Are you using one of the later 10.04 releases?
*shakes fist at corporate IT*
The box I use to launch jobs is Ubuntu 10.04.4. The boxes the jobs run on are actually Ubuntu 12.04.1 (I had assumed it was all the same for some reason.
They also have git 1.7.9.5.
Well they obviously can't make it *too* easy. So where does this leave us in trying to figure this out?
It feels like we should probably get the current patches in and see where this leaves us. I'll work on a pull request, unless you think we should wait.
Regards, Simon
participants (2)
-
Simon Glass
-
Tom Rini