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