buildman: Implement an option to exclude boards from the build
authorSimon Glass <sjg@chromium.org>
Thu, 28 Aug 2014 15:43:41 +0000 (09:43 -0600)
committerSimon Glass <sjg@chromium.org>
Fri, 5 Sep 2014 19:40:43 +0000 (13:40 -0600)
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>
tools/buildman/README
tools/buildman/board.py
tools/buildman/buildman.py
tools/buildman/control.py

index 68465b46d9660a3f71ed3fab229ab0f14b384146..b8c2bd6cbb4c606a930ca6d85ebe6c99a1690b44 100644 (file)
@@ -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.
 
index a3332876240ea673e02c51db3d0bcab0e181e387..5d536d5f20049fc40dd78880632ac10257bcd4c8 100644 (file)
@@ -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
index fbd31259bf42478741ffa1f8e1b8ddf08ba12794..53592e50ec832a5d7d8ee7970931255da8e4de83 100755 (executable)
@@ -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 += """
 
index b8a6cbfe2fc1ede53b4ce3ca13c7cc9fbc5d2c85..cb01158b60225182ba9cbbf62c60194eb8f8323d 100644 (file)
@@ -127,7 +127,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'))