blob: 1d3db206bda10508d906bfb3a5a01e26ea81423e [file] [log] [blame]
Simon Glassfc3fe1c2013-04-03 11:07:16 +00001# Copyright (c) 2012 The Chromium OS Authors.
2#
Wolfgang Denk1a459662013-07-08 09:37:19 +02003# SPDX-License-Identifier: GPL-2.0+
Simon Glassfc3fe1c2013-04-03 11:07:16 +00004#
5
6class Board:
7 """A particular board that we can build"""
Andreas Bießmann03c1bb22013-09-19 10:08:45 +02008 def __init__(self, status, arch, cpu, soc, vendor, board_name, target, options):
Simon Glassfc3fe1c2013-04-03 11:07:16 +00009 """Create a new board type.
10
11 Args:
Andreas Bießmann03c1bb22013-09-19 10:08:45 +020012 status: define whether the board is 'Active' or 'Orphaned'
Simon Glassfc3fe1c2013-04-03 11:07:16 +000013 arch: Architecture name (e.g. arm)
14 cpu: Cpu name (e.g. arm1136)
Simon Glassfc3fe1c2013-04-03 11:07:16 +000015 soc: Name of SOC, or '' if none (e.g. mx31)
Andreas Bießmann03c1bb22013-09-19 10:08:45 +020016 vendor: Name of vendor (e.g. armltd)
17 board_name: Name of board (e.g. integrator)
18 target: Target name (use make <target>_config to configure)
Simon Glassfc3fe1c2013-04-03 11:07:16 +000019 options: board-specific options (e.g. integratorcp:CM1136)
20 """
21 self.target = target
22 self.arch = arch
23 self.cpu = cpu
24 self.board_name = board_name
25 self.vendor = vendor
26 self.soc = soc
27 self.props = [self.target, self.arch, self.cpu, self.board_name,
28 self.vendor, self.soc]
29 self.options = options
30 self.build_it = False
31
32
33class Boards:
34 """Manage a list of boards."""
35 def __init__(self):
36 # Use a simple list here, sinc OrderedDict requires Python 2.7
37 self._boards = []
38
39 def AddBoard(self, board):
40 """Add a new board to the list.
41
42 The board's target member must not already exist in the board list.
43
44 Args:
45 board: board to add
46 """
47 self._boards.append(board)
48
49 def ReadBoards(self, fname):
50 """Read a list of boards from a board file.
51
52 Create a board object for each and add it to our _boards list.
53
54 Args:
55 fname: Filename of boards.cfg file
56 """
57 with open(fname, 'r') as fd:
58 for line in fd:
59 if line[0] == '#':
60 continue
61 fields = line.split()
62 if not fields:
63 continue
64 for upto in range(len(fields)):
65 if fields[upto] == '-':
66 fields[upto] = ''
Andreas Bießmann03c1bb22013-09-19 10:08:45 +020067 while len(fields) < 8:
Simon Glassfc3fe1c2013-04-03 11:07:16 +000068 fields.append('')
Andreas Bießmann03c1bb22013-09-19 10:08:45 +020069 if len(fields) > 8:
70 fields = fields[:8]
Simon Glassfc3fe1c2013-04-03 11:07:16 +000071
72 board = Board(*fields)
73 self.AddBoard(board)
74
75
76 def GetList(self):
77 """Return a list of available boards.
78
79 Returns:
80 List of Board objects
81 """
82 return self._boards
83
84 def GetDict(self):
85 """Build a dictionary containing all the boards.
86
87 Returns:
88 Dictionary:
89 key is board.target
90 value is board
91 """
92 board_dict = {}
93 for board in self._boards:
94 board_dict[board.target] = board
95 return board_dict
96
97 def GetSelectedDict(self):
98 """Return a dictionary containing the selected boards
99
100 Returns:
101 List of Board objects that are marked selected
102 """
103 board_dict = {}
104 for board in self._boards:
105 if board.build_it:
106 board_dict[board.target] = board
107 return board_dict
108
109 def GetSelected(self):
110 """Return a list of selected boards
111
112 Returns:
113 List of Board objects that are marked selected
114 """
115 return [board for board in self._boards if board.build_it]
116
117 def GetSelectedNames(self):
118 """Return a list of selected boards
119
120 Returns:
121 List of board names that are marked selected
122 """
123 return [board.target for board in self._boards if board.build_it]
124
125 def SelectBoards(self, args):
126 """Mark boards selected based on args
127
128 Args:
129 List of strings specifying boards to include, either named, or
130 by their target, architecture, cpu, vendor or soc. If empty, all
131 boards are selected.
132
133 Returns:
134 Dictionary which holds the number of boards which were selected
135 due to each argument, arranged by argument.
136 """
137 result = {}
138 for arg in args:
139 result[arg] = 0
140 result['all'] = 0
141
142 for board in self._boards:
143 if args:
144 for arg in args:
145 if arg in board.props:
146 if not board.build_it:
147 board.build_it = True
148 result[arg] += 1
149 result['all'] += 1
150 else:
151 board.build_it = True
152 result['all'] += 1
153
154 return result