xref: /openbmc/u-boot/tools/buildman/board.py (revision a73267a7)
1# Copyright (c) 2012 The Chromium OS Authors.
2#
3# See file CREDITS for list of people who contributed to this
4# project.
5#
6# This program is free software; you can redistribute it and/or
7# modify it under the terms of the GNU General Public License as
8# published by the Free Software Foundation; either version 2 of
9# the License, or (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program; if not, write to the Free Software
18# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
19# MA 02111-1307 USA
20#
21
22class Board:
23    """A particular board that we can build"""
24    def __init__(self, target, arch, cpu, board_name, vendor, soc, options):
25        """Create a new board type.
26
27        Args:
28            target: Target name (use make <target>_config to configure)
29            arch: Architecture name (e.g. arm)
30            cpu: Cpu name (e.g. arm1136)
31            board_name: Name of board (e.g. integrator)
32            vendor: Name of vendor (e.g. armltd)
33            soc: Name of SOC, or '' if none (e.g. mx31)
34            options: board-specific options (e.g. integratorcp:CM1136)
35        """
36        self.target = target
37        self.arch = arch
38        self.cpu = cpu
39        self.board_name = board_name
40        self.vendor = vendor
41        self.soc = soc
42        self.props = [self.target, self.arch, self.cpu, self.board_name,
43                      self.vendor, self.soc]
44        self.options = options
45        self.build_it = False
46
47
48class Boards:
49    """Manage a list of boards."""
50    def __init__(self):
51        # Use a simple list here, sinc OrderedDict requires Python 2.7
52        self._boards = []
53
54    def AddBoard(self, board):
55        """Add a new board to the list.
56
57        The board's target member must not already exist in the board list.
58
59        Args:
60            board: board to add
61        """
62        self._boards.append(board)
63
64    def ReadBoards(self, fname):
65        """Read a list of boards from a board file.
66
67        Create a board object for each and add it to our _boards list.
68
69        Args:
70            fname: Filename of boards.cfg file
71        """
72        with open(fname, 'r') as fd:
73            for line in fd:
74                if line[0] == '#':
75                    continue
76                fields = line.split()
77                if not fields:
78                    continue
79                for upto in range(len(fields)):
80                    if fields[upto] == '-':
81                        fields[upto] = ''
82                while len(fields) < 7:
83                    fields.append('')
84
85                board = Board(*fields)
86                self.AddBoard(board)
87
88
89    def GetList(self):
90        """Return a list of available boards.
91
92        Returns:
93            List of Board objects
94        """
95        return self._boards
96
97    def GetDict(self):
98        """Build a dictionary containing all the boards.
99
100        Returns:
101            Dictionary:
102                key is board.target
103                value is board
104        """
105        board_dict = {}
106        for board in self._boards:
107            board_dict[board.target] = board
108        return board_dict
109
110    def GetSelectedDict(self):
111        """Return a dictionary containing the selected boards
112
113        Returns:
114            List of Board objects that are marked selected
115        """
116        board_dict = {}
117        for board in self._boards:
118            if board.build_it:
119                board_dict[board.target] = board
120        return board_dict
121
122    def GetSelected(self):
123        """Return a list of selected boards
124
125        Returns:
126            List of Board objects that are marked selected
127        """
128        return [board for board in self._boards if board.build_it]
129
130    def GetSelectedNames(self):
131        """Return a list of selected boards
132
133        Returns:
134            List of board names that are marked selected
135        """
136        return [board.target for board in self._boards if board.build_it]
137
138    def SelectBoards(self, args):
139        """Mark boards selected based on args
140
141        Args:
142            List of strings specifying boards to include, either named, or
143            by their target, architecture, cpu, vendor or soc. If empty, all
144            boards are selected.
145
146        Returns:
147            Dictionary which holds the number of boards which were selected
148            due to each argument, arranged by argument.
149        """
150        result = {}
151        for arg in args:
152            result[arg] = 0
153        result['all'] = 0
154
155        for board in self._boards:
156            if args:
157                for arg in args:
158                    if arg in board.props:
159                        if not board.build_it:
160                            board.build_it = True
161                            result[arg] += 1
162                            result['all'] += 1
163            else:
164                board.build_it = True
165                result['all'] += 1
166
167        return result
168