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