[U-Boot] [PATCH v10 02/14] patman: Fix indentation in terminal.py

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 v10: None 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 v10: None 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)

Applied to u-boot-x86 branch 'patman'

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 v10: None 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)

Applied to u-boot-x86 branch 'patman'

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 v10: None 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:

Applied to u-boot-x86 branch 'patman'

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 v10: None 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

2014-08-29 0:43 GMT+09:00 Simon Glass sjg@chromium.org:
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
Tested-by: Masahiro Yamada yamada.m@jp.panasonic.com

Applied to u-boot-x86 branch 'patman'

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 v10: None 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

Applied to u-boot-x86 branch 'patman'

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 v10: None 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)

Applied to u-boot-x86 branch 'patman'

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 v10: None 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'))

Applied to u-boot-x86 branch 'patman'

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 v10: - Remove the directory prefix more aggressively
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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/tools/buildman/builderthread.py b/tools/buildman/builderthread.py index 8214662..0246375 100644 --- a/tools/buildman/builderthread.py +++ b/tools/buildman/builderthread.py @@ -177,6 +177,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 +190,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 +211,7 @@ 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 = result.stderr.replace(src_dir + '/', '') else: result.return_code = 1 result.stderr = 'No tool chain for %s\n' % brd.arch

Applied to u-boot-x86 branch 'patman'

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 v10: None 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 Thu, Aug 28, 2014 at 09:43:43AM -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:
[snip]
diff --git a/tools/buildman/README b/tools/buildman/README index b8c2bd6..fbc8449 100644 --- a/tools/buildman/README +++ b/tools/buildman/README
[snip]
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).
OK, so here is my confusion. I didn't get from the help that -s implies -v. If I do: -s -v -e -l I get a verbose summary with per-board warning/error information. If I do: -s -v -l I don't get that information. If I follow what you're saying and the help right, I should do: $ export COMMON="-b master -c 1 -T 1 -j 24 -o /tmp/trini/eldk521 -G ~/.buildman.eldk521" $ ./tools/buildman/buildman $COMMON 'arm|powerpc' $ ./tools/buildman/buildman $COMMON 'arm|powerpc' -s
And that should give me errors as well as which boards gave which?

Hi Tom,
On 2 September 2014 06:36, Tom Rini trini@ti.com wrote:
On Thu, Aug 28, 2014 at 09:43:43AM -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:
[snip]
diff --git a/tools/buildman/README b/tools/buildman/README index b8c2bd6..fbc8449 100644 --- a/tools/buildman/README +++ b/tools/buildman/README
[snip]
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).
OK, so here is my confusion. I didn't get from the help that -s implies -v. If I do: -s -v -e -l I get a verbose summary with per-board warning/error information. If I do: -s -v -l I don't get that information. If I follow what you're saying and the help right, I should do: $ export COMMON="-b master -c 1 -T 1 -j 24 -o /tmp/trini/eldk521 -G ~/.buildman.eldk521" $ ./tools/buildman/buildman $COMMON 'arm|powerpc' $ ./tools/buildman/buildman $COMMON 'arm|powerpc' -s
And that should give me errors as well as which boards gave which?
I don't think that's quite right. There are two completely separate modes for buildman:
building (no -s) not building (-s)
I added the -v feature to let you see build results while building. So -v only applies to the 'building' mode, and implies -e.
For the 'not building' mode, you get a basic summary for free, and can tell buildman all sorts of things you want to see - like errors (-e) sizes (-S) function bloat (-B) and list of broken boards (-l)
Regards, Simon

Applied to u-boot-x86 branch 'patman'

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 v10: - Track prefixes and postfixes for warnings/errors
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 | 111 ++++++++++++++++++++++++++++++++++++---------- 2 files changed, 91 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..324239a 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,11 @@ class Builder:
self.col = terminal.Color()
+ self._re_function = re.compile('(.*): In function.*') + self._re_files = re.compile('In file included from.*') + self._re_warning = re.compile('(.*):(\d*):(\d*): warning: .*') + self._re_note = re.compile('(.*):(\d*):(\d*): note: this is the location of the previous.*') + self.queue = Queue.Queue() self.out_queue = Queue.Queue() for i in range(self.num_threads): @@ -572,27 +578,57 @@ 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 + last_was_warning = False + for line in outcome.err_lines: + if line: + if (self._re_function.match(line) or + self._re_files.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_warning = self._re_warning.match(line) + is_note = self._re_note.match(line) + if is_warning or (last_was_warning and is_note): + if last_func: + AddLine(warn_lines_summary, warn_lines_boards, + last_func, board) + AddLine(warn_lines_summary, warn_lines_boards, + line, board) + else: + if last_func: + AddLine(err_lines_summary, err_lines_boards, + last_func, board) + AddLine(err_lines_summary, err_lines_boards, + line, board) + last_was_warning = is_warning + 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 +683,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 +878,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 +896,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 +915,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 +959,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 +985,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 +999,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 +1013,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 +1023,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):

Applied to u-boot-x86 branch 'patman'

A missing 'global' declaration means that this feature does not currently work. Fix it.
Signed-off-by: Simon Glass sjg@chromium.org ---
Changes in v10: None 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)

Applied to u-boot-x86 branch 'patman'

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 v10: None 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 }

Hi Tom,
On 28 August 2014 17:43, Simon Glass sjg@chromium.org wrote:
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
Should this patch go in the release?
Regards, Simon

On Tue, Oct 14, 2014 at 09:38:36AM +0200, Simon Glass wrote:
Hi Tom,
On 28 August 2014 17:43, Simon Glass sjg@chromium.org wrote:
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
Should this patch go in the release?
No, not yet. I am going to mention in the release notes that we're going to strongly start thinking about deleting MAKEALL. We can pick up the deprecation patch early in the next merge window.

Dear Tom,
In message 20141014081724.GF25506@bill-the-cat you wrote:
No, not yet. I am going to mention in the release notes that we're going to strongly start thinking about deleting MAKEALL. We can pick up the deprecation patch early in the next merge window.
Can we please keep at least some script (as a wrapper around buildman?) that keeps the old user interface in place?
I frequently use "git bisect run MAKEALL <board> ...", and it would be nice if we could keep this working even in newer versions of the code.
Or is there a similar alternative command that works with identical parameters for - say - all versions of the last two years or so?
Best regards,
Wolfgang Denk

Hi Wolfgang,
On 22 October 2014 02:33, Wolfgang Denk wd@denx.de wrote:
Dear Tom,
In message 20141014081724.GF25506@bill-the-cat you wrote:
No, not yet. I am going to mention in the release notes that we're going to strongly start thinking about deleting MAKEALL. We can pick up the deprecation patch early in the next merge window.
Can we please keep at least some script (as a wrapper around buildman?) that keeps the old user interface in place?
I frequently use "git bisect run MAKEALL <board> ...", and it would be nice if we could keep this working even in newer versions of the code.
Or is there a similar alternative command that works with identical parameters for - say - all versions of the last two years or so?
Unfortunately there is not really an equivalent, and buildman only recently
- sets its return code correctly - supports building the current tree (previously it required a branch name for the commit to build)
During development of buildman/patman I used to keep a separate tree. Then you can run the latest buildman from that tree using you current directory for the bisect.
I could perhaps look at adjusting MAKEALL to call buildman if that solution isn't good enough (this will work assuming that buildman has been set up with toolchains, etc.). Still I think a deprecation warning is a good start.
Regards, Simon

On 10/22/2014 08:11 AM, Simon Glass wrote:
Hi Wolfgang,
On 22 October 2014 02:33, Wolfgang Denk wd@denx.de wrote:
Dear Tom,
In message 20141014081724.GF25506@bill-the-cat you wrote:
No, not yet. I am going to mention in the release notes that we're going to strongly start thinking about deleting MAKEALL. We can pick up the deprecation patch early in the next merge window.
Can we please keep at least some script (as a wrapper around buildman?) that keeps the old user interface in place?
I frequently use "git bisect run MAKEALL <board> ...", and it would be nice if we could keep this working even in newer versions of the code.
Or is there a similar alternative command that works with identical parameters for - say - all versions of the last two years or so?
Unfortunately there is not really an equivalent, and buildman only recently
- sets its return code correctly
- supports building the current tree (previously it required a branch
name for the commit to build)
During development of buildman/patman I used to keep a separate tree. Then you can run the latest buildman from that tree using you current directory for the bisect.
I could perhaps look at adjusting MAKEALL to call buildman if that solution isn't good enough (this will work assuming that buildman has been set up with toolchains, etc.). Still I think a deprecation warning is a good start.
Simon,
While you work on buildman, please consider to regenerate boards.cfg for each build. If one patch in a series adds a board, there will be a false error for patches before it.
York

On Wed, Oct 22, 2014 at 09:11:21AM -0600, Simon Glass wrote:
Hi Wolfgang,
On 22 October 2014 02:33, Wolfgang Denk wd@denx.de wrote:
Dear Tom,
In message 20141014081724.GF25506@bill-the-cat you wrote:
No, not yet. I am going to mention in the release notes that we're going to strongly start thinking about deleting MAKEALL. We can pick up the deprecation patch early in the next merge window.
Can we please keep at least some script (as a wrapper around buildman?) that keeps the old user interface in place?
I frequently use "git bisect run MAKEALL <board> ...", and it would be nice if we could keep this working even in newer versions of the code.
Or is there a similar alternative command that works with identical parameters for - say - all versions of the last two years or so?
Unfortunately there is not really an equivalent, and buildman only recently
- sets its return code correctly
- supports building the current tree (previously it required a branch
name for the commit to build)
During development of buildman/patman I used to keep a separate tree. Then you can run the latest buildman from that tree using you current directory for the bisect.
I could perhaps look at adjusting MAKEALL to call buildman if that solution isn't good enough (this will work assuming that buildman has been set up with toolchains, etc.). Still I think a deprecation warning is a good start.
I think for Wolfgang's case that might just have to be handled with an external wrapper, translating all of the ways to run MAKEALL into buildman, reliably, would be a bit of an undertaking. But for bisect run:
if [ -x ./MAKEALL ]; then ./MAKEALL $@ else ./tools/buildman/buildman $@ fi
And "board" will get built, one way or another, defaulting to MAKEALL while it's still here.

Dear Tom,
In message 20141022160936.GY25506@bill-the-cat you wrote:
I think for Wolfgang's case that might just have to be handled with an external wrapper, translating all of the ways to run MAKEALL into
Yes, you are right, an external wrapper would work, too. Silly me.
OTOH, why not keep a script under the old name that provides such functionality to translate calls to the buildman API?
Best regards,
Wolfgang Denk

On Wed, Oct 22, 2014 at 06:59:44PM +0200, Wolfgang Denk wrote:
Dear Tom,
In message 20141022160936.GY25506@bill-the-cat you wrote:
I think for Wolfgang's case that might just have to be handled with an external wrapper, translating all of the ways to run MAKEALL into
Yes, you are right, an external wrapper would work, too. Silly me.
OTOH, why not keep a script under the old name that provides such functionality to translate calls to the buildman API?
My concern is that we'll get people complaining about things not being mapped back exactly right. For example, MAKEALL am335x_evm builds one board, am335x_evm_config but buildman am335x_evm builds the whole family of configs. For a build test bisect run, that's fine (even if not optimal in that it'll build more than required). In fact if I read things right (Simon?) buildman is bad for a single board/config.
If we map out MAKEALL's -m/-M to just fail and say use get_maintainer.pl I think we can "good enough" map out everything else. With perhaps an echo to please use buildman directly when possible?

Dear Tom,
In message 20141022171908.GC25506@bill-the-cat you wrote:
My concern is that we'll get people complaining about things not being mapped back exactly right. For example, MAKEALL am335x_evm builds one board, am335x_evm_config but buildman am335x_evm builds the whole family of configs. For a build test bisect run, that's fine (even if not optimal in that it'll build more than required). In fact if I read things right (Simon?) buildman is bad for a single board/config.
This is one of my open questions with buildman, too. Simon?
If we map out MAKEALL's -m/-M to just fail and say use get_maintainer.pl I think we can "good enough" map out everything else. With perhaps an echo to please use buildman directly when possible?
Sounds good enough to me.
Thanks!
Best regards,
Wolfgang Denk

Hi Wolfgang,
On 22 October 2014 11:37, Wolfgang Denk wd@denx.de wrote:
Dear Tom,
In message 20141022171908.GC25506@bill-the-cat you wrote:
My concern is that we'll get people complaining about things not being mapped back exactly right. For example, MAKEALL am335x_evm builds one board, am335x_evm_config but buildman am335x_evm builds the whole family of configs. For a build test bisect run, that's fine (even if not optimal in that it'll build more than required). In fact if I read things right (Simon?) buildman is bad for a single board/config.
This is one of my open questions with buildman, too. Simon?
Yes it does a substring match. I'm open to suggestions on this though. It actually supports regular expressions.
If we map out MAKEALL's -m/-M to just fail and say use get_maintainer.pl I think we can "good enough" map out everything else. With perhaps an echo to please use buildman directly when possible?
Sounds good enough to me.
Thanks!
Regards, Simon

Dear Simon,
In message CAPnjgZ2ZmGiQoi-mKQxK0vNPCs3hhqgk=z5CxbfSUm8LjU2kNA@mail.gmail.com you wrote:
My concern is that we'll get people complaining about things not being mapped back exactly right. For example, MAKEALL am335x_evm builds one board, am335x_evm_config but buildman am335x_evm builds the whole family of configs. For a build test bisect run, that's fine (even if not optimal in that it'll build more than required). In fact if I read things right (Simon?) buildman is bad for a single board/config.
This is one of my open questions with buildman, too. Simon?
Yes it does a substring match. I'm open to suggestions on this though. It actually supports regular expressions.
So something like
buildman '^am335x_evm$'
would work?
Best regards,
Wolfgang Denk

Hi Wolfgang,
On 22 October 2014 11:56, Wolfgang Denk wd@denx.de wrote:
Dear Simon,
In message <CAPnjgZ2ZmGiQoi-mKQxK0vNPCs3hhqgk= z5CxbfSUm8LjU2kNA@mail.gmail.com> you wrote:
My concern is that we'll get people complaining about things not being mapped back exactly right. For example, MAKEALL am335x_evm builds one board, am335x_evm_config but buildman am335x_evm builds the whole
family
of configs. For a build test bisect run, that's fine (even if not optimal in that it'll build more than required). In fact if I read things right (Simon?) buildman is bad for a single board/config.
This is one of my open questions with buildman, too. Simon?
Yes it does a substring match. I'm open to suggestions on this though. It actually supports regular expressions.
So something like
buildman '^am335x_evm$'
would work?
Yes:
$ ./tools/buildman/buildman -s am335x_evm -n boards.cfg is up to date. Nothing to do. Dry run, so not doing much. But I would do this:
Building current source for 5 boards (4 threads, 1 job per thread) Build directory: ../current
am335x_evm : 5 boards Total boards to build for each commit: 5
$ ./tools/buildman/buildman -s am335x_evm$ -n boards.cfg is up to date. Nothing to do. Dry run, so not doing much. But I would do this:
Building current source for 1 boards (1 thread, 4 jobs per thread) Build directory: ../current
am335x_evm$ : 1 boards Total boards to build for each commit: 1
Regards, Simon

Dear Simon,
In message CAPnjgZ3doDTiju1zJ5WQR-hBx5JkEtm=e7qLsym+q2zSp56R0Q@mail.gmail.com you wrote:
So something like buildman '^am335x_evm$' would work?
Yes:
Thanks a lot!
Best regards,
Wolfgang Denk

Hi Wolfgang,
On 22 October 2014 12:13, Wolfgang Denk wd@denx.de wrote:
Dear Simon,
In message CAPnjgZ3doDTiju1zJ5WQR-hBx5JkEtm=e7qLsym+q2zSp56R0Q@mail.gmail.com you wrote:
So something like buildman '^am335x_evm$' would work?
Yes:
Thanks a lot!
I hope/think that we are getting through most of the use cases now. The main issue I'm aware of is getting tool chains.
Regards, Simon

On Thu, Aug 28, 2014 at 09:43:46AM -0600, Simon Glass wrote:
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
Applied to u-boot/master, thanks!

Applied to u-boot-x86 branch 'patman'
participants (6)
-
Masahiro YAMADA
-
Simon Glass
-
Tom Rini
-
Tom Rini
-
Wolfgang Denk
-
York Sun