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