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