mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
Merge tag 'u-boot-imx-20211020' of https://source.denx.de/u-boot/custodians/u-boot-imx
u-boot-imx-20211020 ------------------- First PR from u-boot-imx for 2022.01 CI: https://source.denx.de/u-boot/custodians/u-boot-imx/-/pipelines/9535 - new board: kontron-sl-mx8mm - imx8m: - fix secure boot - imx ESDHC: fixes - i.MX53: Support thum2, bmode and fixes for Menlo board usbarmory switch to Ethernet driver model - imx6 : - DDR calibration for Toradex boards - imx7: - Fixes - Updated gateworks boards (ventana / venice) # gpg verification failed.
This commit is contained in:
@@ -24,6 +24,17 @@ from patman import gitutil
|
||||
from patman import terminal
|
||||
from patman.terminal import Print
|
||||
|
||||
# This indicates an new int or hex Kconfig property with no default
|
||||
# It hangs the build since the 'conf' tool cannot proceed without valid input.
|
||||
#
|
||||
# We get a repeat sequence of something like this:
|
||||
# >>
|
||||
# Break things (BREAK_ME) [] (NEW)
|
||||
# Error in reading or end of file.
|
||||
# <<
|
||||
# which indicates that BREAK_ME has an empty default
|
||||
RE_NO_DEFAULT = re.compile(b'\((\w+)\) \[] \(NEW\)')
|
||||
|
||||
"""
|
||||
Theory of Operation
|
||||
|
||||
@@ -200,6 +211,8 @@ class Builder:
|
||||
_working_dir: Base working directory containing all threads
|
||||
_single_builder: BuilderThread object for the singer builder, if
|
||||
threading is not being used
|
||||
_terminated: Thread was terminated due to an error
|
||||
_restarting_config: True if 'Restart config' is detected in output
|
||||
"""
|
||||
class Outcome:
|
||||
"""Records a build outcome for a single make invocation
|
||||
@@ -304,6 +317,8 @@ class Builder:
|
||||
self.work_in_output = work_in_output
|
||||
if not self.squash_config_y:
|
||||
self.config_filenames += EXTRA_CONFIG_FILENAMES
|
||||
self._terminated = False
|
||||
self._restarting_config = False
|
||||
|
||||
self.warnings_as_errors = warnings_as_errors
|
||||
self.col = terminal.Color()
|
||||
@@ -429,9 +444,35 @@ class Builder:
|
||||
args: Arguments to pass to make
|
||||
kwargs: Arguments to pass to command.RunPipe()
|
||||
"""
|
||||
|
||||
def check_output(stream, data):
|
||||
if b'Restart config' in data:
|
||||
self._restarting_config = True
|
||||
|
||||
# If we see 'Restart config' following by multiple errors
|
||||
if self._restarting_config:
|
||||
m = RE_NO_DEFAULT.findall(data)
|
||||
|
||||
# Number of occurences of each Kconfig item
|
||||
multiple = [m.count(val) for val in set(m)]
|
||||
|
||||
# If any of them occur more than once, we have a loop
|
||||
if [val for val in multiple if val > 1]:
|
||||
self._terminated = True
|
||||
return True
|
||||
return False
|
||||
|
||||
self._restarting_config = False
|
||||
self._terminated = False
|
||||
cmd = [self.gnu_make] + list(args)
|
||||
result = command.RunPipe([cmd], capture=True, capture_stderr=True,
|
||||
cwd=cwd, raise_on_error=False, infile='/dev/null', **kwargs)
|
||||
cwd=cwd, raise_on_error=False, infile='/dev/null',
|
||||
output_func=check_output, **kwargs)
|
||||
|
||||
if self._terminated:
|
||||
# Try to be helpful
|
||||
result.stderr += '(** did you define an int/hex Kconfig with no default? **)'
|
||||
|
||||
if self.verbose_build:
|
||||
result.stdout = '%s\n' % (' '.join(cmd)) + result.stdout
|
||||
result.combined = '%s\n' % (' '.join(cmd)) + result.combined
|
||||
|
||||
@@ -300,16 +300,12 @@ class BuilderThread(threading.Thread):
|
||||
work_in_output: Use the output directory as the work directory and
|
||||
don't write to a separate output directory.
|
||||
"""
|
||||
# Fatal error
|
||||
if result.return_code < 0:
|
||||
return
|
||||
|
||||
# If we think this might have been aborted with Ctrl-C, record the
|
||||
# failure but not that we are 'done' with this board. A retry may fix
|
||||
# it.
|
||||
maybe_aborted = result.stderr and 'No child processes' in result.stderr
|
||||
maybe_aborted = result.stderr and 'No child processes' in result.stderr
|
||||
|
||||
if result.already_done:
|
||||
if result.return_code >= 0 and result.already_done:
|
||||
return
|
||||
|
||||
# Write the output and stderr
|
||||
@@ -332,6 +328,10 @@ class BuilderThread(threading.Thread):
|
||||
elif os.path.exists(errfile):
|
||||
os.remove(errfile)
|
||||
|
||||
# Fatal error
|
||||
if result.return_code < 0:
|
||||
return
|
||||
|
||||
if result.toolchain:
|
||||
# Write the build result and toolchain information.
|
||||
done_file = self.builder.GetDoneFile(result.commit_upto,
|
||||
|
||||
@@ -271,7 +271,7 @@ static void copy_file(int ifd, const char *datafile, int pad, int offset,
|
||||
if (ptr == MAP_FAILED) {
|
||||
fprintf(stderr, "Can't read %s: %s\n",
|
||||
datafile, strerror(errno));
|
||||
exit(EXIT_FAILURE);
|
||||
goto err_mmap;
|
||||
}
|
||||
|
||||
size = sbuf.st_size - datafile_offset;
|
||||
@@ -311,6 +311,7 @@ static void copy_file(int ifd, const char *datafile, int pad, int offset,
|
||||
}
|
||||
|
||||
munmap((void *)ptr, sbuf.st_size);
|
||||
err_mmap:
|
||||
close(dfd);
|
||||
}
|
||||
|
||||
|
||||
@@ -49,7 +49,8 @@ test_result = None
|
||||
|
||||
def RunPipe(pipe_list, infile=None, outfile=None,
|
||||
capture=False, capture_stderr=False, oneline=False,
|
||||
raise_on_error=True, cwd=None, binary=False, **kwargs):
|
||||
raise_on_error=True, cwd=None, binary=False,
|
||||
output_func=None, **kwargs):
|
||||
"""
|
||||
Perform a command pipeline, with optional input/output filenames.
|
||||
|
||||
@@ -63,6 +64,8 @@ def RunPipe(pipe_list, infile=None, outfile=None,
|
||||
capture: True to capture output
|
||||
capture_stderr: True to capture stderr
|
||||
oneline: True to strip newline chars from output
|
||||
output_func: Output function to call with each output fragment
|
||||
(if it returns True the function terminates)
|
||||
kwargs: Additional keyword arguments to cros_subprocess.Popen()
|
||||
Returns:
|
||||
CommandResult object
|
||||
@@ -105,7 +108,7 @@ def RunPipe(pipe_list, infile=None, outfile=None,
|
||||
|
||||
if capture:
|
||||
result.stdout, result.stderr, result.combined = (
|
||||
last_pipe.CommunicateFilter(None))
|
||||
last_pipe.CommunicateFilter(output_func))
|
||||
if result.stdout and oneline:
|
||||
result.output = result.stdout.rstrip(b'\r\n')
|
||||
result.return_code = last_pipe.wait()
|
||||
|
||||
@@ -128,6 +128,9 @@ class Popen(subprocess.Popen):
|
||||
sys.stdout or sys.stderr.
|
||||
data: a string containing the data
|
||||
|
||||
Returns:
|
||||
True to terminate the process
|
||||
|
||||
Note: The data read is buffered in memory, so do not use this
|
||||
method if the data size is large or unlimited.
|
||||
|
||||
@@ -175,6 +178,7 @@ class Popen(subprocess.Popen):
|
||||
stderr = bytearray()
|
||||
combined = bytearray()
|
||||
|
||||
stop_now = False
|
||||
input_offset = 0
|
||||
while read_set or write_set:
|
||||
try:
|
||||
@@ -212,7 +216,7 @@ class Popen(subprocess.Popen):
|
||||
stdout += data
|
||||
combined += data
|
||||
if output:
|
||||
output(sys.stdout, data)
|
||||
stop_now = output(sys.stdout, data)
|
||||
if self.stderr in rlist:
|
||||
data = b''
|
||||
# We will get an error on read if the pty is closed
|
||||
@@ -227,7 +231,9 @@ class Popen(subprocess.Popen):
|
||||
stderr += data
|
||||
combined += data
|
||||
if output:
|
||||
output(sys.stderr, data)
|
||||
stop_now = output(sys.stderr, data)
|
||||
if stop_now:
|
||||
self.terminate()
|
||||
|
||||
# All data exchanged. Translate lists into strings.
|
||||
stdout = self.ConvertData(stdout)
|
||||
|
||||
Reference in New Issue
Block a user