mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-08 22:03:22 +09:00
![Simon Glass](/assets/img/avatar_default.png)
Currently buildman allows a list of boards to build to be specified on the command line. The list can include specific board names, architecture, SOC and so on. At present the list of boards is dealt with in an 'OR' fashion, and there is no way to specify something like 'arm & freescale', meaning boards with ARM architecture but only those made by Freescale. This would exclude the PowerPC boards made by Freescale. Support an '&' operator on the command line to permit this. Ensure that arguments can be specified in a single string to permit easy shell quoting. Suggested-by: York Sun <yorksun@freescale.com> Signed-off-by: Simon Glass <sjg@chromium.org> Acked-by: York Sun <yorksun@freescale.com>
218 lines
7.7 KiB
Python
218 lines
7.7 KiB
Python
#
|
|
# Copyright (c) 2012 The Chromium OS Authors.
|
|
#
|
|
# SPDX-License-Identifier: GPL-2.0+
|
|
#
|
|
|
|
import os
|
|
import shutil
|
|
import sys
|
|
import tempfile
|
|
import time
|
|
import unittest
|
|
|
|
# Bring in the patman libraries
|
|
our_path = os.path.dirname(os.path.realpath(__file__))
|
|
sys.path.append(os.path.join(our_path, '../patman'))
|
|
|
|
import board
|
|
import bsettings
|
|
import builder
|
|
import control
|
|
import command
|
|
import commit
|
|
import toolchain
|
|
|
|
errors = [
|
|
'''main.c: In function 'main_loop':
|
|
main.c:260:6: warning: unused variable 'joe' [-Wunused-variable]
|
|
''',
|
|
'''main.c: In function 'main_loop':
|
|
main.c:295:2: error: 'fred' undeclared (first use in this function)
|
|
main.c:295:2: note: each undeclared identifier is reported only once for each function it appears in
|
|
make[1]: *** [main.o] Error 1
|
|
make: *** [common/libcommon.o] Error 2
|
|
Make failed
|
|
''',
|
|
'''main.c: In function 'main_loop':
|
|
main.c:280:6: warning: unused variable 'mary' [-Wunused-variable]
|
|
''',
|
|
'''powerpc-linux-ld: warning: dot moved backwards before `.bss'
|
|
powerpc-linux-ld: warning: dot moved backwards before `.bss'
|
|
powerpc-linux-ld: u-boot: section .text lma 0xfffc0000 overlaps previous sections
|
|
powerpc-linux-ld: u-boot: section .rodata lma 0xfffef3ec overlaps previous sections
|
|
powerpc-linux-ld: u-boot: section .reloc lma 0xffffa400 overlaps previous sections
|
|
powerpc-linux-ld: u-boot: section .data lma 0xffffcd38 overlaps previous sections
|
|
powerpc-linux-ld: u-boot: section .u_boot_cmd lma 0xffffeb40 overlaps previous sections
|
|
powerpc-linux-ld: u-boot: section .bootpg lma 0xfffff198 overlaps previous sections
|
|
'''
|
|
]
|
|
|
|
|
|
# hash, subject, return code, list of errors/warnings
|
|
commits = [
|
|
['1234', 'upstream/master, ok', 0, []],
|
|
['5678', 'Second commit, a warning', 0, errors[0:1]],
|
|
['9012', 'Third commit, error', 1, errors[0:2]],
|
|
['3456', 'Fourth commit, warning', 0, [errors[0], errors[2]]],
|
|
['7890', 'Fifth commit, link errors', 1, [errors[0], errors[3]]],
|
|
['abcd', 'Sixth commit, fixes all errors', 0, []]
|
|
]
|
|
|
|
boards = [
|
|
['Active', 'arm', 'armv7', '', 'Tester', 'ARM Board 1', 'board0', ''],
|
|
['Active', 'arm', 'armv7', '', 'Tester', 'ARM Board 2', 'board1', ''],
|
|
['Active', 'powerpc', 'powerpc', '', 'Tester', 'PowerPC board 1', 'board2', ''],
|
|
['Active', 'powerpc', 'mpc5xx', '', 'Tester', 'PowerPC board 2', 'board3', ''],
|
|
['Active', 'sandbox', 'sandbox', '', 'Tester', 'Sandbox board', 'board4', ''],
|
|
]
|
|
|
|
class Options:
|
|
"""Class that holds build options"""
|
|
pass
|
|
|
|
class TestBuild(unittest.TestCase):
|
|
"""Test buildman
|
|
|
|
TODO: Write tests for the rest of the functionality
|
|
"""
|
|
def setUp(self):
|
|
# Set up commits to build
|
|
self.commits = []
|
|
sequence = 0
|
|
for commit_info in commits:
|
|
comm = commit.Commit(commit_info[0])
|
|
comm.subject = commit_info[1]
|
|
comm.return_code = commit_info[2]
|
|
comm.error_list = commit_info[3]
|
|
comm.sequence = sequence
|
|
sequence += 1
|
|
self.commits.append(comm)
|
|
|
|
# Set up boards to build
|
|
self.boards = board.Boards()
|
|
for brd in boards:
|
|
self.boards.AddBoard(board.Board(*brd))
|
|
self.boards.SelectBoards([])
|
|
|
|
# Set up the toolchains
|
|
bsettings.Setup()
|
|
self.toolchains = toolchain.Toolchains()
|
|
self.toolchains.Add('arm-linux-gcc', test=False)
|
|
self.toolchains.Add('sparc-linux-gcc', test=False)
|
|
self.toolchains.Add('powerpc-linux-gcc', test=False)
|
|
self.toolchains.Add('gcc', test=False)
|
|
|
|
def Make(self, commit, brd, stage, *args, **kwargs):
|
|
result = command.CommandResult()
|
|
boardnum = int(brd.target[-1])
|
|
result.return_code = 0
|
|
result.stderr = ''
|
|
result.stdout = ('This is the test output for board %s, commit %s' %
|
|
(brd.target, commit.hash))
|
|
if boardnum >= 1 and boardnum >= commit.sequence:
|
|
result.return_code = commit.return_code
|
|
result.stderr = ''.join(commit.error_list)
|
|
if stage == 'build':
|
|
target_dir = None
|
|
for arg in args:
|
|
if arg.startswith('O='):
|
|
target_dir = arg[2:]
|
|
|
|
if not os.path.isdir(target_dir):
|
|
os.mkdir(target_dir)
|
|
#time.sleep(.2 + boardnum * .2)
|
|
|
|
result.combined = result.stdout + result.stderr
|
|
return result
|
|
|
|
def testBasic(self):
|
|
"""Test basic builder operation"""
|
|
output_dir = tempfile.mkdtemp()
|
|
if not os.path.isdir(output_dir):
|
|
os.mkdir(output_dir)
|
|
build = builder.Builder(self.toolchains, output_dir, None, 1, 2,
|
|
checkout=False, show_unknown=False)
|
|
build.do_make = self.Make
|
|
board_selected = self.boards.GetSelectedDict()
|
|
|
|
build.BuildBoards(self.commits, board_selected, keep_outputs=False,
|
|
verbose=False)
|
|
build.SetDisplayOptions(show_errors=True);
|
|
build.ShowSummary(self.commits, board_selected)
|
|
|
|
def _testGit(self):
|
|
"""Test basic builder operation by building a branch"""
|
|
base_dir = tempfile.mkdtemp()
|
|
if not os.path.isdir(base_dir):
|
|
os.mkdir(base_dir)
|
|
options = Options()
|
|
options.git = os.getcwd()
|
|
options.summary = False
|
|
options.jobs = None
|
|
options.dry_run = False
|
|
#options.git = os.path.join(base_dir, 'repo')
|
|
options.branch = 'test-buildman'
|
|
options.force_build = False
|
|
options.list_tool_chains = False
|
|
options.count = -1
|
|
options.git_dir = None
|
|
options.threads = None
|
|
options.show_unknown = False
|
|
options.quick = False
|
|
options.show_errors = False
|
|
options.keep_outputs = False
|
|
args = ['tegra20']
|
|
control.DoBuildman(options, args)
|
|
|
|
def testBoardSingle(self):
|
|
"""Test single board selection"""
|
|
self.assertEqual(self.boards.SelectBoards(['sandbox']),
|
|
{'all': 1, 'sandbox': 1})
|
|
|
|
def testBoardArch(self):
|
|
"""Test single board selection"""
|
|
self.assertEqual(self.boards.SelectBoards(['arm']),
|
|
{'all': 2, 'arm': 2})
|
|
|
|
def testBoardArchSingle(self):
|
|
"""Test single board selection"""
|
|
self.assertEqual(self.boards.SelectBoards(['arm sandbox']),
|
|
{'all': 3, 'arm': 2, 'sandbox' : 1})
|
|
|
|
def testBoardArchSingleMultiWord(self):
|
|
"""Test single board selection"""
|
|
self.assertEqual(self.boards.SelectBoards(['arm', 'sandbox']),
|
|
{'all': 3, 'arm': 2, 'sandbox' : 1})
|
|
|
|
def testBoardSingleAnd(self):
|
|
"""Test single board selection"""
|
|
self.assertEqual(self.boards.SelectBoards(['Tester & arm']),
|
|
{'all': 2, 'Tester&arm': 2})
|
|
|
|
def testBoardTwoAnd(self):
|
|
"""Test single board selection"""
|
|
self.assertEqual(self.boards.SelectBoards(['Tester', '&', 'arm',
|
|
'Tester' '&', 'powerpc',
|
|
'sandbox']),
|
|
{'all': 5, 'Tester&powerpc': 2, 'Tester&arm': 2,
|
|
'sandbox' : 1})
|
|
|
|
def testBoardAll(self):
|
|
"""Test single board selection"""
|
|
self.assertEqual(self.boards.SelectBoards([]), {'all': 5})
|
|
|
|
def testBoardRegularExpression(self):
|
|
"""Test single board selection"""
|
|
self.assertEqual(self.boards.SelectBoards(['T.*r&^Po']),
|
|
{'T.*r&^Po': 2, 'all': 2})
|
|
|
|
def testBoardDuplicate(self):
|
|
"""Test single board selection"""
|
|
self.assertEqual(self.boards.SelectBoards(['sandbox sandbox',
|
|
'sandbox']),
|
|
{'all': 1, 'sandbox': 1})
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|