diff options
author | Ting Liu <ting.liu@nxp.com> | 2020-05-07 19:50:51 +0800 |
---|---|---|
committer | Otavio Salvador <otavio@ossystems.com.br> | 2020-05-08 10:11:36 -0300 |
commit | fa5c18a91cfd0fa3478fb6ead2898ac9e1942bd9 (patch) | |
tree | 3a0d4b66d595c0820e01108007b2de95a27c0181 /recipes-bsp/u-boot | |
parent | 6ef0f40c2542655872e76c8cdd5cbe3c37c4c8db (diff) | |
download | meta-freescale-fa5c18a91cfd0fa3478fb6ead2898ac9e1942bd9.tar.gz |
u-boot-qoriq: fix pylibfdt build with Python3
Backport patches to fix build failure on powerpc machines:
| /bin/sh: 1: python2: not found
| make[4]: *** [scripts/dtc/pylibfdt/_libfdt.so] Error 127
| make[3]: *** [scripts/dtc/pylibfdt] Error 2
Signed-off-by: Ting Liu <ting.liu@nxp.com>
Diffstat (limited to 'recipes-bsp/u-boot')
9 files changed, 1537 insertions, 0 deletions
diff --git a/recipes-bsp/u-boot/u-boot-qoriq-common_2019.10.inc b/recipes-bsp/u-boot/u-boot-qoriq-common_2019.10.inc index 29dd3561..bc2eaa4d 100644 --- a/recipes-bsp/u-boot/u-boot-qoriq-common_2019.10.inc +++ b/recipes-bsp/u-boot/u-boot-qoriq-common_2019.10.inc | |||
@@ -11,6 +11,13 @@ LIC_FILES_CHKSUM = " \ | |||
11 | " | 11 | " |
12 | 12 | ||
13 | SRC_URI = "git://source.codeaurora.org/external/qoriq/qoriq-components/u-boot;nobranch=1 \ | 13 | SRC_URI = "git://source.codeaurora.org/external/qoriq/qoriq-components/u-boot;nobranch=1 \ |
14 | file://0001-patman-Drop-binary-parameter.patch \ | ||
15 | file://0001-patman-Update-command.Run-to-handle-failure-better.patch \ | ||
16 | file://0001-patman-Adjust-command-to-return-strings-instead-of-b.patch \ | ||
17 | file://0001-pylibfdt-Convert-to-Python-3.patch \ | ||
18 | file://0001-binman-Convert-a-few-tests-to-Python-3.patch \ | ||
19 | file://0001-binman-Move-to-use-Python-3.patch \ | ||
20 | file://0001-buildman-Convert-to-Python-3.patch \ | ||
14 | " | 21 | " |
15 | SRCREV= "3cd9bc39934825200822855574fc91d8276e6584" | 22 | SRCREV= "3cd9bc39934825200822855574fc91d8276e6584" |
16 | 23 | ||
diff --git a/recipes-bsp/u-boot/u-boot-qoriq/0001-binman-Convert-a-few-tests-to-Python-3.patch b/recipes-bsp/u-boot/u-boot-qoriq/0001-binman-Convert-a-few-tests-to-Python-3.patch new file mode 100644 index 00000000..e530b7ca --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-qoriq/0001-binman-Convert-a-few-tests-to-Python-3.patch | |||
@@ -0,0 +1,79 @@ | |||
1 | From b6ee0cf89f9405094cbb6047076a13e14ebc030b Mon Sep 17 00:00:00 2001 | ||
2 | From: Simon Glass <sjg@chromium.org> | ||
3 | Date: Thu, 31 Oct 2019 07:43:03 -0600 | ||
4 | Subject: [PATCH] binman: Convert a few tests to Python 3 | ||
5 | |||
6 | Some tests have crept in with Python 2 strings and constructs. Convert | ||
7 | then. | ||
8 | |||
9 | Upstream-Status: Backport | ||
10 | |||
11 | Signed-off-by: Simon Glass <sjg@chromium.org> | ||
12 | --- | ||
13 | tools/binman/ftest.py | 14 +++++++------- | ||
14 | 1 file changed, 7 insertions(+), 7 deletions(-) | ||
15 | |||
16 | diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py | ||
17 | index 93507993a0..80df0e3ca9 100644 | ||
18 | --- a/tools/binman/ftest.py | ||
19 | +++ b/tools/binman/ftest.py | ||
20 | @@ -2113,7 +2113,7 @@ class TestFunctional(unittest.TestCase): | ||
21 | data = self.data = self._DoReadFileRealDtb('115_fdtmap.dts') | ||
22 | fdtmap_data = data[len(U_BOOT_DATA):] | ||
23 | magic = fdtmap_data[:8] | ||
24 | - self.assertEqual('_FDTMAP_', magic) | ||
25 | + self.assertEqual(b'_FDTMAP_', magic) | ||
26 | self.assertEqual(tools.GetBytes(0, 8), fdtmap_data[8:16]) | ||
27 | |||
28 | fdt_data = fdtmap_data[16:] | ||
29 | @@ -2156,7 +2156,7 @@ class TestFunctional(unittest.TestCase): | ||
30 | dtb = fdt.Fdt.FromData(fdt_data) | ||
31 | fdt_size = dtb.GetFdtObj().totalsize() | ||
32 | hdr_data = data[-8:] | ||
33 | - self.assertEqual('BinM', hdr_data[:4]) | ||
34 | + self.assertEqual(b'BinM', hdr_data[:4]) | ||
35 | offset = struct.unpack('<I', hdr_data[4:])[0] & 0xffffffff | ||
36 | self.assertEqual(fdtmap_pos - 0x400, offset - (1 << 32)) | ||
37 | |||
38 | @@ -2165,7 +2165,7 @@ class TestFunctional(unittest.TestCase): | ||
39 | data = self.data = self._DoReadFileRealDtb('117_fdtmap_hdr_start.dts') | ||
40 | fdtmap_pos = 0x100 + len(U_BOOT_DATA) | ||
41 | hdr_data = data[:8] | ||
42 | - self.assertEqual('BinM', hdr_data[:4]) | ||
43 | + self.assertEqual(b'BinM', hdr_data[:4]) | ||
44 | offset = struct.unpack('<I', hdr_data[4:])[0] | ||
45 | self.assertEqual(fdtmap_pos, offset) | ||
46 | |||
47 | @@ -2174,7 +2174,7 @@ class TestFunctional(unittest.TestCase): | ||
48 | data = self.data = self._DoReadFileRealDtb('118_fdtmap_hdr_pos.dts') | ||
49 | fdtmap_pos = 0x100 + len(U_BOOT_DATA) | ||
50 | hdr_data = data[0x80:0x88] | ||
51 | - self.assertEqual('BinM', hdr_data[:4]) | ||
52 | + self.assertEqual(b'BinM', hdr_data[:4]) | ||
53 | offset = struct.unpack('<I', hdr_data[4:])[0] | ||
54 | self.assertEqual(fdtmap_pos, offset) | ||
55 | |||
56 | @@ -2435,9 +2435,9 @@ class TestFunctional(unittest.TestCase): | ||
57 | ' section 100 %x section 100' % section_size, | ||
58 | ' cbfs 100 400 cbfs 0', | ||
59 | ' u-boot 138 4 u-boot 38', | ||
60 | -' u-boot-dtb 180 10f u-boot-dtb 80 3c9', | ||
61 | +' u-boot-dtb 180 105 u-boot-dtb 80 3c9', | ||
62 | ' u-boot-dtb 500 %x u-boot-dtb 400 3c9' % fdt_size, | ||
63 | -' fdtmap %x 3b4 fdtmap %x' % | ||
64 | +' fdtmap %x 3bd fdtmap %x' % | ||
65 | (fdtmap_offset, fdtmap_offset), | ||
66 | ' image-header bf8 8 image-header bf8', | ||
67 | ] | ||
68 | @@ -2522,7 +2522,7 @@ class TestFunctional(unittest.TestCase): | ||
69 | data = self._RunExtractCmd('section') | ||
70 | cbfs_data = data[:0x400] | ||
71 | cbfs = cbfs_util.CbfsReader(cbfs_data) | ||
72 | - self.assertEqual(['u-boot', 'u-boot-dtb', ''], cbfs.files.keys()) | ||
73 | + self.assertEqual(['u-boot', 'u-boot-dtb', ''], list(cbfs.files.keys())) | ||
74 | dtb_data = data[0x400:] | ||
75 | dtb = self._decompress(dtb_data) | ||
76 | self.assertEqual(EXTRACT_DTB_SIZE, len(dtb)) | ||
77 | -- | ||
78 | 2.24.0 | ||
79 | |||
diff --git a/recipes-bsp/u-boot/u-boot-qoriq/0001-binman-Move-to-use-Python-3.patch b/recipes-bsp/u-boot/u-boot-qoriq/0001-binman-Move-to-use-Python-3.patch new file mode 100644 index 00000000..c1a05b32 --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-qoriq/0001-binman-Move-to-use-Python-3.patch | |||
@@ -0,0 +1,30 @@ | |||
1 | From 388560134b99dc4cc752627d3a7e9f8c8c2a89a7 Mon Sep 17 00:00:00 2001 | ||
2 | From: Simon Glass <sjg@chromium.org> | ||
3 | Date: Thu, 31 Oct 2019 07:43:05 -0600 | ||
4 | Subject: [PATCH] binman: Move to use Python 3 | ||
5 | |||
6 | Update this tool to use Python 3 to meet the 2020 deadline. | ||
7 | |||
8 | Unfortunately this introduces a test failure due to a problem in pylibfdt | ||
9 | on Python 3. I will investigate. | ||
10 | |||
11 | Upstream-Status: Backport | ||
12 | |||
13 | Signed-off-by: Simon Glass <sjg@chromium.org> | ||
14 | --- | ||
15 | tools/binman/binman.py | 2 +- | ||
16 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
17 | |||
18 | diff --git a/tools/binman/binman.py b/tools/binman/binman.py | ||
19 | index 8bd5868df2..9e6fd72117 100755 | ||
20 | --- a/tools/binman/binman.py | ||
21 | +++ b/tools/binman/binman.py | ||
22 | @@ -1,4 +1,4 @@ | ||
23 | -#!/usr/bin/env python2 | ||
24 | +#!/usr/bin/env python3 | ||
25 | # SPDX-License-Identifier: GPL-2.0+ | ||
26 | |||
27 | # Copyright (c) 2016 Google, Inc | ||
28 | -- | ||
29 | 2.24.0 | ||
30 | |||
diff --git a/recipes-bsp/u-boot/u-boot-qoriq/0001-buildman-Convert-to-Python-3.patch b/recipes-bsp/u-boot/u-boot-qoriq/0001-buildman-Convert-to-Python-3.patch new file mode 100644 index 00000000..5d7ec42f --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-qoriq/0001-buildman-Convert-to-Python-3.patch | |||
@@ -0,0 +1,928 @@ | |||
1 | From c05aa0364280803d8274e260a739553d588ea052 Mon Sep 17 00:00:00 2001 | ||
2 | From: Simon Glass <sjg@chromium.org> | ||
3 | Date: Thu, 31 Oct 2019 07:42:53 -0600 | ||
4 | Subject: [PATCH] buildman: Convert to Python 3 | ||
5 | |||
6 | Convert buildman to Python 3 and make it use that, to meet the 2020 | ||
7 | deadline. | ||
8 | |||
9 | Upstream-Status: Backport | ||
10 | |||
11 | Signed-off-by: Simon Glass <sjg@chromium.org> | ||
12 | --- | ||
13 | tools/buildman/board.py | 9 +-- | ||
14 | tools/buildman/bsettings.py | 20 +++---- | ||
15 | tools/buildman/builder.py | 47 ++++++++-------- | ||
16 | tools/buildman/builderthread.py | 24 ++++---- | ||
17 | tools/buildman/buildman.py | 10 ++-- | ||
18 | tools/buildman/control.py | 44 +++++++-------- | ||
19 | tools/buildman/func_test.py | 16 +++--- | ||
20 | tools/buildman/test.py | 22 ++++---- | ||
21 | tools/buildman/toolchain.py | 99 +++++++++++++++++---------------- | ||
22 | 9 files changed, 146 insertions(+), 145 deletions(-) | ||
23 | |||
24 | diff --git a/tools/buildman/board.py b/tools/buildman/board.py | ||
25 | index 2a1d021574..447aaabea8 100644 | ||
26 | --- a/tools/buildman/board.py | ||
27 | +++ b/tools/buildman/board.py | ||
28 | @@ -1,6 +1,7 @@ | ||
29 | # SPDX-License-Identifier: GPL-2.0+ | ||
30 | # Copyright (c) 2012 The Chromium OS Authors. | ||
31 | |||
32 | +from collections import OrderedDict | ||
33 | import re | ||
34 | |||
35 | class Expr: | ||
36 | @@ -120,7 +121,7 @@ class Boards: | ||
37 | Args: | ||
38 | fname: Filename of boards.cfg file | ||
39 | """ | ||
40 | - with open(fname, 'r') as fd: | ||
41 | + with open(fname, 'r', encoding='utf-8') as fd: | ||
42 | for line in fd: | ||
43 | if line[0] == '#': | ||
44 | continue | ||
45 | @@ -155,7 +156,7 @@ class Boards: | ||
46 | key is board.target | ||
47 | value is board | ||
48 | """ | ||
49 | - board_dict = {} | ||
50 | + board_dict = OrderedDict() | ||
51 | for board in self._boards: | ||
52 | board_dict[board.target] = board | ||
53 | return board_dict | ||
54 | @@ -166,7 +167,7 @@ class Boards: | ||
55 | Returns: | ||
56 | List of Board objects that are marked selected | ||
57 | """ | ||
58 | - board_dict = {} | ||
59 | + board_dict = OrderedDict() | ||
60 | for board in self._boards: | ||
61 | if board.build_it: | ||
62 | board_dict[board.target] = board | ||
63 | @@ -259,7 +260,7 @@ class Boards: | ||
64 | due to each argument, arranged by argument. | ||
65 | List of errors found | ||
66 | """ | ||
67 | - result = {} | ||
68 | + result = OrderedDict() | ||
69 | warnings = [] | ||
70 | terms = self._BuildTerms(args) | ||
71 | |||
72 | diff --git a/tools/buildman/bsettings.py b/tools/buildman/bsettings.py | ||
73 | index 03d7439aa5..0b7208da37 100644 | ||
74 | --- a/tools/buildman/bsettings.py | ||
75 | +++ b/tools/buildman/bsettings.py | ||
76 | @@ -1,9 +1,9 @@ | ||
77 | # SPDX-License-Identifier: GPL-2.0+ | ||
78 | # Copyright (c) 2012 The Chromium OS Authors. | ||
79 | |||
80 | -import ConfigParser | ||
81 | +import configparser | ||
82 | import os | ||
83 | -import StringIO | ||
84 | +import io | ||
85 | |||
86 | |||
87 | def Setup(fname=''): | ||
88 | @@ -15,20 +15,20 @@ def Setup(fname=''): | ||
89 | global settings | ||
90 | global config_fname | ||
91 | |||
92 | - settings = ConfigParser.SafeConfigParser() | ||
93 | + settings = configparser.SafeConfigParser() | ||
94 | if fname is not None: | ||
95 | config_fname = fname | ||
96 | if config_fname == '': | ||
97 | config_fname = '%s/.buildman' % os.getenv('HOME') | ||
98 | if not os.path.exists(config_fname): | ||
99 | - print 'No config file found ~/.buildman\nCreating one...\n' | ||
100 | + print('No config file found ~/.buildman\nCreating one...\n') | ||
101 | CreateBuildmanConfigFile(config_fname) | ||
102 | - print 'To install tool chains, please use the --fetch-arch option' | ||
103 | + print('To install tool chains, please use the --fetch-arch option') | ||
104 | if config_fname: | ||
105 | settings.read(config_fname) | ||
106 | |||
107 | def AddFile(data): | ||
108 | - settings.readfp(StringIO.StringIO(data)) | ||
109 | + settings.readfp(io.StringIO(data)) | ||
110 | |||
111 | def GetItems(section): | ||
112 | """Get the items from a section of the config. | ||
113 | @@ -41,7 +41,7 @@ def GetItems(section): | ||
114 | """ | ||
115 | try: | ||
116 | return settings.items(section) | ||
117 | - except ConfigParser.NoSectionError as e: | ||
118 | + except configparser.NoSectionError as e: | ||
119 | return [] | ||
120 | except: | ||
121 | raise | ||
122 | @@ -68,10 +68,10 @@ def CreateBuildmanConfigFile(config_fname): | ||
123 | try: | ||
124 | f = open(config_fname, 'w') | ||
125 | except IOError: | ||
126 | - print "Couldn't create buildman config file '%s'\n" % config_fname | ||
127 | + print("Couldn't create buildman config file '%s'\n" % config_fname) | ||
128 | raise | ||
129 | |||
130 | - print >>f, '''[toolchain] | ||
131 | + print('''[toolchain] | ||
132 | # name = path | ||
133 | # e.g. x86 = /opt/gcc-4.6.3-nolibc/x86_64-linux | ||
134 | |||
135 | @@ -93,5 +93,5 @@ openrisc = or1k | ||
136 | # snapper-boards=ENABLE_AT91_TEST=1 | ||
137 | # snapper9260=${snapper-boards} BUILD_TAG=442 | ||
138 | # snapper9g45=${snapper-boards} BUILD_TAG=443 | ||
139 | -''' | ||
140 | +''', file=f) | ||
141 | f.close(); | ||
142 | diff --git a/tools/buildman/builder.py b/tools/buildman/builder.py | ||
143 | index fbb236676c..cfbe4c26b1 100644 | ||
144 | --- a/tools/buildman/builder.py | ||
145 | +++ b/tools/buildman/builder.py | ||
146 | @@ -9,7 +9,7 @@ from datetime import datetime, timedelta | ||
147 | import glob | ||
148 | import os | ||
149 | import re | ||
150 | -import Queue | ||
151 | +import queue | ||
152 | import shutil | ||
153 | import signal | ||
154 | import string | ||
155 | @@ -92,11 +92,10 @@ u-boot/ source directory | ||
156 | """ | ||
157 | |||
158 | # Possible build outcomes | ||
159 | -OUTCOME_OK, OUTCOME_WARNING, OUTCOME_ERROR, OUTCOME_UNKNOWN = range(4) | ||
160 | +OUTCOME_OK, OUTCOME_WARNING, OUTCOME_ERROR, OUTCOME_UNKNOWN = list(range(4)) | ||
161 | |||
162 | # Translate a commit subject into a valid filename (and handle unicode) | ||
163 | -trans_valid_chars = string.maketrans('/: ', '---') | ||
164 | -trans_valid_chars = trans_valid_chars.decode('latin-1') | ||
165 | +trans_valid_chars = str.maketrans('/: ', '---') | ||
166 | |||
167 | BASE_CONFIG_FILENAMES = [ | ||
168 | 'u-boot.cfg', 'u-boot-spl.cfg', 'u-boot-tpl.cfg' | ||
169 | @@ -122,8 +121,8 @@ class Config: | ||
170 | def __hash__(self): | ||
171 | val = 0 | ||
172 | for fname in self.config: | ||
173 | - for key, value in self.config[fname].iteritems(): | ||
174 | - print key, value | ||
175 | + for key, value in self.config[fname].items(): | ||
176 | + print(key, value) | ||
177 | val = val ^ hash(key) & hash(value) | ||
178 | return val | ||
179 | |||
180 | @@ -293,8 +292,8 @@ class Builder: | ||
181 | self._re_dtb_warning = re.compile('(.*): Warning .*') | ||
182 | self._re_note = re.compile('(.*):(\d*):(\d*): note: this is the location of the previous.*') | ||
183 | |||
184 | - self.queue = Queue.Queue() | ||
185 | - self.out_queue = Queue.Queue() | ||
186 | + self.queue = queue.Queue() | ||
187 | + self.out_queue = queue.Queue() | ||
188 | for i in range(self.num_threads): | ||
189 | t = builderthread.BuilderThread(self, i, incremental, | ||
190 | per_board_out_dir) | ||
191 | @@ -781,7 +780,7 @@ class Builder: | ||
192 | config = {} | ||
193 | environment = {} | ||
194 | |||
195 | - for board in boards_selected.itervalues(): | ||
196 | + for board in boards_selected.values(): | ||
197 | outcome = self.GetBuildOutcome(commit_upto, board.target, | ||
198 | read_func_sizes, read_config, | ||
199 | read_environment) | ||
200 | @@ -814,13 +813,13 @@ class Builder: | ||
201 | tconfig = Config(self.config_filenames, board.target) | ||
202 | for fname in self.config_filenames: | ||
203 | if outcome.config: | ||
204 | - for key, value in outcome.config[fname].iteritems(): | ||
205 | + for key, value in outcome.config[fname].items(): | ||
206 | tconfig.Add(fname, key, value) | ||
207 | config[board.target] = tconfig | ||
208 | |||
209 | tenvironment = Environment(board.target) | ||
210 | if outcome.environment: | ||
211 | - for key, value in outcome.environment.iteritems(): | ||
212 | + for key, value in outcome.environment.items(): | ||
213 | tenvironment.Add(key, value) | ||
214 | environment[board.target] = tenvironment | ||
215 | |||
216 | @@ -1040,12 +1039,12 @@ class Builder: | ||
217 | |||
218 | # We now have a list of image size changes sorted by arch | ||
219 | # Print out a summary of these | ||
220 | - for arch, target_list in arch_list.iteritems(): | ||
221 | + for arch, target_list in arch_list.items(): | ||
222 | # Get total difference for each type | ||
223 | totals = {} | ||
224 | for result in target_list: | ||
225 | total = 0 | ||
226 | - for name, diff in result.iteritems(): | ||
227 | + for name, diff in result.items(): | ||
228 | if name.startswith('_'): | ||
229 | continue | ||
230 | total += diff | ||
231 | @@ -1250,7 +1249,7 @@ class Builder: | ||
232 | if self._show_unknown: | ||
233 | self.AddOutcome(board_selected, arch_list, unknown_boards, '?', | ||
234 | self.col.MAGENTA) | ||
235 | - for arch, target_list in arch_list.iteritems(): | ||
236 | + for arch, target_list in arch_list.items(): | ||
237 | Print('%10s: %s' % (arch, target_list)) | ||
238 | self._error_lines += 1 | ||
239 | if better_err: | ||
240 | @@ -1283,13 +1282,13 @@ class Builder: | ||
241 | environment_minus = {} | ||
242 | environment_change = {} | ||
243 | base = tbase.environment | ||
244 | - for key, value in tenvironment.environment.iteritems(): | ||
245 | + for key, value in tenvironment.environment.items(): | ||
246 | if key not in base: | ||
247 | environment_plus[key] = value | ||
248 | - for key, value in base.iteritems(): | ||
249 | + for key, value in base.items(): | ||
250 | if key not in tenvironment.environment: | ||
251 | environment_minus[key] = value | ||
252 | - for key, value in base.iteritems(): | ||
253 | + for key, value in base.items(): | ||
254 | new_value = tenvironment.environment.get(key) | ||
255 | if new_value and value != new_value: | ||
256 | desc = '%s -> %s' % (value, new_value) | ||
257 | @@ -1342,15 +1341,15 @@ class Builder: | ||
258 | config_minus = {} | ||
259 | config_change = {} | ||
260 | base = tbase.config[name] | ||
261 | - for key, value in tconfig.config[name].iteritems(): | ||
262 | + for key, value in tconfig.config[name].items(): | ||
263 | if key not in base: | ||
264 | config_plus[key] = value | ||
265 | all_config_plus[key] = value | ||
266 | - for key, value in base.iteritems(): | ||
267 | + for key, value in base.items(): | ||
268 | if key not in tconfig.config[name]: | ||
269 | config_minus[key] = value | ||
270 | all_config_minus[key] = value | ||
271 | - for key, value in base.iteritems(): | ||
272 | + for key, value in base.items(): | ||
273 | new_value = tconfig.config.get(key) | ||
274 | if new_value and value != new_value: | ||
275 | desc = '%s -> %s' % (value, new_value) | ||
276 | @@ -1368,7 +1367,7 @@ class Builder: | ||
277 | summary[target] = '\n'.join(lines) | ||
278 | |||
279 | lines_by_target = {} | ||
280 | - for target, lines in summary.iteritems(): | ||
281 | + for target, lines in summary.items(): | ||
282 | if lines in lines_by_target: | ||
283 | lines_by_target[lines].append(target) | ||
284 | else: | ||
285 | @@ -1392,7 +1391,7 @@ class Builder: | ||
286 | Print('%s:' % arch) | ||
287 | _OutputConfigInfo(lines) | ||
288 | |||
289 | - for lines, targets in lines_by_target.iteritems(): | ||
290 | + for lines, targets in lines_by_target.items(): | ||
291 | if not lines: | ||
292 | continue | ||
293 | Print('%s :' % ' '.join(sorted(targets))) | ||
294 | @@ -1463,7 +1462,7 @@ class Builder: | ||
295 | commits: Selected commits to build | ||
296 | """ | ||
297 | # First work out how many commits we will build | ||
298 | - count = (self.commit_count + self._step - 1) / self._step | ||
299 | + count = (self.commit_count + self._step - 1) // self._step | ||
300 | self.count = len(board_selected) * count | ||
301 | self.upto = self.warned = self.fail = 0 | ||
302 | self._timestamps = collections.deque() | ||
303 | @@ -1566,7 +1565,7 @@ class Builder: | ||
304 | self.ProcessResult(None) | ||
305 | |||
306 | # Create jobs to build all commits for each board | ||
307 | - for brd in board_selected.itervalues(): | ||
308 | + for brd in board_selected.values(): | ||
309 | job = builderthread.BuilderJob() | ||
310 | job.board = brd | ||
311 | job.commits = commits | ||
312 | diff --git a/tools/buildman/builderthread.py b/tools/buildman/builderthread.py | ||
313 | index 8a9d47cd5e..570c1f6595 100644 | ||
314 | --- a/tools/buildman/builderthread.py | ||
315 | +++ b/tools/buildman/builderthread.py | ||
316 | @@ -28,7 +28,7 @@ def Mkdir(dirname, parents = False): | ||
317 | except OSError as err: | ||
318 | if err.errno == errno.EEXIST: | ||
319 | if os.path.realpath('.') == os.path.realpath(dirname): | ||
320 | - print "Cannot create the current working directory '%s'!" % dirname | ||
321 | + print("Cannot create the current working directory '%s'!" % dirname) | ||
322 | sys.exit(1) | ||
323 | pass | ||
324 | else: | ||
325 | @@ -291,15 +291,13 @@ class BuilderThread(threading.Thread): | ||
326 | outfile = os.path.join(build_dir, 'log') | ||
327 | with open(outfile, 'w') as fd: | ||
328 | if result.stdout: | ||
329 | - # We don't want unicode characters in log files | ||
330 | - fd.write(result.stdout.decode('UTF-8').encode('ASCII', 'replace')) | ||
331 | + fd.write(result.stdout) | ||
332 | |||
333 | errfile = self.builder.GetErrFile(result.commit_upto, | ||
334 | result.brd.target) | ||
335 | if result.stderr: | ||
336 | with open(errfile, 'w') as fd: | ||
337 | - # We don't want unicode characters in log files | ||
338 | - fd.write(result.stderr.decode('UTF-8').encode('ASCII', 'replace')) | ||
339 | + fd.write(result.stderr) | ||
340 | elif os.path.exists(errfile): | ||
341 | os.remove(errfile) | ||
342 | |||
343 | @@ -314,17 +312,17 @@ class BuilderThread(threading.Thread): | ||
344 | else: | ||
345 | fd.write('%s' % result.return_code) | ||
346 | with open(os.path.join(build_dir, 'toolchain'), 'w') as fd: | ||
347 | - print >>fd, 'gcc', result.toolchain.gcc | ||
348 | - print >>fd, 'path', result.toolchain.path | ||
349 | - print >>fd, 'cross', result.toolchain.cross | ||
350 | - print >>fd, 'arch', result.toolchain.arch | ||
351 | + print('gcc', result.toolchain.gcc, file=fd) | ||
352 | + print('path', result.toolchain.path, file=fd) | ||
353 | + print('cross', result.toolchain.cross, file=fd) | ||
354 | + print('arch', result.toolchain.arch, file=fd) | ||
355 | fd.write('%s' % result.return_code) | ||
356 | |||
357 | # Write out the image and function size information and an objdump | ||
358 | env = result.toolchain.MakeEnvironment(self.builder.full_path) | ||
359 | with open(os.path.join(build_dir, 'env'), 'w') as fd: | ||
360 | for var in sorted(env.keys()): | ||
361 | - print >>fd, '%s="%s"' % (var, env[var]) | ||
362 | + print('%s="%s"' % (var, env[var]), file=fd) | ||
363 | lines = [] | ||
364 | for fname in ['u-boot', 'spl/u-boot-spl']: | ||
365 | cmd = ['%snm' % self.toolchain.cross, '--size-sort', fname] | ||
366 | @@ -335,7 +333,7 @@ class BuilderThread(threading.Thread): | ||
367 | nm = self.builder.GetFuncSizesFile(result.commit_upto, | ||
368 | result.brd.target, fname) | ||
369 | with open(nm, 'w') as fd: | ||
370 | - print >>fd, nm_result.stdout, | ||
371 | + print(nm_result.stdout, end=' ', file=fd) | ||
372 | |||
373 | cmd = ['%sobjdump' % self.toolchain.cross, '-h', fname] | ||
374 | dump_result = command.RunPipe([cmd], capture=True, | ||
375 | @@ -346,7 +344,7 @@ class BuilderThread(threading.Thread): | ||
376 | objdump = self.builder.GetObjdumpFile(result.commit_upto, | ||
377 | result.brd.target, fname) | ||
378 | with open(objdump, 'w') as fd: | ||
379 | - print >>fd, dump_result.stdout, | ||
380 | + print(dump_result.stdout, end=' ', file=fd) | ||
381 | for line in dump_result.stdout.splitlines(): | ||
382 | fields = line.split() | ||
383 | if len(fields) > 5 and fields[1] == '.rodata': | ||
384 | @@ -378,7 +376,7 @@ class BuilderThread(threading.Thread): | ||
385 | sizes = self.builder.GetSizesFile(result.commit_upto, | ||
386 | result.brd.target) | ||
387 | with open(sizes, 'w') as fd: | ||
388 | - print >>fd, '\n'.join(lines) | ||
389 | + print('\n'.join(lines), file=fd) | ||
390 | |||
391 | # Write out the configuration files, with a special case for SPL | ||
392 | for dirname in ['', 'spl', 'tpl']: | ||
393 | diff --git a/tools/buildman/buildman.py b/tools/buildman/buildman.py | ||
394 | index f17aa15e7c..30a8690f93 100755 | ||
395 | --- a/tools/buildman/buildman.py | ||
396 | +++ b/tools/buildman/buildman.py | ||
397 | @@ -1,4 +1,4 @@ | ||
398 | -#!/usr/bin/env python2 | ||
399 | +#!/usr/bin/env python3 | ||
400 | # SPDX-License-Identifier: GPL-2.0+ | ||
401 | # | ||
402 | # Copyright (c) 2012 The Chromium OS Authors. | ||
403 | @@ -6,6 +6,8 @@ | ||
404 | |||
405 | """See README for more information""" | ||
406 | |||
407 | +from __future__ import print_function | ||
408 | + | ||
409 | import multiprocessing | ||
410 | import os | ||
411 | import re | ||
412 | @@ -46,11 +48,11 @@ def RunTests(skip_net_tests): | ||
413 | suite = unittest.TestLoader().loadTestsFromTestCase(module) | ||
414 | suite.run(result) | ||
415 | |||
416 | - print result | ||
417 | + print(result) | ||
418 | for test, err in result.errors: | ||
419 | - print err | ||
420 | + print(err) | ||
421 | for test, err in result.failures: | ||
422 | - print err | ||
423 | + print(err) | ||
424 | |||
425 | |||
426 | options, args = cmdline.ParseArgs() | ||
427 | diff --git a/tools/buildman/control.py b/tools/buildman/control.py | ||
428 | index 9787b86747..216012d001 100644 | ||
429 | --- a/tools/buildman/control.py | ||
430 | +++ b/tools/buildman/control.py | ||
431 | @@ -30,7 +30,7 @@ def GetActionSummary(is_summary, commits, selected, options): | ||
432 | """ | ||
433 | if commits: | ||
434 | count = len(commits) | ||
435 | - count = (count + options.step - 1) / options.step | ||
436 | + count = (count + options.step - 1) // options.step | ||
437 | commit_str = '%d commit%s' % (count, GetPlural(count)) | ||
438 | else: | ||
439 | commit_str = 'current source' | ||
440 | @@ -59,31 +59,31 @@ def ShowActions(series, why_selected, boards_selected, builder, options, | ||
441 | board_warnings: List of warnings obtained from board selected | ||
442 | """ | ||
443 | col = terminal.Color() | ||
444 | - print 'Dry run, so not doing much. But I would do this:' | ||
445 | |||
446 | + print('Dry run, so not doing much. But I would do this:') | ||
447 | + print() | ||
448 | if series: | ||
449 | commits = series.commits | ||
450 | else: | ||
451 | commits = None | ||
452 | - print GetActionSummary(False, commits, boards_selected, | ||
453 | - options) | ||
454 | - print 'Build directory: %s' % builder.base_dir | ||
455 | + print(GetActionSummary(False, commits, boards_selected, | ||
456 | + options)) | ||
457 | + print('Build directory: %s' % builder.base_dir) | ||
458 | if commits: | ||
459 | for upto in range(0, len(series.commits), options.step): | ||
460 | commit = series.commits[upto] | ||
461 | - print ' ', col.Color(col.YELLOW, commit.hash[:8], bright=False), | ||
462 | - print commit.subject | ||
463 | |||
464 | + print(' ', col.Color(col.YELLOW, commit.hash[:8], bright=False), end=' ') | ||
465 | + print(commit.subject) | ||
466 | + print() | ||
467 | for arg in why_selected: | ||
468 | if arg != 'all': | ||
469 | - print arg, ': %d boards' % len(why_selected[arg]) | ||
470 | + print(arg, ': %d boards' % len(why_selected[arg])) | ||
471 | if options.verbose: | ||
472 | - print ' %s' % ' '.join(why_selected[arg]) | ||
473 | - print ('Total boards to build for each commit: %d\n' % | ||
474 | - len(why_selected['all'])) | ||
475 | + print(' %s' % ' '.join(why_selected[arg])) | ||
476 | + print(('Total boards to build for each commit: %d\n' % | ||
477 | + len(why_selected['all']))) | ||
478 | if board_warnings: | ||
479 | for warning in board_warnings: | ||
480 | - print col.Color(col.YELLOW, warning) | ||
481 | + print(col.Color(col.YELLOW, warning)) | ||
482 | |||
483 | def CheckOutputDir(output_dir): | ||
484 | """Make sure that the output directory is not within the current directory | ||
485 | @@ -146,17 +146,17 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None, | ||
486 | if options.fetch_arch: | ||
487 | if options.fetch_arch == 'list': | ||
488 | sorted_list = toolchains.ListArchs() | ||
489 | - print col.Color(col.BLUE, 'Available architectures: %s\n' % | ||
490 | - ' '.join(sorted_list)) | ||
491 | + print(col.Color(col.BLUE, 'Available architectures: %s\n' % | ||
492 | + ' '.join(sorted_list))) | ||
493 | return 0 | ||
494 | else: | ||
495 | fetch_arch = options.fetch_arch | ||
496 | if fetch_arch == 'all': | ||
497 | fetch_arch = ','.join(toolchains.ListArchs()) | ||
498 | - print col.Color(col.CYAN, '\nDownloading toolchains: %s' % | ||
499 | - fetch_arch) | ||
500 | + print(col.Color(col.CYAN, '\nDownloading toolchains: %s' % | ||
501 | + fetch_arch)) | ||
502 | for arch in fetch_arch.split(','): | ||
503 | |||
504 | + print() | ||
505 | ret = toolchains.FetchAndInstall(arch) | ||
506 | if ret: | ||
507 | return ret | ||
508 | @@ -167,7 +167,7 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None, | ||
509 | toolchains.Scan(options.list_tool_chains and options.verbose) | ||
510 | if options.list_tool_chains: | ||
511 | toolchains.List() | ||
512 | |||
513 | + print() | ||
514 | return 0 | ||
515 | |||
516 | # Work out how many commits to build. We want to build everything on the | ||
517 | @@ -191,7 +191,7 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None, | ||
518 | sys.exit(col.Color(col.RED, "Range '%s' has no commits" % | ||
519 | options.branch)) | ||
520 | if msg: | ||
521 | - print col.Color(col.YELLOW, msg) | ||
522 | + print(col.Color(col.YELLOW, msg)) | ||
523 | count += 1 # Build upstream commit also | ||
524 | |||
525 | if not count: | ||
526 | @@ -268,7 +268,7 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None, | ||
527 | options.threads = min(multiprocessing.cpu_count(), len(selected)) | ||
528 | if not options.jobs: | ||
529 | options.jobs = max(1, (multiprocessing.cpu_count() + | ||
530 | - len(selected) - 1) / len(selected)) | ||
531 | + len(selected) - 1) // len(selected)) | ||
532 | |||
533 | if not options.step: | ||
534 | options.step = len(series.commits) - 1 | ||
535 | diff --git a/tools/buildman/func_test.py b/tools/buildman/func_test.py | ||
536 | index f90b8ea7f5..4c3d497294 100644 | ||
537 | --- a/tools/buildman/func_test.py | ||
538 | +++ b/tools/buildman/func_test.py | ||
539 | @@ -270,7 +270,7 @@ class TestFunctional(unittest.TestCase): | ||
540 | stdout=''.join(commit_log[:count])) | ||
541 | |||
542 | # Not handled, so abort | ||
543 | - print 'git log', args | ||
544 | + print('git log', args) | ||
545 | sys.exit(1) | ||
546 | |||
547 | def _HandleCommandGitConfig(self, args): | ||
548 | @@ -286,7 +286,7 @@ class TestFunctional(unittest.TestCase): | ||
549 | stdout='refs/heads/master\n') | ||
550 | |||
551 | # Not handled, so abort | ||
552 | - print 'git config', args | ||
553 | + print('git config', args) | ||
554 | sys.exit(1) | ||
555 | |||
556 | def _HandleCommandGit(self, in_args): | ||
557 | @@ -320,7 +320,7 @@ class TestFunctional(unittest.TestCase): | ||
558 | return command.CommandResult(return_code=0) | ||
559 | |||
560 | # Not handled, so abort | ||
561 | - print 'git', git_args, sub_cmd, args | ||
562 | + print('git', git_args, sub_cmd, args) | ||
563 | sys.exit(1) | ||
564 | |||
565 | def _HandleCommandNm(self, args): | ||
566 | @@ -351,7 +351,7 @@ class TestFunctional(unittest.TestCase): | ||
567 | if pipe_list[1] == ['wc', '-l']: | ||
568 | wc = True | ||
569 | else: | ||
570 | - print 'invalid pipe', kwargs | ||
571 | + print('invalid pipe', kwargs) | ||
572 | sys.exit(1) | ||
573 | cmd = pipe_list[0][0] | ||
574 | args = pipe_list[0][1:] | ||
575 | @@ -371,7 +371,7 @@ class TestFunctional(unittest.TestCase): | ||
576 | |||
577 | if not result: | ||
578 | # Not handled, so abort | ||
579 | - print 'unknown command', kwargs | ||
580 | + print('unknown command', kwargs) | ||
581 | sys.exit(1) | ||
582 | |||
583 | if wc: | ||
584 | @@ -404,14 +404,14 @@ class TestFunctional(unittest.TestCase): | ||
585 | return command.CommandResult(return_code=0) | ||
586 | |||
587 | # Not handled, so abort | ||
588 | - print 'make', stage | ||
589 | + print('make', stage) | ||
590 | sys.exit(1) | ||
591 | |||
592 | # Example function to print output lines | ||
593 | def print_lines(self, lines): | ||
594 | - print len(lines) | ||
595 | + print(len(lines)) | ||
596 | for line in lines: | ||
597 | - print line | ||
598 | + print(line) | ||
599 | #self.print_lines(terminal.GetPrintTestLines()) | ||
600 | |||
601 | def testNoBoards(self): | ||
602 | diff --git a/tools/buildman/test.py b/tools/buildman/test.py | ||
603 | index ed99b9375c..b4e28d6867 100644 | ||
604 | --- a/tools/buildman/test.py | ||
605 | +++ b/tools/buildman/test.py | ||
606 | @@ -212,11 +212,11 @@ class TestBuild(unittest.TestCase): | ||
607 | self.assertEqual(lines[1].text, '02: %s' % commits[1][1]) | ||
608 | |||
609 | col = terminal.Color() | ||
610 | - self.assertSummary(lines[2].text, 'sandbox', 'w+', ['board4'], | ||
611 | + self.assertSummary(lines[2].text, 'arm', 'w+', ['board1'], | ||
612 | outcome=OUTCOME_WARN) | ||
613 | - self.assertSummary(lines[3].text, 'arm', 'w+', ['board1'], | ||
614 | + self.assertSummary(lines[3].text, 'powerpc', 'w+', ['board2', 'board3'], | ||
615 | outcome=OUTCOME_WARN) | ||
616 | - self.assertSummary(lines[4].text, 'powerpc', 'w+', ['board2', 'board3'], | ||
617 | + self.assertSummary(lines[4].text, 'sandbox', 'w+', ['board4'], | ||
618 | outcome=OUTCOME_WARN) | ||
619 | |||
620 | # Second commit: The warnings should be listed | ||
621 | @@ -226,10 +226,10 @@ class TestBuild(unittest.TestCase): | ||
622 | |||
623 | # Third commit: Still fails | ||
624 | self.assertEqual(lines[6].text, '03: %s' % commits[2][1]) | ||
625 | - self.assertSummary(lines[7].text, 'sandbox', '+', ['board4']) | ||
626 | - self.assertSummary(lines[8].text, 'arm', '', ['board1'], | ||
627 | + self.assertSummary(lines[7].text, 'arm', '', ['board1'], | ||
628 | outcome=OUTCOME_OK) | ||
629 | - self.assertSummary(lines[9].text, 'powerpc', '+', ['board2', 'board3']) | ||
630 | + self.assertSummary(lines[8].text, 'powerpc', '+', ['board2', 'board3']) | ||
631 | + self.assertSummary(lines[9].text, 'sandbox', '+', ['board4']) | ||
632 | |||
633 | # Expect a compiler error | ||
634 | self.assertEqual(lines[10].text, '+%s' % | ||
635 | @@ -237,8 +237,6 @@ class TestBuild(unittest.TestCase): | ||
636 | |||
637 | # Fourth commit: Compile errors are fixed, just have warning for board3 | ||
638 | self.assertEqual(lines[11].text, '04: %s' % commits[3][1]) | ||
639 | - self.assertSummary(lines[12].text, 'sandbox', 'w+', ['board4'], | ||
640 | - outcome=OUTCOME_WARN) | ||
641 | expect = '%10s: ' % 'powerpc' | ||
642 | expect += ' ' + col.Color(col.GREEN, '') | ||
643 | expect += ' ' | ||
644 | @@ -246,7 +244,9 @@ class TestBuild(unittest.TestCase): | ||
645 | expect += ' ' + col.Color(col.YELLOW, 'w+') | ||
646 | expect += ' ' | ||
647 | expect += col.Color(col.YELLOW, ' %s' % 'board3') | ||
648 | - self.assertEqual(lines[13].text, expect) | ||
649 | + self.assertEqual(lines[12].text, expect) | ||
650 | + self.assertSummary(lines[13].text, 'sandbox', 'w+', ['board4'], | ||
651 | + outcome=OUTCOME_WARN) | ||
652 | |||
653 | # Compile error fixed | ||
654 | self.assertEqual(lines[14].text, '-%s' % | ||
655 | @@ -259,9 +259,9 @@ class TestBuild(unittest.TestCase): | ||
656 | |||
657 | # Fifth commit | ||
658 | self.assertEqual(lines[16].text, '05: %s' % commits[4][1]) | ||
659 | - self.assertSummary(lines[17].text, 'sandbox', '+', ['board4']) | ||
660 | - self.assertSummary(lines[18].text, 'powerpc', '', ['board3'], | ||
661 | + self.assertSummary(lines[17].text, 'powerpc', '', ['board3'], | ||
662 | outcome=OUTCOME_OK) | ||
663 | + self.assertSummary(lines[18].text, 'sandbox', '+', ['board4']) | ||
664 | |||
665 | # The second line of errors[3] is a duplicate, so buildman will drop it | ||
666 | expect = errors[3].rstrip().split('\n') | ||
667 | diff --git a/tools/buildman/toolchain.py b/tools/buildman/toolchain.py | ||
668 | index a65737fdf8..cc26e2ede5 100644 | ||
669 | --- a/tools/buildman/toolchain.py | ||
670 | +++ b/tools/buildman/toolchain.py | ||
671 | @@ -4,18 +4,19 @@ | ||
672 | |||
673 | import re | ||
674 | import glob | ||
675 | -from HTMLParser import HTMLParser | ||
676 | +from html.parser import HTMLParser | ||
677 | import os | ||
678 | import sys | ||
679 | import tempfile | ||
680 | -import urllib2 | ||
681 | +import urllib.request, urllib.error, urllib.parse | ||
682 | |||
683 | import bsettings | ||
684 | import command | ||
685 | import terminal | ||
686 | +import tools | ||
687 | |||
688 | (PRIORITY_FULL_PREFIX, PRIORITY_PREFIX_GCC, PRIORITY_PREFIX_GCC_PATH, | ||
689 | - PRIORITY_CALC) = range(4) | ||
690 | + PRIORITY_CALC) = list(range(4)) | ||
691 | |||
692 | # Simple class to collect links from a page | ||
693 | class MyHTMLParser(HTMLParser): | ||
694 | @@ -100,15 +101,15 @@ class Toolchain: | ||
695 | raise_on_error=False) | ||
696 | self.ok = result.return_code == 0 | ||
697 | if verbose: | ||
698 | - print 'Tool chain test: ', | ||
699 | + print('Tool chain test: ', end=' ') | ||
700 | if self.ok: | ||
701 | - print "OK, arch='%s', priority %d" % (self.arch, | ||
702 | - self.priority) | ||
703 | + print("OK, arch='%s', priority %d" % (self.arch, | ||
704 | + self.priority)) | ||
705 | else: | ||
706 | - print 'BAD' | ||
707 | - print 'Command: ', cmd | ||
708 | - print result.stdout | ||
709 | - print result.stderr | ||
710 | + print('BAD') | ||
711 | + print('Command: ', cmd) | ||
712 | + print(result.stdout) | ||
713 | + print(result.stderr) | ||
714 | else: | ||
715 | self.ok = True | ||
716 | |||
717 | @@ -138,7 +139,7 @@ class Toolchain: | ||
718 | value = '' | ||
719 | for name, value in bsettings.GetItems('toolchain-wrapper'): | ||
720 | if not value: | ||
721 | - print "Warning: Wrapper not found" | ||
722 | + print("Warning: Wrapper not found") | ||
723 | if value: | ||
724 | value = value + ' ' | ||
725 | |||
726 | @@ -227,11 +228,11 @@ class Toolchains: | ||
727 | """ | ||
728 | toolchains = bsettings.GetItems('toolchain') | ||
729 | if show_warning and not toolchains: | ||
730 | - print ("Warning: No tool chains. Please run 'buildman " | ||
731 | + print(("Warning: No tool chains. Please run 'buildman " | ||
732 | "--fetch-arch all' to download all available toolchains, or " | ||
733 | "add a [toolchain] section to your buildman config file " | ||
734 | "%s. See README for details" % | ||
735 | - bsettings.config_fname) | ||
736 | + bsettings.config_fname)) | ||
737 | |||
738 | paths = [] | ||
739 | for name, value in toolchains: | ||
740 | @@ -272,10 +273,10 @@ class Toolchains: | ||
741 | if add_it: | ||
742 | self.toolchains[toolchain.arch] = toolchain | ||
743 | elif verbose: | ||
744 | - print ("Toolchain '%s' at priority %d will be ignored because " | ||
745 | + print(("Toolchain '%s' at priority %d will be ignored because " | ||
746 | "another toolchain for arch '%s' has priority %d" % | ||
747 | (toolchain.gcc, toolchain.priority, toolchain.arch, | ||
748 | - self.toolchains[toolchain.arch].priority)) | ||
749 | + self.toolchains[toolchain.arch].priority))) | ||
750 | |||
751 | def ScanPath(self, path, verbose): | ||
752 | """Scan a path for a valid toolchain | ||
753 | @@ -289,9 +290,9 @@ class Toolchains: | ||
754 | fnames = [] | ||
755 | for subdir in ['.', 'bin', 'usr/bin']: | ||
756 | dirname = os.path.join(path, subdir) | ||
757 | - if verbose: print " - looking in '%s'" % dirname | ||
758 | + if verbose: print(" - looking in '%s'" % dirname) | ||
759 | for fname in glob.glob(dirname + '/*gcc'): | ||
760 | - if verbose: print " - found '%s'" % fname | ||
761 | + if verbose: print(" - found '%s'" % fname) | ||
762 | fnames.append(fname) | ||
763 | return fnames | ||
764 | |||
765 | @@ -321,9 +322,9 @@ class Toolchains: | ||
766 | Args: | ||
767 | verbose: True to print out progress information | ||
768 | """ | ||
769 | - if verbose: print 'Scanning for tool chains' | ||
770 | + if verbose: print('Scanning for tool chains') | ||
771 | for name, value in self.prefixes: | ||
772 | - if verbose: print " - scanning prefix '%s'" % value | ||
773 | + if verbose: print(" - scanning prefix '%s'" % value) | ||
774 | if os.path.exists(value): | ||
775 | self.Add(value, True, verbose, PRIORITY_FULL_PREFIX, name) | ||
776 | continue | ||
777 | @@ -335,10 +336,10 @@ class Toolchains: | ||
778 | for f in fname_list: | ||
779 | self.Add(f, True, verbose, PRIORITY_PREFIX_GCC_PATH, name) | ||
780 | if not fname_list: | ||
781 | - raise ValueError, ("No tool chain found for prefix '%s'" % | ||
782 | + raise ValueError("No tool chain found for prefix '%s'" % | ||
783 | value) | ||
784 | for path in self.paths: | ||
785 | - if verbose: print " - scanning path '%s'" % path | ||
786 | + if verbose: print(" - scanning path '%s'" % path) | ||
787 | fnames = self.ScanPath(path, verbose) | ||
788 | for fname in fnames: | ||
789 | self.Add(fname, True, verbose) | ||
790 | @@ -346,13 +347,13 @@ class Toolchains: | ||
791 | def List(self): | ||
792 | """List out the selected toolchains for each architecture""" | ||
793 | col = terminal.Color() | ||
794 | - print col.Color(col.BLUE, 'List of available toolchains (%d):' % | ||
795 | - len(self.toolchains)) | ||
796 | + print(col.Color(col.BLUE, 'List of available toolchains (%d):' % | ||
797 | + len(self.toolchains))) | ||
798 | if len(self.toolchains): | ||
799 | - for key, value in sorted(self.toolchains.iteritems()): | ||
800 | - print '%-10s: %s' % (key, value.gcc) | ||
801 | + for key, value in sorted(self.toolchains.items()): | ||
802 | + print('%-10s: %s' % (key, value.gcc)) | ||
803 | else: | ||
804 | - print 'None' | ||
805 | + print('None') | ||
806 | |||
807 | def Select(self, arch): | ||
808 | """Returns the toolchain for a given architecture | ||
809 | @@ -370,7 +371,7 @@ class Toolchains: | ||
810 | return self.toolchains[alias] | ||
811 | |||
812 | if not arch in self.toolchains: | ||
813 | - raise ValueError, ("No tool chain found for arch '%s'" % arch) | ||
814 | + raise ValueError("No tool chain found for arch '%s'" % arch) | ||
815 | return self.toolchains[arch] | ||
816 | |||
817 | def ResolveReferences(self, var_dict, args): | ||
818 | @@ -464,9 +465,9 @@ class Toolchains: | ||
819 | links = [] | ||
820 | for version in versions: | ||
821 | url = '%s/%s/%s/' % (base, arch, version) | ||
822 | - print 'Checking: %s' % url | ||
823 | - response = urllib2.urlopen(url) | ||
824 | - html = response.read() | ||
825 | + print('Checking: %s' % url) | ||
826 | + response = urllib.request.urlopen(url) | ||
827 | + html = tools.ToString(response.read()) | ||
828 | parser = MyHTMLParser(fetch_arch) | ||
829 | parser.feed(html) | ||
830 | if fetch_arch == 'list': | ||
831 | @@ -488,14 +489,14 @@ class Toolchains: | ||
832 | Full path to the downloaded archive file in that directory, | ||
833 | or None if there was an error while downloading | ||
834 | """ | ||
835 | - print 'Downloading: %s' % url | ||
836 | + print('Downloading: %s' % url) | ||
837 | leaf = url.split('/')[-1] | ||
838 | tmpdir = tempfile.mkdtemp('.buildman') | ||
839 | - response = urllib2.urlopen(url) | ||
840 | + response = urllib.request.urlopen(url) | ||
841 | fname = os.path.join(tmpdir, leaf) | ||
842 | fd = open(fname, 'wb') | ||
843 | meta = response.info() | ||
844 | - size = int(meta.getheaders('Content-Length')[0]) | ||
845 | + size = int(meta.get('Content-Length')) | ||
846 | done = 0 | ||
847 | block_size = 1 << 16 | ||
848 | status = '' | ||
849 | @@ -504,19 +505,19 @@ class Toolchains: | ||
850 | while True: | ||
851 | buffer = response.read(block_size) | ||
852 | if not buffer: | ||
853 | - print chr(8) * (len(status) + 1), '\r', | ||
854 | + print(chr(8) * (len(status) + 1), '\r', end=' ') | ||
855 | break | ||
856 | |||
857 | done += len(buffer) | ||
858 | fd.write(buffer) | ||
859 | - status = r'%10d MiB [%3d%%]' % (done / 1024 / 1024, | ||
860 | - done * 100 / size) | ||
861 | + status = r'%10d MiB [%3d%%]' % (done // 1024 // 1024, | ||
862 | + done * 100 // size) | ||
863 | status = status + chr(8) * (len(status) + 1) | ||
864 | - print status, | ||
865 | + print(status, end=' ') | ||
866 | sys.stdout.flush() | ||
867 | fd.close() | ||
868 | if done != size: | ||
869 | - print 'Error, failed to download' | ||
870 | + print('Error, failed to download') | ||
871 | os.remove(fname) | ||
872 | fname = None | ||
873 | return tmpdir, fname | ||
874 | @@ -565,11 +566,11 @@ class Toolchains: | ||
875 | """ | ||
876 | # Fist get the URL for this architecture | ||
877 | col = terminal.Color() | ||
878 | - print col.Color(col.BLUE, "Downloading toolchain for arch '%s'" % arch) | ||
879 | + print(col.Color(col.BLUE, "Downloading toolchain for arch '%s'" % arch)) | ||
880 | url = self.LocateArchUrl(arch) | ||
881 | if not url: | ||
882 | - print ("Cannot find toolchain for arch '%s' - use 'list' to list" % | ||
883 | - arch) | ||
884 | + print(("Cannot find toolchain for arch '%s' - use 'list' to list" % | ||
885 | + arch)) | ||
886 | return 2 | ||
887 | home = os.environ['HOME'] | ||
888 | dest = os.path.join(home, '.buildman-toolchains') | ||
889 | @@ -580,28 +581,28 @@ class Toolchains: | ||
890 | tmpdir, tarfile = self.Download(url) | ||
891 | if not tarfile: | ||
892 | return 1 | ||
893 | - print col.Color(col.GREEN, 'Unpacking to: %s' % dest), | ||
894 | + print(col.Color(col.GREEN, 'Unpacking to: %s' % dest), end=' ') | ||
895 | sys.stdout.flush() | ||
896 | path = self.Unpack(tarfile, dest) | ||
897 | os.remove(tarfile) | ||
898 | os.rmdir(tmpdir) | ||
899 | |||
900 | + print() | ||
901 | |||
902 | # Check that the toolchain works | ||
903 | - print col.Color(col.GREEN, 'Testing') | ||
904 | + print(col.Color(col.GREEN, 'Testing')) | ||
905 | dirpath = os.path.join(dest, path) | ||
906 | compiler_fname_list = self.ScanPath(dirpath, True) | ||
907 | if not compiler_fname_list: | ||
908 | - print 'Could not locate C compiler - fetch failed.' | ||
909 | + print('Could not locate C compiler - fetch failed.') | ||
910 | return 1 | ||
911 | if len(compiler_fname_list) != 1: | ||
912 | - print col.Color(col.RED, 'Warning, ambiguous toolchains: %s' % | ||
913 | - ', '.join(compiler_fname_list)) | ||
914 | + print(col.Color(col.RED, 'Warning, ambiguous toolchains: %s' % | ||
915 | + ', '.join(compiler_fname_list))) | ||
916 | toolchain = Toolchain(compiler_fname_list[0], True, True) | ||
917 | |||
918 | # Make sure that it will be found by buildman | ||
919 | if not self.TestSettingsHasPath(dirpath): | ||
920 | - print ("Adding 'download' to config file '%s'" % | ||
921 | - bsettings.config_fname) | ||
922 | + print(("Adding 'download' to config file '%s'" % | ||
923 | + bsettings.config_fname)) | ||
924 | bsettings.SetItem('toolchain', 'download', '%s/*/*' % dest) | ||
925 | return 0 | ||
926 | -- | ||
927 | 2.24.0 | ||
928 | |||
diff --git a/recipes-bsp/u-boot/u-boot-qoriq/0001-patman-Adjust-command-to-return-strings-instead-of-b.patch b/recipes-bsp/u-boot/u-boot-qoriq/0001-patman-Adjust-command-to-return-strings-instead-of-b.patch new file mode 100644 index 00000000..4c4f7acb --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-qoriq/0001-patman-Adjust-command-to-return-strings-instead-of-b.patch | |||
@@ -0,0 +1,228 @@ | |||
1 | From 3b3e3c0f6c261a8c9f989d437dc261ba84467d4f Mon Sep 17 00:00:00 2001 | ||
2 | From: Simon Glass <sjg@chromium.org> | ||
3 | Date: Thu, 31 Oct 2019 07:42:50 -0600 | ||
4 | Subject: [PATCH] patman: Adjust 'command' to return strings instead of bytes | ||
5 | |||
6 | At present all the 'command' methods return bytes. Most of the time we | ||
7 | actually want strings, so change this. We still need to keep the internal | ||
8 | representation as bytes since otherwise unicode strings might break over | ||
9 | a read() boundary (e.g. 4KB), causing errors. But we can convert the end | ||
10 | result to strings. | ||
11 | |||
12 | Add a 'binary' parameter to cover the few cases where bytes are needed. | ||
13 | |||
14 | Upstream-Status: Backport | ||
15 | |||
16 | Signed-off-by: Simon Glass <sjg@chromium.org> | ||
17 | --- | ||
18 | tools/binman/cbfs_util_test.py | 2 +- | ||
19 | tools/binman/ftest.py | 2 +- | ||
20 | tools/patman/command.py | 31 +++++++++++++++++++++++-------- | ||
21 | tools/patman/tools.py | 29 +++++++++++++++++++++-------- | ||
22 | 4 files changed, 46 insertions(+), 18 deletions(-) | ||
23 | |||
24 | diff --git a/tools/binman/cbfs_util_test.py b/tools/binman/cbfs_util_test.py | ||
25 | index 772c794ece..ddc2e09e35 100755 | ||
26 | --- a/tools/binman/cbfs_util_test.py | ||
27 | +++ b/tools/binman/cbfs_util_test.py | ||
28 | @@ -56,7 +56,7 @@ class TestCbfs(unittest.TestCase): | ||
29 | cls.have_lz4 = True | ||
30 | try: | ||
31 | tools.Run('lz4', '--no-frame-crc', '-c', | ||
32 | - tools.GetInputFilename('u-boot.bin')) | ||
33 | + tools.GetInputFilename('u-boot.bin'), binary=True) | ||
34 | except: | ||
35 | cls.have_lz4 = False | ||
36 | |||
37 | --- a/tools/binman/ftest.py | ||
38 | +++ b/tools/binman/ftest.py | ||
39 | @@ -151,7 +151,7 @@ class TestFunctional(unittest.TestCase): | ||
40 | self.have_lz4 = True | ||
41 | try: | ||
42 | tools.Run('lz4', '--no-frame-crc', '-c', | ||
43 | - os.path.join(self._indir, 'u-boot.bin')) | ||
44 | + os.path.join(self._indir, 'u-boot.bin'), binary=True) | ||
45 | except: | ||
46 | self.have_lz4 = False | ||
47 | |||
48 | diff --git a/tools/patman/command.py b/tools/patman/command.py | ||
49 | index 16299f3f5b..5fbd2c4a3e 100644 | ||
50 | --- a/tools/patman/command.py | ||
51 | +++ b/tools/patman/command.py | ||
52 | @@ -4,6 +4,7 @@ | ||
53 | |||
54 | import os | ||
55 | import cros_subprocess | ||
56 | +import tools | ||
57 | |||
58 | """Shell command ease-ups for Python.""" | ||
59 | |||
60 | @@ -31,6 +32,13 @@ class CommandResult: | ||
61 | self.return_code = return_code | ||
62 | self.exception = exception | ||
63 | |||
64 | + def ToOutput(self, binary): | ||
65 | + if not binary: | ||
66 | + self.stdout = tools.ToString(self.stdout) | ||
67 | + self.stderr = tools.ToString(self.stderr) | ||
68 | + self.combined = tools.ToString(self.combined) | ||
69 | + return self | ||
70 | + | ||
71 | |||
72 | # This permits interception of RunPipe for test purposes. If it is set to | ||
73 | # a function, then that function is called with the pipe list being | ||
74 | @@ -41,7 +49,7 @@ test_result = None | ||
75 | |||
76 | def RunPipe(pipe_list, infile=None, outfile=None, | ||
77 | capture=False, capture_stderr=False, oneline=False, | ||
78 | - raise_on_error=True, cwd=None, **kwargs): | ||
79 | + raise_on_error=True, cwd=None, binary=False, **kwargs): | ||
80 | """ | ||
81 | Perform a command pipeline, with optional input/output filenames. | ||
82 | |||
83 | @@ -67,7 +75,7 @@ def RunPipe(pipe_list, infile=None, outfile=None, | ||
84 | else: | ||
85 | return test_result | ||
86 | # No result: fall through to normal processing | ||
87 | - result = CommandResult() | ||
88 | + result = CommandResult(b'', b'', b'') | ||
89 | last_pipe = None | ||
90 | pipeline = list(pipe_list) | ||
91 | user_pipestr = '|'.join([' '.join(pipe) for pipe in pipe_list]) | ||
92 | @@ -93,29 +101,36 @@ def RunPipe(pipe_list, infile=None, outfile=None, | ||
93 | if raise_on_error: | ||
94 | raise Exception("Error running '%s': %s" % (user_pipestr, str)) | ||
95 | result.return_code = 255 | ||
96 | - return result | ||
97 | + return result.ToOutput(binary) | ||
98 | |||
99 | if capture: | ||
100 | result.stdout, result.stderr, result.combined = ( | ||
101 | last_pipe.CommunicateFilter(None)) | ||
102 | if result.stdout and oneline: | ||
103 | - result.output = result.stdout.rstrip('\r\n') | ||
104 | + result.output = result.stdout.rstrip(b'\r\n') | ||
105 | result.return_code = last_pipe.wait() | ||
106 | else: | ||
107 | result.return_code = os.waitpid(last_pipe.pid, 0)[1] | ||
108 | if raise_on_error and result.return_code: | ||
109 | raise Exception("Error running '%s'" % user_pipestr) | ||
110 | - return result | ||
111 | + return result.ToOutput(binary) | ||
112 | |||
113 | def Output(*cmd, **kwargs): | ||
114 | kwargs['raise_on_error'] = kwargs.get('raise_on_error', True) | ||
115 | return RunPipe([cmd], capture=True, **kwargs).stdout | ||
116 | |||
117 | def OutputOneLine(*cmd, **kwargs): | ||
118 | + """Run a command and output it as a single-line string | ||
119 | + | ||
120 | + The command us expected to produce a single line of output | ||
121 | + | ||
122 | + Returns: | ||
123 | + String containing output of command | ||
124 | + """ | ||
125 | raise_on_error = kwargs.pop('raise_on_error', True) | ||
126 | - return (RunPipe([cmd], capture=True, oneline=True, | ||
127 | - raise_on_error=raise_on_error, | ||
128 | - **kwargs).stdout.strip()) | ||
129 | + result = RunPipe([cmd], capture=True, oneline=True, | ||
130 | + raise_on_error=raise_on_error, **kwargs).stdout.strip() | ||
131 | + return result | ||
132 | |||
133 | def Run(*cmd, **kwargs): | ||
134 | return RunPipe([cmd], **kwargs).stdout | ||
135 | diff --git a/tools/patman/tools.py b/tools/patman/tools.py | ||
136 | index 4a7fcdad21..3feddb292f 100644 | ||
137 | --- a/tools/patman/tools.py | ||
138 | +++ b/tools/patman/tools.py | ||
139 | @@ -186,7 +186,7 @@ def PathHasFile(path_spec, fname): | ||
140 | return True | ||
141 | return False | ||
142 | |||
143 | -def Run(name, *args): | ||
144 | +def Run(name, *args, **kwargs): | ||
145 | """Run a tool with some arguments | ||
146 | |||
147 | This runs a 'tool', which is a program used by binman to process files and | ||
148 | @@ -201,13 +201,14 @@ def Run(name, *args): | ||
149 | CommandResult object | ||
150 | """ | ||
151 | try: | ||
152 | + binary = kwargs.get('binary') | ||
153 | env = None | ||
154 | if tool_search_paths: | ||
155 | env = dict(os.environ) | ||
156 | env['PATH'] = ':'.join(tool_search_paths) + ':' + env['PATH'] | ||
157 | all_args = (name,) + args | ||
158 | result = command.RunPipe([all_args], capture=True, capture_stderr=True, | ||
159 | - env=env, raise_on_error=False) | ||
160 | + env=env, raise_on_error=False, binary=binary) | ||
161 | if result.return_code: | ||
162 | raise Exception("Error %d running '%s': %s" % | ||
163 | (result.return_code,' '.join(all_args), | ||
164 | @@ -375,7 +376,7 @@ def ToBytes(string): | ||
165 | """Convert a str type into a bytes type | ||
166 | |||
167 | Args: | ||
168 | - string: string to convert value | ||
169 | + string: string to convert | ||
170 | |||
171 | Returns: | ||
172 | Python 3: A bytes type | ||
173 | @@ -385,6 +386,18 @@ def ToBytes(string): | ||
174 | return string.encode('utf-8') | ||
175 | return string | ||
176 | |||
177 | +def ToString(bval): | ||
178 | + """Convert a bytes type into a str type | ||
179 | + | ||
180 | + Args: | ||
181 | + bval: bytes value to convert | ||
182 | + | ||
183 | + Returns: | ||
184 | + Python 3: A bytes type | ||
185 | + Python 2: A string type | ||
186 | + """ | ||
187 | + return bval.decode('utf-8') | ||
188 | + | ||
189 | def Compress(indata, algo, with_header=True): | ||
190 | """Compress some data using a given algorithm | ||
191 | |||
192 | @@ -406,14 +419,14 @@ def Compress(indata, algo, with_header=True): | ||
193 | fname = GetOutputFilename('%s.comp.tmp' % algo) | ||
194 | WriteFile(fname, indata) | ||
195 | if algo == 'lz4': | ||
196 | - data = Run('lz4', '--no-frame-crc', '-c', fname) | ||
197 | + data = Run('lz4', '--no-frame-crc', '-c', fname, binary=True) | ||
198 | # cbfstool uses a very old version of lzma | ||
199 | elif algo == 'lzma': | ||
200 | outfname = GetOutputFilename('%s.comp.otmp' % algo) | ||
201 | Run('lzma_alone', 'e', fname, outfname, '-lc1', '-lp0', '-pb0', '-d8') | ||
202 | data = ReadFile(outfname) | ||
203 | elif algo == 'gzip': | ||
204 | - data = Run('gzip', '-c', fname) | ||
205 | + data = Run('gzip', '-c', fname, binary=True) | ||
206 | else: | ||
207 | raise ValueError("Unknown algorithm '%s'" % algo) | ||
208 | if with_header: | ||
209 | @@ -446,13 +459,13 @@ def Decompress(indata, algo, with_header=True): | ||
210 | with open(fname, 'wb') as fd: | ||
211 | fd.write(indata) | ||
212 | if algo == 'lz4': | ||
213 | - data = Run('lz4', '-dc', fname) | ||
214 | + data = Run('lz4', '-dc', fname, binary=True) | ||
215 | elif algo == 'lzma': | ||
216 | outfname = GetOutputFilename('%s.decomp.otmp' % algo) | ||
217 | Run('lzma_alone', 'd', fname, outfname) | ||
218 | - data = ReadFile(outfname) | ||
219 | + data = ReadFile(outfname, binary=True) | ||
220 | elif algo == 'gzip': | ||
221 | - data = Run('gzip', '-cd', fname) | ||
222 | + data = Run('gzip', '-cd', fname, binary=True) | ||
223 | else: | ||
224 | raise ValueError("Unknown algorithm '%s'" % algo) | ||
225 | return data | ||
226 | -- | ||
227 | 2.24.0 | ||
228 | |||
diff --git a/recipes-bsp/u-boot/u-boot-qoriq/0001-patman-Drop-binary-parameter.patch b/recipes-bsp/u-boot/u-boot-qoriq/0001-patman-Drop-binary-parameter.patch new file mode 100644 index 00000000..cee88472 --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-qoriq/0001-patman-Drop-binary-parameter.patch | |||
@@ -0,0 +1,105 @@ | |||
1 | From 3b1c0b09c99bfd30355a6ba87a15e9d408a51109 Mon Sep 17 00:00:00 2001 | ||
2 | From: Simon Glass <sjg@chromium.org> | ||
3 | Date: Sat, 24 Aug 2019 07:22:41 -0600 | ||
4 | Subject: [PATCH] patman: Drop binary parameter | ||
5 | |||
6 | Since cros_subprocess use bytestrings now, this feature not needed. Drop | ||
7 | it. | ||
8 | |||
9 | Upstream-Status: Backport | ||
10 | |||
11 | Signed-off-by: Simon Glass <sjg@chromium.org> | ||
12 | --- | ||
13 | tools/patman/cros_subprocess.py | 3 +-- | ||
14 | tools/patman/tools.py | 15 +++++++-------- | ||
15 | 2 files changed, 8 insertions(+), 10 deletions(-) | ||
16 | |||
17 | diff --git a/tools/patman/cros_subprocess.py b/tools/patman/cros_subprocess.py | ||
18 | index 06be64cc2c..0f0d60dfb7 100644 | ||
19 | --- a/tools/patman/cros_subprocess.py | ||
20 | +++ b/tools/patman/cros_subprocess.py | ||
21 | @@ -54,7 +54,7 @@ class Popen(subprocess.Popen): | ||
22 | """ | ||
23 | |||
24 | def __init__(self, args, stdin=None, stdout=PIPE_PTY, stderr=PIPE_PTY, | ||
25 | - shell=False, cwd=None, env=None, binary=False, **kwargs): | ||
26 | + shell=False, cwd=None, env=None, **kwargs): | ||
27 | """Cut-down constructor | ||
28 | |||
29 | Args: | ||
30 | @@ -72,7 +72,6 @@ class Popen(subprocess.Popen): | ||
31 | """ | ||
32 | stdout_pty = None | ||
33 | stderr_pty = None | ||
34 | - self.binary = binary | ||
35 | |||
36 | if stdout == PIPE_PTY: | ||
37 | stdout_pty = pty.openpty() | ||
38 | diff --git a/tools/patman/tools.py b/tools/patman/tools.py | ||
39 | index 0d4705db76..97441ca796 100644 | ||
40 | --- a/tools/patman/tools.py | ||
41 | +++ b/tools/patman/tools.py | ||
42 | @@ -186,7 +186,7 @@ def PathHasFile(path_spec, fname): | ||
43 | return True | ||
44 | return False | ||
45 | |||
46 | -def Run(name, *args, **kwargs): | ||
47 | +def Run(name, *args): | ||
48 | """Run a tool with some arguments | ||
49 | |||
50 | This runs a 'tool', which is a program used by binman to process files and | ||
51 | @@ -196,7 +196,6 @@ def Run(name, *args, **kwargs): | ||
52 | Args: | ||
53 | name: Command name to run | ||
54 | args: Arguments to the tool | ||
55 | - kwargs: Options to pass to command.run() | ||
56 | |||
57 | Returns: | ||
58 | CommandResult object | ||
59 | @@ -206,8 +205,8 @@ def Run(name, *args, **kwargs): | ||
60 | if tool_search_paths: | ||
61 | env = dict(os.environ) | ||
62 | env['PATH'] = ':'.join(tool_search_paths) + ':' + env['PATH'] | ||
63 | - return command.Run(name, *args, capture=True, | ||
64 | - capture_stderr=True, env=env, **kwargs) | ||
65 | + return command.Run(name, *args, capture=True, capture_stderr=True, | ||
66 | + env=env) | ||
67 | except: | ||
68 | if env and not PathHasFile(env['PATH'], name): | ||
69 | msg = "Please install tool '%s'" % name | ||
70 | @@ -401,14 +400,14 @@ def Compress(indata, algo, with_header=True): | ||
71 | fname = GetOutputFilename('%s.comp.tmp' % algo) | ||
72 | WriteFile(fname, indata) | ||
73 | if algo == 'lz4': | ||
74 | - data = Run('lz4', '--no-frame-crc', '-c', fname, binary=True) | ||
75 | + data = Run('lz4', '--no-frame-crc', '-c', fname) | ||
76 | # cbfstool uses a very old version of lzma | ||
77 | elif algo == 'lzma': | ||
78 | outfname = GetOutputFilename('%s.comp.otmp' % algo) | ||
79 | Run('lzma_alone', 'e', fname, outfname, '-lc1', '-lp0', '-pb0', '-d8') | ||
80 | data = ReadFile(outfname) | ||
81 | elif algo == 'gzip': | ||
82 | - data = Run('gzip', '-c', fname, binary=True) | ||
83 | + data = Run('gzip', '-c', fname) | ||
84 | else: | ||
85 | raise ValueError("Unknown algorithm '%s'" % algo) | ||
86 | if with_header: | ||
87 | @@ -441,13 +440,13 @@ def Decompress(indata, algo, with_header=True): | ||
88 | with open(fname, 'wb') as fd: | ||
89 | fd.write(indata) | ||
90 | if algo == 'lz4': | ||
91 | - data = Run('lz4', '-dc', fname, binary=True) | ||
92 | + data = Run('lz4', '-dc', fname) | ||
93 | elif algo == 'lzma': | ||
94 | outfname = GetOutputFilename('%s.decomp.otmp' % algo) | ||
95 | Run('lzma_alone', 'd', fname, outfname) | ||
96 | data = ReadFile(outfname) | ||
97 | elif algo == 'gzip': | ||
98 | - data = Run('gzip', '-cd', fname, binary=True) | ||
99 | + data = Run('gzip', '-cd', fname) | ||
100 | else: | ||
101 | raise ValueError("Unknown algorithm '%s'" % algo) | ||
102 | return data | ||
103 | -- | ||
104 | 2.24.0 | ||
105 | |||
diff --git a/recipes-bsp/u-boot/u-boot-qoriq/0001-patman-Update-command.Run-to-handle-failure-better.patch b/recipes-bsp/u-boot/u-boot-qoriq/0001-patman-Update-command.Run-to-handle-failure-better.patch new file mode 100644 index 00000000..bd23c458 --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-qoriq/0001-patman-Update-command.Run-to-handle-failure-better.patch | |||
@@ -0,0 +1,42 @@ | |||
1 | From 6eace398072a62e74f10f412ffadfe51b7402395 Mon Sep 17 00:00:00 2001 | ||
2 | From: Simon Glass <sjg@chromium.org> | ||
3 | Date: Sat, 24 Aug 2019 07:22:42 -0600 | ||
4 | Subject: [PATCH] patman: Update command.Run() to handle failure better | ||
5 | |||
6 | At present tools are not expected to fail. If they do an exception is | ||
7 | raised but there is no detail about what went wrong. This makes it hard | ||
8 | to debug if something does actually go wrong. | ||
9 | |||
10 | Fix this by outputting both stderr and stdout on failure. | ||
11 | |||
12 | Upstream-Status: Backport | ||
13 | |||
14 | Signed-off-by: Simon Glass <sjg@chromium.org> | ||
15 | --- | ||
16 | tools/patman/tools.py | 10 ++++++++-- | ||
17 | 1 file changed, 8 insertions(+), 2 deletions(-) | ||
18 | |||
19 | diff --git a/tools/patman/tools.py b/tools/patman/tools.py | ||
20 | index 97441ca796..0952681579 100644 | ||
21 | --- a/tools/patman/tools.py | ||
22 | +++ b/tools/patman/tools.py | ||
23 | @@ -205,8 +205,14 @@ def Run(name, *args): | ||
24 | if tool_search_paths: | ||
25 | env = dict(os.environ) | ||
26 | env['PATH'] = ':'.join(tool_search_paths) + ':' + env['PATH'] | ||
27 | - return command.Run(name, *args, capture=True, capture_stderr=True, | ||
28 | - env=env) | ||
29 | + all_args = (name,) + args | ||
30 | + result = command.RunPipe([all_args], capture=True, capture_stderr=True, | ||
31 | + env=env, raise_on_error=False) | ||
32 | + if result.return_code: | ||
33 | + raise Exception("Error %d running '%s': %s" % | ||
34 | + (result.return_code,' '.join(all_args), | ||
35 | + result.stderr)) | ||
36 | + return result.stdout | ||
37 | except: | ||
38 | if env and not PathHasFile(env['PATH'], name): | ||
39 | msg = "Please install tool '%s'" % name | ||
40 | -- | ||
41 | 2.24.0 | ||
42 | |||
diff --git a/recipes-bsp/u-boot/u-boot-qoriq/0001-pylibfdt-Convert-to-Python-3.patch b/recipes-bsp/u-boot/u-boot-qoriq/0001-pylibfdt-Convert-to-Python-3.patch new file mode 100644 index 00000000..e74609de --- /dev/null +++ b/recipes-bsp/u-boot/u-boot-qoriq/0001-pylibfdt-Convert-to-Python-3.patch | |||
@@ -0,0 +1,117 @@ | |||
1 | From b4cf5f1df741e8781bed6149291823cd1a4b8baa Mon Sep 17 00:00:00 2001 | ||
2 | From: Simon Glass <sjg@chromium.org> | ||
3 | Date: Thu, 31 Oct 2019 07:42:59 -0600 | ||
4 | Subject: [PATCH] pylibfdt: Convert to Python 3 | ||
5 | |||
6 | Build this swig module with Python 3. | ||
7 | |||
8 | Upstream-Status: Backport | ||
9 | |||
10 | Signed-off-by: Simon Glass <sjg@chromium.org> | ||
11 | --- | ||
12 | scripts/dtc/pylibfdt/Makefile | 2 +- | ||
13 | scripts/dtc/pylibfdt/libfdt.i_shipped | 2 +- | ||
14 | scripts/dtc/pylibfdt/setup.py | 2 +- | ||
15 | tools/binman/entry.py | 16 ++-------------- | ||
16 | tools/binman/entry_test.py | 15 --------------- | ||
17 | 5 files changed, 5 insertions(+), 32 deletions(-) | ||
18 | |||
19 | diff --git a/scripts/dtc/pylibfdt/Makefile b/scripts/dtc/pylibfdt/Makefile | ||
20 | index 15e66ad44d..42342c75bb 100644 | ||
21 | --- a/scripts/dtc/pylibfdt/Makefile | ||
22 | +++ b/scripts/dtc/pylibfdt/Makefile | ||
23 | @@ -21,7 +21,7 @@ quiet_cmd_pymod = PYMOD $@ | ||
24 | CPPFLAGS="$(HOSTCFLAGS) -I$(LIBFDT_srcdir)" OBJDIR=$(obj) \ | ||
25 | SOURCES="$(PYLIBFDT_srcs)" \ | ||
26 | SWIG_OPTS="-I$(LIBFDT_srcdir) -I$(LIBFDT_srcdir)/.." \ | ||
27 | - $(PYTHON2) $< --quiet build_ext --inplace | ||
28 | + $(PYTHON3) $< --quiet build_ext --inplace | ||
29 | |||
30 | $(obj)/_libfdt.so: $(src)/setup.py $(PYLIBFDT_srcs) FORCE | ||
31 | $(call if_changed,pymod) | ||
32 | diff --git a/scripts/dtc/pylibfdt/libfdt.i_shipped b/scripts/dtc/pylibfdt/libfdt.i_shipped | ||
33 | index 76e61e98bd..53b70f8f5e 100644 | ||
34 | --- a/scripts/dtc/pylibfdt/libfdt.i_shipped | ||
35 | +++ b/scripts/dtc/pylibfdt/libfdt.i_shipped | ||
36 | @@ -624,7 +624,7 @@ class Fdt(FdtRo): | ||
37 | Raises: | ||
38 | FdtException if no parent found or other error occurs | ||
39 | """ | ||
40 | - val = val.encode('utf-8') + '\0' | ||
41 | + val = val.encode('utf-8') + b'\0' | ||
42 | return check_err(fdt_setprop(self._fdt, nodeoffset, prop_name, | ||
43 | val, len(val)), quiet) | ||
44 | |||
45 | diff --git a/scripts/dtc/pylibfdt/setup.py b/scripts/dtc/pylibfdt/setup.py | ||
46 | index 4f7cf042bf..992cdec30f 100755 | ||
47 | --- a/scripts/dtc/pylibfdt/setup.py | ||
48 | +++ b/scripts/dtc/pylibfdt/setup.py | ||
49 | @@ -1,4 +1,4 @@ | ||
50 | -#!/usr/bin/env python2 | ||
51 | +#!/usr/bin/env python3 | ||
52 | |||
53 | """ | ||
54 | setup.py file for SWIG libfdt | ||
55 | diff --git a/tools/binman/entry.py b/tools/binman/entry.py | ||
56 | index 409c0dca93..5bf5be4794 100644 | ||
57 | --- a/tools/binman/entry.py | ||
58 | +++ b/tools/binman/entry.py | ||
59 | @@ -7,16 +7,7 @@ | ||
60 | from __future__ import print_function | ||
61 | |||
62 | from collections import namedtuple | ||
63 | - | ||
64 | -# importlib was introduced in Python 2.7 but there was a report of it not | ||
65 | -# working in 2.7.12, so we work around this: | ||
66 | -# http://lists.denx.de/pipermail/u-boot/2016-October/269729.html | ||
67 | -try: | ||
68 | - import importlib | ||
69 | - have_importlib = True | ||
70 | -except: | ||
71 | - have_importlib = False | ||
72 | - | ||
73 | +import importlib | ||
74 | import os | ||
75 | import sys | ||
76 | |||
77 | @@ -119,10 +110,7 @@ class Entry(object): | ||
78 | old_path = sys.path | ||
79 | sys.path.insert(0, os.path.join(our_path, 'etype')) | ||
80 | try: | ||
81 | - if have_importlib: | ||
82 | - module = importlib.import_module(module_name) | ||
83 | - else: | ||
84 | - module = __import__(module_name) | ||
85 | + module = importlib.import_module(module_name) | ||
86 | except ImportError as e: | ||
87 | raise ValueError("Unknown entry type '%s' in node '%s' (expected etype/%s.py, error '%s'" % | ||
88 | (etype, node_path, module_name, e)) | ||
89 | diff --git a/tools/binman/entry_test.py b/tools/binman/entry_test.py | ||
90 | index 13f5864516..277e10b585 100644 | ||
91 | --- a/tools/binman/entry_test.py | ||
92 | +++ b/tools/binman/entry_test.py | ||
93 | @@ -39,21 +39,6 @@ class TestEntry(unittest.TestCase): | ||
94 | else: | ||
95 | import entry | ||
96 | |||
97 | - def test1EntryNoImportLib(self): | ||
98 | - """Test that we can import Entry subclassess successfully""" | ||
99 | - sys.modules['importlib'] = None | ||
100 | - global entry | ||
101 | - self._ReloadEntry() | ||
102 | - entry.Entry.Create(None, self.GetNode(), 'u-boot') | ||
103 | - self.assertFalse(entry.have_importlib) | ||
104 | - | ||
105 | - def test2EntryImportLib(self): | ||
106 | - del sys.modules['importlib'] | ||
107 | - global entry | ||
108 | - self._ReloadEntry() | ||
109 | - entry.Entry.Create(None, self.GetNode(), 'u-boot-spl') | ||
110 | - self.assertTrue(entry.have_importlib) | ||
111 | - | ||
112 | def testEntryContents(self): | ||
113 | """Test the Entry bass class""" | ||
114 | import entry | ||
115 | -- | ||
116 | 2.24.0 | ||
117 | |||
diff --git a/recipes-bsp/u-boot/u-boot-qoriq_2019.10.bb b/recipes-bsp/u-boot/u-boot-qoriq_2019.10.bb index a47b91a3..8d79e17a 100644 --- a/recipes-bsp/u-boot/u-boot-qoriq_2019.10.bb +++ b/recipes-bsp/u-boot/u-boot-qoriq_2019.10.bb | |||
@@ -46,6 +46,7 @@ ENDIANNESS_LD = "${@bb.utils.contains("LE_UBOOT_FOR_ARMBE_TARGET", "1", "-EL", " | |||
46 | WRAP_TARGET_PREFIX ?= "${TARGET_PREFIX}" | 46 | WRAP_TARGET_PREFIX ?= "${TARGET_PREFIX}" |
47 | EXTRA_OEMAKE = 'CROSS_COMPILE=${WRAP_TARGET_PREFIX} CC="${WRAP_TARGET_PREFIX}gcc ${TOOLCHAIN_OPTIONS} ${ENDIANNESS_GCC}" LD="${WRAP_TARGET_PREFIX}ld ${ENDIANNESS_LD}" V=1' | 47 | EXTRA_OEMAKE = 'CROSS_COMPILE=${WRAP_TARGET_PREFIX} CC="${WRAP_TARGET_PREFIX}gcc ${TOOLCHAIN_OPTIONS} ${ENDIANNESS_GCC}" LD="${WRAP_TARGET_PREFIX}ld ${ENDIANNESS_LD}" V=1' |
48 | EXTRA_OEMAKE += 'HOSTCC="${BUILD_CC} ${BUILD_CFLAGS} ${BUILD_LDFLAGS}"' | 48 | EXTRA_OEMAKE += 'HOSTCC="${BUILD_CC} ${BUILD_CFLAGS} ${BUILD_LDFLAGS}"' |
49 | EXTRA_OEMAKE += 'STAGING_INCDIR=${STAGING_INCDIR_NATIVE} STAGING_LIBDIR=${STAGING_LIBDIR_NATIVE}' | ||
49 | 50 | ||
50 | do_compile_append_qoriq() { | 51 | do_compile_append_qoriq() { |
51 | unset i j k | 52 | unset i j k |