xref: /rk3399_rockchip-uboot/tools/buildman/board.py (revision fc3fe1c287fc5ee4c528b4059405571fcd2d55bd)
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