diff options
author | Tom Rini <trini@konsulko.com> | 2019-11-05 07:59:28 -0500 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2019-11-05 07:59:28 -0500 |
commit | b62553736e0131b88befad128a2dd40c75e3293c (patch) | |
tree | 8164b210b7788aae0e86ce143e35240013b9d0c6 /tools | |
parent | 73b6e6ad254b36763419cdd3fdf406c0094517b7 (diff) | |
parent | 388560134b99dc4cc752627d3a7e9f8c8c2a89a7 (diff) |
Merge tag 'fdt-pull-5nov19' of git://git.denx.de/u-boot-fdt
Update to latest libfdt and pylibfdt, with added size control
Update binman, dtoc, patman, buildman to Python 3
Update move_config, rkmux, microcode_tool to Python 3
Diffstat (limited to 'tools')
31 files changed, 295 insertions, 293 deletions
diff --git a/tools/binman/binman.py b/tools/binman/binman.py index 8bd5868df2..9e6fd72117 100755 --- a/tools/binman/binman.py +++ b/tools/binman/binman.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0+ # Copyright (c) 2016 Google, Inc diff --git a/tools/binman/cbfs_util_test.py b/tools/binman/cbfs_util_test.py index 772c794ece..ddc2e09e35 100755 --- a/tools/binman/cbfs_util_test.py +++ b/tools/binman/cbfs_util_test.py @@ -56,7 +56,7 @@ class TestCbfs(unittest.TestCase): cls.have_lz4 = True try: tools.Run('lz4', '--no-frame-crc', '-c', - tools.GetInputFilename('u-boot.bin')) + tools.GetInputFilename('u-boot.bin'), binary=True) except: cls.have_lz4 = False diff --git a/tools/binman/entry.py b/tools/binman/entry.py index 409c0dca93..b6f1b2c93f 100644 --- a/tools/binman/entry.py +++ b/tools/binman/entry.py @@ -7,16 +7,7 @@ from __future__ import print_function from collections import namedtuple - -# importlib was introduced in Python 2.7 but there was a report of it not -# working in 2.7.12, so we work around this: -# http://lists.denx.de/pipermail/u-boot/2016-October/269729.html -try: - import importlib - have_importlib = True -except: - have_importlib = False - +import importlib import os import sys @@ -56,6 +47,8 @@ class Entry(object): offset: Offset of entry within the section, None if not known yet (in which case it will be calculated by Pack()) size: Entry size in bytes, None if not known + pre_reset_size: size as it was before ResetForPack(). This allows us to + keep track of the size we started with and detect size changes uncomp_size: Size of uncompressed data in bytes, if the entry is compressed, else None contents_size: Size of contents in bytes, 0 by default @@ -80,6 +73,7 @@ class Entry(object): self.name = node and (name_prefix + node.name) or 'none' self.offset = None self.size = None + self.pre_reset_size = None self.uncomp_size = None self.data = None self.contents_size = 0 @@ -119,10 +113,7 @@ class Entry(object): old_path = sys.path sys.path.insert(0, os.path.join(our_path, 'etype')) try: - if have_importlib: - module = importlib.import_module(module_name) - else: - module = __import__(module_name) + module = importlib.import_module(module_name) except ImportError as e: raise ValueError("Unknown entry type '%s' in node '%s' (expected etype/%s.py, error '%s'" % (etype, node_path, module_name, e)) @@ -326,6 +317,7 @@ class Entry(object): self.Detail('ResetForPack: offset %s->%s, size %s->%s' % (ToHex(self.offset), ToHex(self.orig_offset), ToHex(self.size), ToHex(self.orig_size))) + self.pre_reset_size = self.size self.offset = self.orig_offset self.size = self.orig_size @@ -769,7 +761,10 @@ features to produce new behaviours. True if the data did not result in a resize of this entry, False if the entry must be resized """ - self.contents_size = self.size + if self.size is not None: + self.contents_size = self.size + else: + self.contents_size = self.pre_reset_size ok = self.ProcessContentsUpdate(data) self.Detail('WriteData: size=%x, ok=%s' % (len(data), ok)) section_ok = self.section.WriteChildData(self) diff --git a/tools/binman/entry_test.py b/tools/binman/entry_test.py index 13f5864516..277e10b585 100644 --- a/tools/binman/entry_test.py +++ b/tools/binman/entry_test.py @@ -39,21 +39,6 @@ class TestEntry(unittest.TestCase): else: import entry - def test1EntryNoImportLib(self): - """Test that we can import Entry subclassess successfully""" - sys.modules['importlib'] = None - global entry - self._ReloadEntry() - entry.Entry.Create(None, self.GetNode(), 'u-boot') - self.assertFalse(entry.have_importlib) - - def test2EntryImportLib(self): - del sys.modules['importlib'] - global entry - self._ReloadEntry() - entry.Entry.Create(None, self.GetNode(), 'u-boot-spl') - self.assertTrue(entry.have_importlib) - def testEntryContents(self): """Test the Entry bass class""" import entry diff --git a/tools/binman/etype/intel_fit.py b/tools/binman/etype/intel_fit.py index 23606d27d0..2a34a05f95 100644 --- a/tools/binman/etype/intel_fit.py +++ b/tools/binman/etype/intel_fit.py @@ -27,6 +27,6 @@ class Entry_intel_fit(Entry_blob): self.align = 16 def ObtainContents(self): - data = struct.pack('<8sIHBB', '_FIT_ ', 1, 0x100, 0x80, 0x7d) + data = struct.pack('<8sIHBB', b'_FIT_ ', 1, 0x100, 0x80, 0x7d) self.SetContents(data) return True diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py index 494e218cbc..80df0e3ca9 100644 --- a/tools/binman/ftest.py +++ b/tools/binman/ftest.py @@ -174,7 +174,7 @@ class TestFunctional(unittest.TestCase): cls.have_lz4 = True try: tools.Run('lz4', '--no-frame-crc', '-c', - os.path.join(cls._indir, 'u-boot.bin')) + os.path.join(cls._indir, 'u-boot.bin'), binary=True) except: cls.have_lz4 = False @@ -2113,7 +2113,7 @@ class TestFunctional(unittest.TestCase): data = self.data = self._DoReadFileRealDtb('115_fdtmap.dts') fdtmap_data = data[len(U_BOOT_DATA):] magic = fdtmap_data[:8] - self.assertEqual('_FDTMAP_', magic) + self.assertEqual(b'_FDTMAP_', magic) self.assertEqual(tools.GetBytes(0, 8), fdtmap_data[8:16]) fdt_data = fdtmap_data[16:] @@ -2156,7 +2156,7 @@ class TestFunctional(unittest.TestCase): dtb = fdt.Fdt.FromData(fdt_data) fdt_size = dtb.GetFdtObj().totalsize() hdr_data = data[-8:] - self.assertEqual('BinM', hdr_data[:4]) + self.assertEqual(b'BinM', hdr_data[:4]) offset = struct.unpack('<I', hdr_data[4:])[0] & 0xffffffff self.assertEqual(fdtmap_pos - 0x400, offset - (1 << 32)) @@ -2165,7 +2165,7 @@ class TestFunctional(unittest.TestCase): data = self.data = self._DoReadFileRealDtb('117_fdtmap_hdr_start.dts') fdtmap_pos = 0x100 + len(U_BOOT_DATA) hdr_data = data[:8] - self.assertEqual('BinM', hdr_data[:4]) + self.assertEqual(b'BinM', hdr_data[:4]) offset = struct.unpack('<I', hdr_data[4:])[0] self.assertEqual(fdtmap_pos, offset) @@ -2174,7 +2174,7 @@ class TestFunctional(unittest.TestCase): data = self.data = self._DoReadFileRealDtb('118_fdtmap_hdr_pos.dts') fdtmap_pos = 0x100 + len(U_BOOT_DATA) hdr_data = data[0x80:0x88] - self.assertEqual('BinM', hdr_data[:4]) + self.assertEqual(b'BinM', hdr_data[:4]) offset = struct.unpack('<I', hdr_data[4:])[0] self.assertEqual(fdtmap_pos, offset) @@ -2435,9 +2435,9 @@ class TestFunctional(unittest.TestCase): ' section 100 %x section 100' % section_size, ' cbfs 100 400 cbfs 0', ' u-boot 138 4 u-boot 38', -' u-boot-dtb 180 10f u-boot-dtb 80 3c9', +' u-boot-dtb 180 105 u-boot-dtb 80 3c9', ' u-boot-dtb 500 %x u-boot-dtb 400 3c9' % fdt_size, -' fdtmap %x 3b4 fdtmap %x' % +' fdtmap %x 3bd fdtmap %x' % (fdtmap_offset, fdtmap_offset), ' image-header bf8 8 image-header bf8', ] @@ -2522,7 +2522,7 @@ class TestFunctional(unittest.TestCase): data = self._RunExtractCmd('section') cbfs_data = data[:0x400] cbfs = cbfs_util.CbfsReader(cbfs_data) - self.assertEqual(['u-boot', 'u-boot-dtb', ''], cbfs.files.keys()) + self.assertEqual(['u-boot', 'u-boot-dtb', ''], list(cbfs.files.keys())) dtb_data = data[0x400:] dtb = self._decompress(dtb_data) self.assertEqual(EXTRACT_DTB_SIZE, len(dtb)) diff --git a/tools/buildman/board.py b/tools/buildman/board.py index 2a1d021574..447aaabea8 100644 --- a/tools/buildman/board.py +++ b/tools/buildman/board.py @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0+ # Copyright (c) 2012 The Chromium OS Authors. +from collections import OrderedDict import re class Expr: @@ -120,7 +121,7 @@ class Boards: Args: fname: Filename of boards.cfg file """ - with open(fname, 'r') as fd: + with open(fname, 'r', encoding='utf-8') as fd: for line in fd: if line[0] == '#': continue @@ -155,7 +156,7 @@ class Boards: key is board.target value is board """ - board_dict = {} + board_dict = OrderedDict() for board in self._boards: board_dict[board.target] = board return board_dict @@ -166,7 +167,7 @@ class Boards: Returns: List of Board objects that are marked selected """ - board_dict = {} + board_dict = OrderedDict() for board in self._boards: if board.build_it: board_dict[board.target] = board @@ -259,7 +260,7 @@ class Boards: due to each argument, arranged by argument. List of errors found """ - result = {} + result = OrderedDict() warnings = [] terms = self._BuildTerms(args) diff --git a/tools/buildman/bsettings.py b/tools/buildman/bsettings.py index 03d7439aa5..0b7208da37 100644 --- a/tools/buildman/bsettings.py +++ b/tools/buildman/bsettings.py @@ -1,9 +1,9 @@ # SPDX-License-Identifier: GPL-2.0+ # Copyright (c) 2012 The Chromium OS Authors. -import ConfigParser +import configparser import os -import StringIO +import io def Setup(fname=''): @@ -15,20 +15,20 @@ def Setup(fname=''): global settings global config_fname - settings = ConfigParser.SafeConfigParser() + settings = configparser.SafeConfigParser() if fname is not None: config_fname = fname if config_fname == '': config_fname = '%s/.buildman' % os.getenv('HOME') if not os.path.exists(config_fname): - print 'No config file found ~/.buildman\nCreating one...\n' + print('No config file found ~/.buildman\nCreating one...\n') CreateBuildmanConfigFile(config_fname) - print 'To install tool chains, please use the --fetch-arch option' + print('To install tool chains, please use the --fetch-arch option') if config_fname: settings.read(config_fname) def AddFile(data): - settings.readfp(StringIO.StringIO(data)) + settings.readfp(io.StringIO(data)) def GetItems(section): """Get the items from a section of the config. @@ -41,7 +41,7 @@ def GetItems(section): """ try: return settings.items(section) - except ConfigParser.NoSectionError as e: + except configparser.NoSectionError as e: return [] except: raise @@ -68,10 +68,10 @@ def CreateBuildmanConfigFile(config_fname): try: f = open(config_fname, 'w') except IOError: - print "Couldn't create buildman config file '%s'\n" % config_fname + print("Couldn't create buildman config file '%s'\n" % config_fname) raise - print >>f, '''[toolchain] + print('''[toolchain] # name = path # e.g. x86 = /opt/gcc-4.6.3-nolibc/x86_64-linux @@ -93,5 +93,5 @@ openrisc = or1k # snapper-boards=ENABLE_AT91_TEST=1 # snapper9260=${snapper-boards} BUILD_TAG=442 # snapper9g45=${snapper-boards} BUILD_TAG=443 -''' +''', file=f) f.close(); diff --git a/tools/buildman/builder.py b/tools/buildman/builder.py index fbb236676c..cfbe4c26b1 100644 --- a/tools/buildman/builder.py +++ b/tools/buildman/builder.py @@ -9,7 +9,7 @@ from datetime import datetime, timedelta import glob import os import re -import Queue +import queue import shutil import signal import string @@ -92,11 +92,10 @@ u-boot/ source directory """ # Possible build outcomes -OUTCOME_OK, OUTCOME_WARNING, OUTCOME_ERROR, OUTCOME_UNKNOWN = range(4) +OUTCOME_OK, OUTCOME_WARNING, OUTCOME_ERROR, OUTCOME_UNKNOWN = list(range(4)) # Translate a commit subject into a valid filename (and handle unicode) -trans_valid_chars = string.maketrans('/: ', '---') -trans_valid_chars = trans_valid_chars.decode('latin-1') +trans_valid_chars = str.maketrans('/: ', '---') BASE_CONFIG_FILENAMES = [ 'u-boot.cfg', 'u-boot-spl.cfg', 'u-boot-tpl.cfg' @@ -122,8 +121,8 @@ class Config: def __hash__(self): val = 0 for fname in self.config: - for key, value in self.config[fname].iteritems(): - print key, value + for key, value in self.config[fname].items(): + print(key, value) val = val ^ hash(key) & hash(value) return val @@ -293,8 +292,8 @@ class Builder: self._re_dtb_warning = re.compile('(.*): Warning .*') self._re_note = re.compile('(.*):(\d*):(\d*): note: this is the location of the previous.*') - self.queue = Queue.Queue() - self.out_queue = Queue.Queue() + self.queue = queue.Queue() + self.out_queue = queue.Queue() for i in range(self.num_threads): t = builderthread.BuilderThread(self, i, incremental, per_board_out_dir) @@ -781,7 +780,7 @@ class Builder: config = {} environment = {} - for board in boards_selected.itervalues(): + for board in boards_selected.values(): outcome = self.GetBuildOutcome(commit_upto, board.target, read_func_sizes, read_config, read_environment) @@ -814,13 +813,13 @@ class Builder: tconfig = Config(self.config_filenames, board.target) for fname in self.config_filenames: if outcome.config: - for key, value in outcome.config[fname].iteritems(): + for key, value in outcome.config[fname].items(): tconfig.Add(fname, key, value) config[board.target] = tconfig tenvironment = Environment(board.target) if outcome.environment: - for key, value in outcome.environment.iteritems(): + for key, value in outcome.environment.items(): tenvironment.Add(key, value) environment[board.target] = tenvironment @@ -1040,12 +1039,12 @@ class Builder: # We now have a list of image size changes sorted by arch # Print out a summary of these - for arch, target_list in arch_list.iteritems(): + for arch, target_list in arch_list.items(): # Get total difference for each type totals = {} for result in target_list: total = 0 - for name, diff in result.iteritems(): + for name, diff in result.items(): if name.startswith('_'): continue total += diff @@ -1250,7 +1249,7 @@ class Builder: if self._show_unknown: self.AddOutcome(board_selected, arch_list, unknown_boards, '?', self.col.MAGENTA) - for arch, target_list in arch_list.iteritems(): + for arch, target_list in arch_list.items(): Print('%10s: %s' % (arch, target_list)) self._error_lines += 1 if better_err: @@ -1283,13 +1282,13 @@ class Builder: environment_minus = {} environment_change = {} base = tbase.environment - for key, value in tenvironment.environment.iteritems(): + for key, value in tenvironment.environment.items(): if key not in base: environment_plus[key] = value - for key, value in base.iteritems(): + for key, value in base.items(): if key not in tenvironment.environment: environment_minus[key] = value - for key, value in base.iteritems(): + for key, value in base.items(): new_value = tenvironment.environment.get(key) if new_value and value != new_value: desc = '%s -> %s' % (value, new_value) @@ -1342,15 +1341,15 @@ class Builder: config_minus = {} config_change = {} base = tbase.config[name] - for key, value in tconfig.config[name].iteritems(): + for key, value in tconfig.config[name].items(): if key not in base: config_plus[key] = value all_config_plus[key] = value - for key, value in base.iteritems(): + for key, value in base.items(): if key not in tconfig.config[name]: config_minus[key] = value all_config_minus[key] = value - for key, value in base.iteritems(): + for key, value in base.items(): new_value = tconfig.config.get(key) if new_value and value != new_value: desc = '%s -> %s' % (value, new_value) @@ -1368,7 +1367,7 @@ class Builder: summary[target] = '\n'.join(lines) lines_by_target = {} - for target, lines in summary.iteritems(): + for target, lines in summary.items(): if lines in lines_by_target: lines_by_target[lines].append(target) else: @@ -1392,7 +1391,7 @@ class Builder: Print('%s:' % arch) _OutputConfigInfo(lines) - for lines, targets in lines_by_target.iteritems(): + for lines, targets in lines_by_target.items(): if not lines: continue Print('%s :' % ' '.join(sorted(targets))) @@ -1463,7 +1462,7 @@ class Builder: commits: Selected commits to build """ # First work out how many commits we will build - count = (self.commit_count + self._step - 1) / self._step + count = (self.commit_count + self._step - 1) // self._step self.count = len(board_selected) * count self.upto = self.warned = self.fail = 0 self._timestamps = collections.deque() @@ -1566,7 +1565,7 @@ class Builder: self.ProcessResult(None) # Create jobs to build all commits for each board - for brd in board_selected.itervalues(): + for brd in board_selected.values(): job = builderthread.BuilderJob() job.board = brd job.commits = commits diff --git a/tools/buildman/builderthread.py b/tools/buildman/builderthread.py index 8a9d47cd5e..570c1f6595 100644 --- a/tools/buildman/builderthread.py +++ b/tools/buildman/builderthread.py @@ -28,7 +28,7 @@ def Mkdir(dirname, parents = False): except OSError as err: if err.errno == errno.EEXIST: if os.path.realpath('.') == os.path.realpath(dirname): - print "Cannot create the current working directory '%s'!" % dirname + print("Cannot create the current working directory '%s'!" % dirname) sys.exit(1) pass else: @@ -291,15 +291,13 @@ class BuilderThread(threading.Thread): outfile = os.path.join(build_dir, 'log') with open(outfile, 'w') as fd: if result.stdout: - # We don't want unicode characters in log files - fd.write(result.stdout.decode('UTF-8').encode('ASCII', 'replace')) + fd.write(result.stdout) errfile = self.builder.GetErrFile(result.commit_upto, result.brd.target) if result.stderr: with open(errfile, 'w') as fd: - # We don't want unicode characters in log files - fd.write(result.stderr.decode('UTF-8').encode('ASCII', 'replace')) + fd.write(result.stderr) elif os.path.exists(errfile): os.remove(errfile) @@ -314,17 +312,17 @@ class BuilderThread(threading.Thread): else: fd.write('%s' % result.return_code) with open(os.path.join(build_dir, 'toolchain'), 'w') as fd: - print >>fd, 'gcc', result.toolchain.gcc - print >>fd, 'path', result.toolchain.path - print >>fd, 'cross', result.toolchain.cross - print >>fd, 'arch', result.toolchain.arch + print('gcc', result.toolchain.gcc, file=fd) + print('path', result.toolchain.path, file=fd) + print('cross', result.toolchain.cross, file=fd) + print('arch', result.toolchain.arch, file=fd) fd.write('%s' % result.return_code) # Write out the image and function size information and an objdump env = result.toolchain.MakeEnvironment(self.builder.full_path) with open(os.path.join(build_dir, 'env'), 'w') as fd: for var in sorted(env.keys()): - print >>fd, '%s="%s"' % (var, env[var]) + print('%s="%s"' % (var, env[var]), file=fd) lines = [] for fname in ['u-boot', 'spl/u-boot-spl']: cmd = ['%snm' % self.toolchain.cross, '--size-sort', fname] @@ -335,7 +333,7 @@ class BuilderThread(threading.Thread): nm = self.builder.GetFuncSizesFile(result.commit_upto, result.brd.target, fname) with open(nm, 'w') as fd: - print >>fd, nm_result.stdout, + print(nm_result.stdout, end=' ', file=fd) cmd = ['%sobjdump' % self.toolchain.cross, '-h', fname] dump_result = command.RunPipe([cmd], capture=True, @@ -346,7 +344,7 @@ class BuilderThread(threading.Thread): objdump = self.builder.GetObjdumpFile(result.commit_upto, result.brd.target, fname) with open(objdump, 'w') as fd: - print >>fd, dump_result.stdout, + print(dump_result.stdout, end=' ', file=fd) for line in dump_result.stdout.splitlines(): fields = line.split() if len(fields) > 5 and fields[1] == '.rodata': @@ -378,7 +376,7 @@ class BuilderThread(threading.Thread): sizes = self.builder.GetSizesFile(result.commit_upto, result.brd.target) with open(sizes, 'w') as fd: - print >>fd, '\n'.join(lines) + print('\n'.join(lines), file=fd) # Write out the configuration files, with a special case for SPL for dirname in ['', 'spl', 'tpl']: diff --git a/tools/buildman/buildman.py b/tools/buildman/buildman.py index f17aa15e7c..30a8690f93 100755 --- a/tools/buildman/buildman.py +++ b/tools/buildman/buildman.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0+ # # Copyright (c) 2012 The Chromium OS Authors. @@ -6,6 +6,8 @@ """See README for more information""" +from __future__ import print_function + import multiprocessing import os import re @@ -46,11 +48,11 @@ def RunTests(skip_net_tests): suite = unittest.TestLoader().loadTestsFromTestCase(module) suite.run(result) - print result + print(result) for test, err in result.errors: - print err + print(err) for test, err in result.failures: - print err + print(err) options, args = cmdline.ParseArgs() diff --git a/tools/buildman/control.py b/tools/buildman/control.py index 9787b86747..216012d001 100644 --- a/tools/buildman/control.py +++ b/tools/buildman/control.py @@ -30,7 +30,7 @@ def GetActionSummary(is_summary, commits, selected, options): """ if commits: count = len(commits) - count = (count + options.step - 1) / options.step + count = (count + options.step - 1) // options.step commit_str = '%d commit%s' % (count, GetPlural(count)) else: commit_str = 'current source' @@ -59,31 +59,31 @@ def ShowActions(series, why_selected, boards_selected, builder, options, board_warnings: List of warnings obtained from board selected """ col = terminal.Color() - print 'Dry run, so not doing much. But I would do this:' - print + print('Dry run, so not doing much. But I would do this:') + print() if series: commits = series.commits else: commits = None - print GetActionSummary(False, commits, boards_selected, - options) - print 'Build directory: %s' % builder.base_dir + print(GetActionSummary(False, commits, boards_selected, + options)) + print('Build directory: %s' % builder.base_dir) if commits: for upto in range(0, len(series.commits), options.step): commit = series.commits[upto] - print ' ', col.Color(col.YELLOW, commit.hash[:8], bright=False), - print commit.subject - print + print(' ', col.Color(col.YELLOW, commit.hash[:8], bright=False), end=' ') + print(commit.subject) + print() for arg in why_selected: if arg != 'all': - print arg, ': %d boards' % len(why_selected[arg]) + print(arg, ': %d boards' % len(why_selected[arg])) if options.verbose: - print ' %s' % ' '.join(why_selected[arg]) - print ('Total boards to build for each commit: %d\n' % - len(why_selected['all'])) + print(' %s' % ' '.join(why_selected[arg])) + print(('Total boards to build for each commit: %d\n' % + len(why_selected['all']))) if board_warnings: for warning in board_warnings: - print col.Color(col.YELLOW, warning) + print(col.Color(col.YELLOW, warning)) def CheckOutputDir(output_dir): """Make sure that the output directory is not within the current directory @@ -146,17 +146,17 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None, if options.fetch_arch: if options.fetch_arch == 'list': sorted_list = toolchains.ListArchs() - print col.Color(col.BLUE, 'Available architectures: %s\n' % - ' '.join(sorted_list)) + print(col.Color(col.BLUE, 'Available architectures: %s\n' % + ' '.join(sorted_list))) return 0 else: fetch_arch = options.fetch_arch if fetch_arch == 'all': fetch_arch = ','.join(toolchains.ListArchs()) - print col.Color(col.CYAN, '\nDownloading toolchains: %s' % - fetch_arch) + print(col.Color(col.CYAN, '\nDownloading toolchains: %s' % + fetch_arch)) for arch in fetch_arch.split(','): - print + print() ret = toolchains.FetchAndInstall(arch) if ret: return ret @@ -167,7 +167,7 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None, toolchains.Scan(options.list_tool_chains and options.verbose) if options.list_tool_chains: toolchains.List() - print + print() return 0 # Work out how many commits to build. We want to build everything on the @@ -191,7 +191,7 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None, sys.exit(col.Color(col.RED, "Range '%s' has no commits" % options.branch)) if msg: - print col.Color(col.YELLOW, msg) + print(col.Color(col.YELLOW, msg)) count += 1 # Build upstream commit also if not count: @@ -268,7 +268,7 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None, options.threads = min(multiprocessing.cpu_count(), len(selected)) if not options.jobs: options.jobs = max(1, (multiprocessing.cpu_count() + - len(selected) - 1) / len(selected)) + len(selected) - 1) // len(selected)) if not options.step: options.step = len(series.commits) - 1 diff --git a/tools/buildman/func_test.py b/tools/buildman/func_test.py index f90b8ea7f5..4c3d497294 100644 --- a/tools/buildman/func_test.py +++ b/tools/buildman/func_test.py @@ -270,7 +270,7 @@ class TestFunctional(unittest.TestCase): stdout=''.join(commit_log[:count])) # Not handled, so abort - print 'git log', args + print('git log', args) sys.exit(1) def _HandleCommandGitConfig(self, args): @@ -286,7 +286,7 @@ class TestFunctional(unittest.TestCase): stdout='refs/heads/master\n') # Not handled, so abort - print 'git config', args + print('git config', args) sys.exit(1) def _HandleCommandGit(self, in_args): @@ -320,7 +320,7 @@ class TestFunctional(unittest.TestCase): return command.CommandResult(return_code=0) # Not handled, so abort - print 'git', git_args, sub_cmd, args + print('git', git_args, sub_cmd, args) sys.exit(1) def _HandleCommandNm(self, args): @@ -351,7 +351,7 @@ class TestFunctional(unittest.TestCase): if pipe_list[1] == ['wc', '-l']: wc = True else: - print 'invalid pipe', kwargs + print('invalid pipe', kwargs) sys.exit(1) cmd = pipe_list[0][0] args = pipe_list[0][1:] @@ -371,7 +371,7 @@ class TestFunctional(unittest.TestCase): if not result: # Not handled, so abort - print 'unknown command', kwargs + print('unknown command', kwargs) sys.exit(1) if wc: @@ -404,14 +404,14 @@ class TestFunctional(unittest.TestCase): return command.CommandResult(return_code=0) # Not handled, so abort - print 'make', stage + print('make', stage) sys.exit(1) # Example function to print output lines def print_lines(self, lines): - print len(lines) + print(len(lines)) for line in lines: - print line + print(line) #self.print_lines(terminal.GetPrintTestLines()) def testNoBoards(self): diff --git a/tools/buildman/test.py b/tools/buildman/test.py index ed99b9375c..b4e28d6867 100644 --- a/tools/buildman/test.py +++ b/tools/buildman/test.py @@ -212,11 +212,11 @@ class TestBuild(unittest.TestCase): self.assertEqual(lines[1].text, '02: %s' % commits[1][1]) col = terminal.Color() - self.assertSummary(lines[2].text, 'sandbox', 'w+', ['board4'], + self.assertSummary(lines[2].text, 'arm', 'w+', ['board1'], outcome=OUTCOME_WARN) - self.assertSummary(lines[3].text, 'arm', 'w+', ['board1'], + self.assertSummary(lines[3].text, 'powerpc', 'w+', ['board2', 'board3'], outcome=OUTCOME_WARN) - self.assertSummary(lines[4].text, 'powerpc', 'w+', ['board2', 'board3'], + self.assertSummary(lines[4].text, 'sandbox', 'w+', ['board4'], outcome=OUTCOME_WARN) # Second commit: The warnings should be listed @@ -226,10 +226,10 @@ class TestBuild(unittest.TestCase): # Third commit: Still fails self.assertEqual(lines[6].text, '03: %s' % commits[2][1]) - self.assertSummary(lines[7].text, 'sandbox', '+', ['board4']) - self.assertSummary(lines[8].text, 'arm', '', ['board1'], + self.assertSummary(lines[7].text, 'arm', '', ['board1'], outcome=OUTCOME_OK) - self.assertSummary(lines[9].text, 'powerpc', '+', ['board2', 'board3']) + self.assertSummary(lines[8].text, 'powerpc', '+', ['board2', 'board3']) + self.assertSummary(lines[9].text, 'sandbox', '+', ['board4']) # Expect a compiler error self.assertEqual(lines[10].text, '+%s' % @@ -237,8 +237,6 @@ class TestBuild(unittest.TestCase): # Fourth commit: Compile errors are fixed, just have warning for board3 self.assertEqual(lines[11].text, '04: %s' % commits[3][1]) - self.assertSummary(lines[12].text, 'sandbox', 'w+', ['board4'], - outcome=OUTCOME_WARN) expect = '%10s: ' % 'powerpc' expect += ' ' + col.Color(col.GREEN, '') expect += ' ' @@ -246,7 +244,9 @@ class TestBuild(unittest.TestCase): expect += ' ' + col.Color(col.YELLOW, 'w+') expect += ' ' expect += col.Color(col.YELLOW, ' %s' % 'board3') - self.assertEqual(lines[13].text, expect) + self.assertEqual(lines[12].text, expect) + self.assertSummary(lines[13].text, 'sandbox', 'w+', ['board4'], + outcome=OUTCOME_WARN) # Compile error fixed self.assertEqual(lines[14].text, '-%s' % @@ -259,9 +259,9 @@ class TestBuild(unittest.TestCase): # Fifth commit self.assertEqual(lines[16].text, '05: %s' % commits[4][1]) - self.assertSummary(lines[17].text, 'sandbox', '+', ['board4']) - self.assertSummary(lines[18].text, 'powerpc', '', ['board3'], + self.assertSummary(lines[17].text, 'powerpc', '', ['board3'], outcome=OUTCOME_OK) + self.assertSummary(lines[18].text, 'sandbox', '+', ['board4']) # The second line of errors[3] is a duplicate, so buildman will drop it expect = errors[3].rstrip().split('\n') diff --git a/tools/buildman/toolchain.py b/tools/buildman/toolchain.py index a65737fdf8..cc26e2ede5 100644 --- a/tools/buildman/toolchain.py +++ b/tools/buildman/toolchain.py @@ -4,18 +4,19 @@ import re import glob -from HTMLParser import HTMLParser +from html.parser import HTMLParser import os import sys import tempfile -import urllib2 +import urllib.request, urllib.error, urllib.parse import bsettings import command import terminal +import tools (PRIORITY_FULL_PREFIX, PRIORITY_PREFIX_GCC, PRIORITY_PREFIX_GCC_PATH, - PRIORITY_CALC) = range(4) + PRIORITY_CALC) = list(range(4)) # Simple class to collect links from a page class MyHTMLParser(HTMLParser): @@ -100,15 +101,15 @@ class Toolchain: raise_on_error=False) self.ok = result.return_code == 0 if verbose: - print 'Tool chain test: ', + print('Tool chain test: ', end=' ') if self.ok: - print "OK, arch='%s', priority %d" % (self.arch, - self.priority) + print("OK, arch='%s', priority %d" % (self.arch, + self.priority)) else: - print 'BAD' - print 'Command: ', cmd - print result.stdout - print result.stderr + print('BAD') + print('Command: ', cmd) + print(result.stdout) + print(result.stderr) else: self.ok = True @@ -138,7 +139,7 @@ class Toolchain: value = '' for name, value in bsettings.GetItems('toolchain-wrapper'): if not value: - print "Warning: Wrapper not found" + print("Warning: Wrapper not found") if value: value = value + ' ' @@ -227,11 +228,11 @@ class Toolchains: """ toolchains = bsettings.GetItems('toolchain') if show_warning and not toolchains: - print ("Warning: No tool chains. Please run 'buildman " + print(("Warning: No tool chains. Please run 'buildman " "--fetch-arch all' to download all available toolchains, or " "add a [toolchain] section to your buildman config file " "%s. See README for details" % - bsettings.config_fname) + bsettings.config_fname)) paths = [] for name, value in toolchains: @@ -272,10 +273,10 @@ class Toolchains: if add_it: self.toolchains[toolchain.arch] = toolchain elif verbose: - print ("Toolchain '%s' at priority %d will be ignored because " + print(("Toolchain '%s' at priority %d will be ignored because " "another toolchain for arch '%s' has priority %d" % (toolchain.gcc, toolchain.priority, toolchain.arch, - self.toolchains[toolchain.arch].priority)) + self.toolchains[toolchain.arch].priority))) def ScanPath(self, path, verbose): """Scan a path for a valid toolchain @@ -289,9 +290,9 @@ class Toolchains: fnames = [] for subdir in ['.', 'bin', 'usr/bin']: dirname = os.path.join(path, subdir) - if verbose: print " - looking in '%s'" % dirname + if verbose: print(" - looking in '%s'" % dirname) for fname in glob.glob(dirname + '/*gcc'): - if verbose: print " - found '%s'" % fname + if verbose: print(" - found '%s'" % fname) fnames.append(fname) return fnames @@ -321,9 +322,9 @@ class Toolchains: Args: verbose: True to print out progress information """ - if verbose: print 'Scanning for tool chains' + if verbose: print('Scanning for tool chains') for name, value in self.prefixes: - if verbose: print " - scanning prefix '%s'" % value + if verbose: print(" - scanning prefix '%s'" % value) if os.path.exists(value): self.Add(value, True, verbose, PRIORITY_FULL_PREFIX, name) continue @@ -335,10 +336,10 @@ class Toolchains: for f in fname_list: self.Add(f, True, verbose, PRIORITY_PREFIX_GCC_PATH, name) if not fname_list: - raise ValueError, ("No tool chain found for prefix '%s'" % + raise ValueError("No tool chain found for prefix '%s'" % value) for path in self.paths: - if verbose: print " - scanning path '%s'" % path + if verbose: print(" - scanning path '%s'" % path) fnames = self.ScanPath(path, verbose) for fname in fnames: self.Add(fname, True, verbose) @@ -346,13 +347,13 @@ class Toolchains: def List(self): """List out the selected toolchains for each architecture""" col = terminal.Color() - print col.Color(col.BLUE, 'List of available toolchains (%d):' % - len(self.toolchains)) + print(col.Color(col.BLUE, 'List of available toolchains (%d):' % + len(self.toolchains))) if len(self.toolchains): - for key, value in sorted(self.toolchains.iteritems()): - print '%-10s: %s' % (key, value.gcc) + for key, value in sorted(self.toolchains.items()): + print('%-10s: %s' % (key, value.gcc)) else: - print 'None' + print('None') def Select(self, arch): """Returns the toolchain for a given architecture @@ -370,7 +371,7 @@ class Toolchains: return self.toolchains[alias] if not arch in self.toolchains: - raise ValueError, ("No tool chain found for arch '%s'" % arch) + raise ValueError("No tool chain found for arch '%s'" % arch) return self.toolchains[arch] def ResolveReferences(self, var_dict, args): @@ -464,9 +465,9 @@ class Toolchains: links = [] for version in versions: url = '%s/%s/%s/' % (base, arch, version) - print 'Checking: %s' % url - response = urllib2.urlopen(url) - html = response.read() + print('Checking: %s' % url) + response = urllib.request.urlopen(url) + html = tools.ToString(response.read()) parser = MyHTMLParser(fetch_arch) parser.feed(html) if fetch_arch == 'list': @@ -488,14 +489,14 @@ class Toolchains: Full path to the downloaded archive file in that directory, or None if there was an error while downloading """ - print 'Downloading: %s' % url + print('Downloading: %s' % url) leaf = url.split('/')[-1] tmpdir = tempfile.mkdtemp('.buildman') - response = urllib2.urlopen(url) + response = urllib.request.urlopen(url) fname = os.path.join(tmpdir, leaf) fd = open(fname, 'wb') meta = response.info() - size = int(meta.getheaders('Content-Length')[0]) + size = int(meta.get('Content-Length')) done = 0 block_size = 1 << 16 status = '' @@ -504,19 +505,19 @@ class Toolchains: while True: buffer = response.read(block_size) if not buffer: - print chr(8) * (len(status) + 1), '\r', + print(chr(8) * (len(status) + 1), '\r', end=' ') break done += len(buffer) fd.write(buffer) - status = r'%10d MiB [%3d%%]' % (done / 1024 / 1024, - done * 100 / size) + status = r'%10d MiB [%3d%%]' % (done // 1024 // 1024, + done * 100 // size) status = status + chr(8) * (len(status) + 1) - print status, + print(status, end=' ') sys.stdout.flush() fd.close() if done != size: - print 'Error, failed to download' + print('Error, failed to download') os.remove(fname) fname = None return tmpdir, fname @@ -565,11 +566,11 @@ class Toolchains: """ # Fist get the URL for this architecture col = terminal.Color() - print col.Color(col.BLUE, "Downloading toolchain for arch '%s'" % arch) + print(col.Color(col.BLUE, "Downloading toolchain for arch '%s'" % arch)) url = self.LocateArchUrl(arch) if not url: - print ("Cannot find toolchain for arch '%s' - use 'list' to list" % - arch) + print(("Cannot find toolchain for arch '%s' - use 'list' to list" % + arch)) return 2 home = os.environ['HOME'] dest = os.path.join(home, '.buildman-toolchains') @@ -580,28 +581,28 @@ class Toolchains: tmpdir, tarfile = self.Download(url) if not tarfile: return 1 - print col.Color(col.GREEN, 'Unpacking to: %s' % dest), + print(col.Color(col.GREEN, 'Unpacking to: %s' % dest), end=' ') sys.stdout.flush() path = self.Unpack(tarfile, dest) os.remove(tarfile) os.rmdir(tmpdir) - print + print() # Check that the toolchain works - print col.Color(col.GREEN, 'Testing') + print(col.Color(col.GREEN, 'Testing')) dirpath = os.path.join(dest, path) compiler_fname_list = self.ScanPath(dirpath, True) if not compiler_fname_list: - print 'Could not locate C compiler - fetch failed.' + print('Could not locate C compiler - fetch failed.') return 1 if len(compiler_fname_list) != 1: - print col.Color(col.RED, 'Warning, ambiguous toolchains: %s' % - ', '.join(compiler_fname_list)) + print(col.Color(col.RED, 'Warning, ambiguous toolchains: %s' % + ', '.join(compiler_fname_list))) toolchain = Toolchain(compiler_fname_list[0], True, True) # Make sure that it will be found by buildman if not self.TestSettingsHasPath(dirpath): - print ("Adding 'download' to config file '%s'" % - bsettings.config_fname) + print(("Adding 'download' to config file '%s'" % + bsettings.config_fname)) bsettings.SetItem('toolchain', 'download', '%s/*/*' % dest) return 0 diff --git a/tools/dtoc/dtoc.py b/tools/dtoc/dtoc.py index 514e0dd4a3..b3596a5918 100755 --- a/tools/dtoc/dtoc.py +++ b/tools/dtoc/dtoc.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0+ # # Copyright (C) 2016 Google, Inc diff --git a/tools/dtoc/fdt.py b/tools/dtoc/fdt.py index 6770be79fb..1b7b730359 100644 --- a/tools/dtoc/fdt.py +++ b/tools/dtoc/fdt.py @@ -56,9 +56,6 @@ def BytesToValue(data): is_string = False break for ch in string: - # Handle Python 2 treating bytes as str - if type(ch) == str: - ch = ord(ch) if ch < 32 or ch > 127: is_string = False break @@ -66,15 +63,9 @@ def BytesToValue(data): is_string = False if is_string: if count == 1: - if sys.version_info[0] >= 3: # pragma: no cover - return TYPE_STRING, strings[0].decode() - else: - return TYPE_STRING, strings[0] + return TYPE_STRING, strings[0].decode() else: - if sys.version_info[0] >= 3: # pragma: no cover - return TYPE_STRING, [s.decode() for s in strings[:-1]] - else: - return TYPE_STRING, strings[:-1] + return TYPE_STRING, [s.decode() for s in strings[:-1]] if size % 4: if size == 1: return TYPE_BYTE, tools.ToChar(data[0]) @@ -415,8 +406,8 @@ class Node: prop_name: Name of property to set val: String value to set (will be \0-terminated in DT) """ - if sys.version_info[0] >= 3: # pragma: no cover - val = bytes(val, 'utf-8') + if type(val) == str: + val = val.encode('utf-8') self._CheckProp(prop_name).props[prop_name].SetData(val + b'\0') def AddString(self, prop_name, val): diff --git a/tools/dtoc/test_dtoc.py b/tools/dtoc/test_dtoc.py index b915b27856..d733b70655 100644..100755 --- a/tools/dtoc/test_dtoc.py +++ b/tools/dtoc/test_dtoc.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0+ # Copyright (c) 2012 The Chromium OS Authors. # diff --git a/tools/dtoc/test_fdt.py b/tools/dtoc/test_fdt.py index 028c8cbaa8..3316757e61 100755 --- a/tools/dtoc/test_fdt.py +++ b/tools/dtoc/test_fdt.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0+ # Copyright (c) 2018 Google, Inc # Written by Simon Glass <sjg@chromium.org> diff --git a/tools/libfdt/fdt_rw.c b/tools/libfdt/fdt_rw.c index 68fc7c8c88..7189f01429 100644 --- a/tools/libfdt/fdt_rw.c +++ b/tools/libfdt/fdt_rw.c @@ -11,6 +11,7 @@ int fdt_remove_unused_strings(const void *old, void *new) const char *str; int ret; int tag = FDT_PROP; + int allocated; /* Make a copy and remove the strings */ memcpy(new, old, size); @@ -25,7 +26,7 @@ int fdt_remove_unused_strings(const void *old, void *new) new_prop = (struct fdt_property *)(unsigned long) fdt_get_property_by_offset(new, offset, NULL); str = fdt_string(old, fdt32_to_cpu(old_prop->nameoff)); - ret = fdt_find_add_string_(new, str); + ret = fdt_find_add_string_(new, str, &allocated); if (ret < 0) return ret; new_prop->nameoff = cpu_to_fdt32(ret); diff --git a/tools/microcode-tool.py b/tools/microcode-tool.py index 249a33b8ca..24c02c4fca 100755 --- a/tools/microcode-tool.py +++ b/tools/microcode-tool.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0+ # # Copyright (c) 2014 Google, Inc @@ -126,15 +126,15 @@ def List(date, microcodes, model): microcodes: Dict of Microcode objects indexed by name model: Model string to search for, or None """ - print 'Date: %s' % date + print('Date: %s' % date) if model: mcode_list, tried = FindMicrocode(microcodes, model.lower()) - print 'Matching models %s:' % (', '.join(tried)) + print('Matching models %s:' % (', '.join(tried))) else: - print 'All models:' - mcode_list = [microcodes[m] for m in microcodes.keys()] + print('All models:') + mcode_list = [microcodes[m] for m in list(microcodes.keys())] for mcode in mcode_list: - print '%-20s: model %s' % (mcode.name, mcode.model) + print('%-20s: model %s' % (mcode.name, mcode.model)) def FindMicrocode(microcodes, model): """Find all the microcode chunks which match the given model. @@ -164,7 +164,7 @@ def FindMicrocode(microcodes, model): for i in range(3): abbrev = model[:-i] if i else model tried.append(abbrev) - for mcode in microcodes.values(): + for mcode in list(microcodes.values()): if mcode.model.startswith(abbrev): found.append(mcode) if found: @@ -229,17 +229,17 @@ data = <%s args += [mcode.words[i] for i in range(7)] args.append(words) if outfile == '-': - print out % tuple(args) + print(out % tuple(args)) else: if not outfile: if not os.path.exists(MICROCODE_DIR): - print >> sys.stderr, "Creating directory '%s'" % MICROCODE_DIR + print("Creating directory '%s'" % MICROCODE_DIR, file=sys.stderr) os.makedirs(MICROCODE_DIR) outfile = os.path.join(MICROCODE_DIR, mcode.name + '.dtsi') - print >> sys.stderr, "Writing microcode for '%s' to '%s'" % ( - ', '.join([mcode.name for mcode in mcodes]), outfile) + print("Writing microcode for '%s' to '%s'" % ( + ', '.join([mcode.name for mcode in mcodes]), outfile), file=sys.stderr) with open(outfile, 'w') as fd: - print >> fd, out % tuple(args) + print(out % tuple(args), file=fd) def MicrocodeTool(): """Run the microcode tool""" @@ -289,14 +289,14 @@ def MicrocodeTool(): if cmd == 'list': List(date, microcodes, options.model) elif cmd == 'license': - print '\n'.join(license_text) + print('\n'.join(license_text)) elif cmd == 'create': if not options.model: parser.error('You must specify a model to create') model = options.model.lower() if options.model == 'all': options.multiple = True - mcode_list = microcodes.values() + mcode_list = list(microcodes.values()) tried = [] else: mcode_list, tried = FindMicrocode(microcodes, model) diff --git a/tools/moveconfig.py b/tools/moveconfig.py index b99417e9d6..e2ff4cfc88 100755 --- a/tools/moveconfig.py +++ b/tools/moveconfig.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0+ # # Author: Masahiro Yamada <yamada.masahiro@socionext.com> @@ -304,7 +304,7 @@ import glob import multiprocessing import optparse import os -import Queue +import queue import re import shutil import subprocess @@ -450,8 +450,8 @@ def get_matched_defconfigs(defconfigs_file): line = line.split(' ')[0] # handle 'git log' input matched = get_matched_defconfig(line) if not matched: - print >> sys.stderr, "warning: %s:%d: no defconfig matched '%s'" % \ - (defconfigs_file, i + 1, line) + print("warning: %s:%d: no defconfig matched '%s'" % \ + (defconfigs_file, i + 1, line), file=sys.stderr) defconfigs += matched @@ -494,11 +494,11 @@ def show_diff(a, b, file_path, color_enabled): for line in diff: if line[0] == '-' and line[1] != '-': - print color_text(color_enabled, COLOR_RED, line), + print(color_text(color_enabled, COLOR_RED, line), end=' ') elif line[0] == '+' and line[1] != '+': - print color_text(color_enabled, COLOR_GREEN, line), + print(color_text(color_enabled, COLOR_GREEN, line), end=' ') else: - print line, + print(line, end=' ') def extend_matched_lines(lines, matched, pre_patterns, post_patterns, extend_pre, extend_post): @@ -554,9 +554,9 @@ def extend_matched_lines(lines, matched, pre_patterns, post_patterns, extend_pre def confirm(options, prompt): if not options.yes: while True: - choice = raw_input('{} [y/n]: '.format(prompt)) + choice = input('{} [y/n]: '.format(prompt)) choice = choice.lower() - print choice + print(choice) if choice == 'y' or choice == 'n': break @@ -809,10 +809,10 @@ def try_expand(line): val= val.strip('\"') if re.search("[*+-/]|<<|SZ_+|\(([^\)]+)\)", val): newval = hex(eval(val, SIZES)) - print "\tExpanded expression %s to %s" % (val, newval) + print("\tExpanded expression %s to %s" % (val, newval)) return cfg+'='+newval except: - print "\tFailed to expand expression in %s" % line + print("\tFailed to expand expression in %s" % line) return line @@ -838,7 +838,7 @@ class Progress: def show(self): """Display the progress.""" - print ' %d defconfigs out of %d\r' % (self.current, self.total), + print(' %d defconfigs out of %d\r' % (self.current, self.total), end=' ') sys.stdout.flush() @@ -1236,7 +1236,7 @@ class Slot: "Tool chain for '%s' is missing. Do nothing.\n" % arch) self.finish(False) return - env = toolchain.MakeEnvironment(False) + env = toolchain.MakeEnvironment(False) cmd = list(self.make_cmd) cmd.append('KCONFIG_IGNORE_DUPLICATES=1') @@ -1312,7 +1312,7 @@ class Slot: log += '\n'.join([ ' ' + s for s in self.log.split('\n') ]) # Some threads are running in parallel. # Print log atomically to not mix up logs from different threads. - print >> (sys.stdout if success else sys.stderr), log + print(log, file=(sys.stdout if success else sys.stderr)) if not success: if self.options.exit_on_error: @@ -1411,8 +1411,8 @@ class Slots: msg = "The following boards were not processed due to error:\n" msg += boards msg += "(the list has been saved in %s)\n" % output_file - print >> sys.stderr, color_text(self.options.color, COLOR_LIGHT_RED, - msg) + print(color_text(self.options.color, COLOR_LIGHT_RED, + msg), file=sys.stderr) with open(output_file, 'w') as f: f.write(boards) @@ -1431,8 +1431,8 @@ class Slots: msg += "It is highly recommended to check them manually:\n" msg += boards msg += "(the list has been saved in %s)\n" % output_file - print >> sys.stderr, color_text(self.options.color, COLOR_YELLOW, - msg) + print(color_text(self.options.color, COLOR_YELLOW, + msg), file=sys.stderr) with open(output_file, 'w') as f: f.write(boards) @@ -1448,11 +1448,11 @@ class ReferenceSource: commit: commit to git-clone """ self.src_dir = tempfile.mkdtemp() - print "Cloning git repo to a separate work directory..." + print("Cloning git repo to a separate work directory...") subprocess.check_output(['git', 'clone', os.getcwd(), '.'], cwd=self.src_dir) - print "Checkout '%s' to build the original autoconf.mk." % \ - subprocess.check_output(['git', 'rev-parse', '--short', commit]).strip() + print("Checkout '%s' to build the original autoconf.mk." % \ + subprocess.check_output(['git', 'rev-parse', '--short', commit]).strip()) subprocess.check_output(['git', 'checkout', commit], stderr=subprocess.STDOUT, cwd=self.src_dir) @@ -1480,14 +1480,14 @@ def move_config(toolchains, configs, options, db_queue): """ if len(configs) == 0: if options.force_sync: - print 'No CONFIG is specified. You are probably syncing defconfigs.', + print('No CONFIG is specified. You are probably syncing defconfigs.', end=' ') elif options.build_db: - print 'Building %s database' % CONFIG_DATABASE + print('Building %s database' % CONFIG_DATABASE) else: - print 'Neither CONFIG nor --force-sync is specified. Nothing will happen.', + print('Neither CONFIG nor --force-sync is specified. Nothing will happen.', end=' ') else: - print 'Move ' + ', '.join(configs), - print '(jobs: %d)\n' % options.jobs + print('Move ' + ', '.join(configs), end=' ') + print('(jobs: %d)\n' % options.jobs) if options.git_ref: reference_src = ReferenceSource(options.git_ref) @@ -1517,7 +1517,7 @@ def move_config(toolchains, configs, options, db_queue): while not slots.empty(): time.sleep(SLEEP_TIME) - print '' + print('') slots.show_failed_boards() slots.show_suspicious_boards() @@ -1691,15 +1691,15 @@ def do_imply_config(config_list, add_imply, imply_flags, skip_added, for config in config_list: defconfigs = defconfig_db.get(config) if not defconfigs: - print '%s not found in any defconfig' % config + print('%s not found in any defconfig' % config) continue # Get the set of defconfigs without this one (since a config cannot # imply itself) non_defconfigs = all_defconfigs - defconfigs num_defconfigs = len(defconfigs) - print '%s found in %d/%d defconfigs' % (config, num_defconfigs, - len(all_configs)) + print('%s found in %d/%d defconfigs' % (config, num_defconfigs, + len(all_configs))) # This will hold the results: key=config, value=defconfigs containing it imply_configs = {} @@ -1736,7 +1736,7 @@ def do_imply_config(config_list, add_imply, imply_flags, skip_added, if common_defconfigs: skip = False if find_superset: - for prev in imply_configs.keys(): + for prev in list(imply_configs.keys()): prev_count = len(imply_configs[prev]) count = len(common_defconfigs) if (prev_count > count and @@ -1806,15 +1806,15 @@ def do_imply_config(config_list, add_imply, imply_flags, skip_added, add_list[fname].append(linenum) if show and kconfig_info != 'skip': - print '%5d : %-30s%-25s %s' % (num_common, iconfig.ljust(30), - kconfig_info, missing_str) + print('%5d : %-30s%-25s %s' % (num_common, iconfig.ljust(30), + kconfig_info, missing_str)) # Having collected a list of things to add, now we add them. We process # each file from the largest line number to the smallest so that # earlier additions do not affect our line numbers. E.g. if we added an # imply at line 20 it would change the position of each line after # that. - for fname, linenums in add_list.iteritems(): + for fname, linenums in add_list.items(): for linenum in sorted(linenums, reverse=True): add_imply_rule(config[CONFIG_LEN:], fname, linenum) @@ -1891,11 +1891,11 @@ def main(): for flag in options.imply_flags.split(','): bad = flag not in IMPLY_FLAGS if bad: - print "Invalid flag '%s'" % flag + print("Invalid flag '%s'" % flag) if flag == 'help' or bad: - print "Imply flags: (separate with ',')" - for name, info in IMPLY_FLAGS.iteritems(): - print ' %-15s: %s' % (name, info[1]) + print("Imply flags: (separate with ',')") + for name, info in IMPLY_FLAGS.items(): + print(' %-15s: %s' % (name, info[1])) parser.print_usage() sys.exit(1) imply_flags |= IMPLY_FLAGS[flag][0] @@ -1905,14 +1905,14 @@ def main(): return config_db = {} - db_queue = Queue.Queue() + db_queue = queue.Queue() t = DatabaseThread(config_db, db_queue) t.setDaemon(True) t.start() if not options.cleanup_headers_only: check_clean_directory() - bsettings.Setup('') + bsettings.Setup('') toolchains = toolchain.Toolchains() toolchains.GetSettings() toolchains.Scan(verbose=False) @@ -1939,7 +1939,7 @@ def main(): if options.build_db: with open(CONFIG_DATABASE, 'w') as fd: - for defconfig, configs in config_db.iteritems(): + for defconfig, configs in config_db.items(): fd.write('%s\n' % defconfig) for config in sorted(configs.keys()): fd.write(' %s=%s\n' % (config, configs[config])) diff --git a/tools/patman/command.py b/tools/patman/command.py index 16299f3f5b..5fbd2c4a3e 100644 --- a/tools/patman/command.py +++ b/tools/patman/command.py @@ -4,6 +4,7 @@ import os import cros_subprocess +import tools """Shell command ease-ups for Python.""" @@ -31,6 +32,13 @@ class CommandResult: self.return_code = return_code self.exception = exception + def ToOutput(self, binary): + if not binary: + self.stdout = tools.ToString(self.stdout) + self.stderr = tools.ToString(self.stderr) + self.combined = tools.ToString(self.combined) + return self + # This permits interception of RunPipe for test purposes. If it is set to # a function, then that function is called with the pipe list being @@ -41,7 +49,7 @@ test_result = None def RunPipe(pipe_list, infile=None, outfile=None, capture=False, capture_stderr=False, oneline=False, - raise_on_error=True, cwd=None, **kwargs): + raise_on_error=True, cwd=None, binary=False, **kwargs): """ Perform a command pipeline, with optional input/output filenames. @@ -67,7 +75,7 @@ def RunPipe(pipe_list, infile=None, outfile=None, else: return test_result # No result: fall through to normal processing - result = CommandResult() + result = CommandResult(b'', b'', b'') last_pipe = None pipeline = list(pipe_list) user_pipestr = '|'.join([' '.join(pipe) for pipe in pipe_list]) @@ -93,29 +101,36 @@ def RunPipe(pipe_list, infile=None, outfile=None, if raise_on_error: raise Exception("Error running '%s': %s" % (user_pipestr, str)) result.return_code = 255 - return result + return result.ToOutput(binary) if capture: result.stdout, result.stderr, result.combined = ( last_pipe.CommunicateFilter(None)) if result.stdout and oneline: - result.output = result.stdout.rstrip('\r\n') + result.output = result.stdout.rstrip(b'\r\n') result.return_code = last_pipe.wait() else: result.return_code = os.waitpid(last_pipe.pid, 0)[1] if raise_on_error and result.return_code: raise Exception("Error running '%s'" % user_pipestr) - return result + return result.ToOutput(binary) def Output(*cmd, **kwargs): kwargs['raise_on_error'] = kwargs.get('raise_on_error', True) return RunPipe([cmd], capture=True, **kwargs).stdout def OutputOneLine(*cmd, **kwargs): + """Run a command and output it as a single-line string + + The command us expected to produce a single line of output + + Returns: + String containing output of command + """ raise_on_error = kwargs.pop('raise_on_error', True) - return (RunPipe([cmd], capture=True, oneline=True, - raise_on_error=raise_on_error, - **kwargs).stdout.strip()) + result = RunPipe([cmd], capture=True, oneline=True, + raise_on_error=raise_on_error, **kwargs).stdout.strip() + return result def Run(*cmd, **kwargs): return RunPipe([cmd], **kwargs).stdout diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 2321f9e028..76319fff37 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -51,7 +51,7 @@ class TestFunctional(unittest.TestCase): @classmethod def GetText(self, fname): - return open(self.GetPath(fname)).read() + return open(self.GetPath(fname), encoding='utf-8').read() @classmethod def GetPatchName(self, subject): @@ -160,7 +160,7 @@ class TestFunctional(unittest.TestCase): dry_run, not ignore_bad_tags, cc_file, in_reply_to=in_reply_to, thread=None) series.ShowActions(args, cmd, process_tags) - cc_lines = open(cc_file).read().splitlines() + cc_lines = open(cc_file, encoding='utf-8').read().splitlines() os.remove(cc_file) lines = out[0].splitlines() @@ -229,14 +229,14 @@ Simon Glass (2): 2.7.4 ''' - lines = open(cover_fname).read().splitlines() + lines = open(cover_fname, encoding='utf-8').read().splitlines() self.assertEqual( 'Subject: [RFC PATCH v3 0/2] test: A test patch series', lines[3]) self.assertEqual(expected.splitlines(), lines[7:]) for i, fname in enumerate(args): - lines = open(fname).read().splitlines() + lines = open(fname, encoding='utf-8').read().splitlines() subject = [line for line in lines if line.startswith('Subject')] self.assertEqual('Subject: [RFC %d/%d]' % (i + 1, count), subject[0][:18]) diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py index ef06606297..df3eb7483b 100644 --- a/tools/patman/patchstream.py +++ b/tools/patman/patchstream.py @@ -511,8 +511,8 @@ def FixPatch(backup_dir, fname, series, commit): A list of errors, or [] if all ok. """ handle, tmpname = tempfile.mkstemp() - outfd = os.fdopen(handle, 'w') - infd = open(fname, 'r') + outfd = os.fdopen(handle, 'w', encoding='utf-8') + infd = open(fname, 'r', encoding='utf-8') ps = PatchStream(series) ps.commit = commit ps.ProcessStream(infd, outfd) diff --git a/tools/patman/patman.py b/tools/patman/patman.py index 0187ebe1d4..cf53e532dd 100755 --- a/tools/patman/patman.py +++ b/tools/patman/patman.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0+ # # Copyright (c) 2011 The Chromium OS Authors. diff --git a/tools/patman/series.py b/tools/patman/series.py index d667d9b6d6..02a1113ad0 100644 --- a/tools/patman/series.py +++ b/tools/patman/series.py @@ -223,7 +223,7 @@ class Series(dict): col = terminal.Color() # Look for commit tags (of the form 'xxx:' at the start of the subject) fname = '/tmp/patman.%d' % os.getpid() - fd = open(fname, 'w') + fd = open(fname, 'w', encoding='utf-8') all_ccs = [] for commit in self.commits: cc = [] diff --git a/tools/patman/settings.py b/tools/patman/settings.py index c98911d522..5dc83a8500 100644 --- a/tools/patman/settings.py +++ b/tools/patman/settings.py @@ -165,7 +165,7 @@ def ReadGitAliases(fname): fname: Filename to read """ try: - fd = open(fname, 'r') + fd = open(fname, 'r', encoding='utf-8') except IOError: print("Warning: Cannot find alias file '%s'" % fname) return @@ -259,7 +259,7 @@ def _ReadAliasFile(fname): """ if os.path.exists(fname): bad_line = None - with open(fname) as fd: + with open(fname, encoding='utf-8') as fd: linenum = 0 for line in fd: linenum += 1 diff --git a/tools/patman/test.py b/tools/patman/test.py index cc61c20606..889e186606 100644 --- a/tools/patman/test.py +++ b/tools/patman/test.py @@ -72,12 +72,12 @@ Signed-off-by: Simon Glass <sjg@chromium.org> ''' out = '' inhandle, inname = tempfile.mkstemp() - infd = os.fdopen(inhandle, 'w') + infd = os.fdopen(inhandle, 'w', encoding='utf-8') infd.write(data) infd.close() exphandle, expname = tempfile.mkstemp() - expfd = os.fdopen(exphandle, 'w') + expfd = os.fdopen(exphandle, 'w', encoding='utf-8') expfd.write(expected) expfd.close() diff --git a/tools/patman/tools.py b/tools/patman/tools.py index 4a7fcdad21..3feddb292f 100644 --- a/tools/patman/tools.py +++ b/tools/patman/tools.py @@ -186,7 +186,7 @@ def PathHasFile(path_spec, fname): return True return False -def Run(name, *args): +def Run(name, *args, **kwargs): """Run a tool with some arguments This runs a 'tool', which is a program used by binman to process files and @@ -201,13 +201,14 @@ def Run(name, *args): CommandResult object """ try: + binary = kwargs.get('binary') env = None if tool_search_paths: env = dict(os.environ) env['PATH'] = ':'.join(tool_search_paths) + ':' + env['PATH'] all_args = (name,) + args result = command.RunPipe([all_args], capture=True, capture_stderr=True, - env=env, raise_on_error=False) + env=env, raise_on_error=False, binary=binary) if result.return_code: raise Exception("Error %d running '%s': %s" % (result.return_code,' '.join(all_args), @@ -375,7 +376,7 @@ def ToBytes(string): """Convert a str type into a bytes type Args: - string: string to convert value + string: string to convert Returns: Python 3: A bytes type @@ -385,6 +386,18 @@ def ToBytes(string): return string.encode('utf-8') return string +def ToString(bval): + """Convert a bytes type into a str type + + Args: + bval: bytes value to convert + + Returns: + Python 3: A bytes type + Python 2: A string type + """ + return bval.decode('utf-8') + def Compress(indata, algo, with_header=True): """Compress some data using a given algorithm @@ -406,14 +419,14 @@ def Compress(indata, algo, with_header=True): fname = GetOutputFilename('%s.comp.tmp' % algo) WriteFile(fname, indata) if algo == 'lz4': - data = Run('lz4', '--no-frame-crc', '-c', fname) + data = Run('lz4', '--no-frame-crc', '-c', fname, binary=True) # cbfstool uses a very old version of lzma elif algo == 'lzma': outfname = GetOutputFilename('%s.comp.otmp' % algo) Run('lzma_alone', 'e', fname, outfname, '-lc1', '-lp0', '-pb0', '-d8') data = ReadFile(outfname) elif algo == 'gzip': - data = Run('gzip', '-c', fname) + data = Run('gzip', '-c', fname, binary=True) else: raise ValueError("Unknown algorithm '%s'" % algo) if with_header: @@ -446,13 +459,13 @@ def Decompress(indata, algo, with_header=True): with open(fname, 'wb') as fd: fd.write(indata) if algo == 'lz4': - data = Run('lz4', '-dc', fname) + data = Run('lz4', '-dc', fname, binary=True) elif algo == 'lzma': outfname = GetOutputFilename('%s.decomp.otmp' % algo) Run('lzma_alone', 'd', fname, outfname) - data = ReadFile(outfname) + data = ReadFile(outfname, binary=True) elif algo == 'gzip': - data = Run('gzip', '-cd', fname) + data = Run('gzip', '-cd', fname, binary=True) else: raise ValueError("Unknown algorithm '%s'" % algo) return data diff --git a/tools/rkmux.py b/tools/rkmux.py index 11c192a073..1226ee201c 100755 --- a/tools/rkmux.py +++ b/tools/rkmux.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # Script to create enums from datasheet register tables # @@ -43,8 +43,8 @@ class RegField: self.desc.append(desc) def Show(self): - print self - print + print(self) + print() self.__init__() def __str__(self): @@ -65,11 +65,11 @@ class Printer: self.output_footer() def output_header(self): - print '/* %s */' % self.name - print 'enum {' + print('/* %s */' % self.name) + print('enum {') def output_footer(self): - print '};'; + print('};'); def output_regfield(self, regfield): lines = regfield.desc @@ -97,7 +97,7 @@ class Printer: self.first = False self.output_header() else: - print + print() out_enum(field, 'shift', bit_low) out_enum(field, 'mask', mask) next_val = -1 @@ -175,7 +175,7 @@ def out_enum(field, suffix, value, skip_val=False): val_str = '%d' % value str += '%s= %s' % ('\t' * tabs, val_str) - print '\t%s,' % str + print('\t%s,' % str) # Process a CSV file, e.g. from tabula def process_csv(name, fd): |