From 75ef5c31550fef031cd8153b9872d6d3fb77ac21 Mon Sep 17 00:00:00 2001 From: Jeremy Bettis Date: Mon, 14 Mar 2022 17:22:37 -0600 Subject: zmake: Write ninja output to a build.log file In order to capture the memory usage report in the link stage, write all output from ninja to a build.log file in the build dir. For example: `zmake build herobrine` will create files in `build/zephyr/herobrine/build-ro/build.log` and `build/zephyr/herobrine/build-rw/build.log` I intend to parse this file in firmware_builder.py BRANCH=None BUG=b:223846977 TEST=zmake build herobrine; \ tail build/zephyr/herobrine/build-*/build.log Change-Id: I10e1e29e945f86bbc19adf62946ea7f3aab8fc6f Signed-off-by: Jeremy Bettis Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3523395 Tested-by: Jeremy Bettis Auto-Submit: Jeremy Bettis Reviewed-by: Jack Rosenthal Commit-Queue: Jack Rosenthal --- zephyr/zmake/zmake/multiproc.py | 29 ++++++++++++++++++++++++++--- zephyr/zmake/zmake/zmake.py | 7 +++++-- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/zephyr/zmake/zmake/multiproc.py b/zephyr/zmake/zmake/multiproc.py index 5e98374c8c..94f5f5b69d 100644 --- a/zephyr/zmake/zmake/multiproc.py +++ b/zephyr/zmake/zmake/multiproc.py @@ -53,7 +53,13 @@ class LogWriter: """ def __init__( - self, logger, log_level, log_level_override_func, job_id, file_descriptor + self, + logger, + log_level, + log_level_override_func, + job_id, + file_descriptor, + tee_output=None, ): self._logger = logger self._log_level = log_level @@ -62,6 +68,7 @@ class LogWriter: self._written_at_level = collections.defaultdict(lambda: False) self._job_id = job_id self._file_descriptor = file_descriptor + self._tee_output = tee_output def log_line(self, line): """Log a line of output @@ -72,6 +79,9 @@ class LogWriter: Args: line: Text line to log """ + if self._tee_output: + self._tee_output.write(line) + self._tee_output.write("\n") if self._override_func: # Get the new log level and update the default. The reason we # want to update the default is that if we hit an error, all @@ -103,6 +113,9 @@ class LogWriter: """ with _logging_cv: _logging_cv.wait_for(lambda: self._file_descriptor not in _logging_map) + if self._tee_output: + self._tee_output.close() + self._tee_output = None def _log_fd(fd): @@ -182,7 +195,12 @@ _logging_thread = None def log_output( - logger, log_level, file_descriptor, log_level_override_func=None, job_id=None + logger, + log_level, + file_descriptor, + log_level_override_func=None, + job_id=None, + tee_output=None, ): """Log the output from the given file descriptor. @@ -205,7 +223,12 @@ def log_output( _logging_thread.start() writer = LogWriter( - logger, log_level, log_level_override_func, job_id, file_descriptor + logger, + log_level, + log_level_override_func, + job_id, + file_descriptor, + tee_output=tee_output, ) _logging_map[file_descriptor] = writer # Write a dummy byte to the pipe to break the select so we can add the diff --git a/zephyr/zmake/zmake/zmake.py b/zephyr/zmake/zmake/zmake.py index e2ce065740..11248b092e 100644 --- a/zephyr/zmake/zmake/zmake.py +++ b/zephyr/zmake/zmake/zmake.py @@ -11,7 +11,7 @@ import pathlib import re import shutil import subprocess -from typing import List +from typing import Dict, List import zmake.build_config import zmake.generate_readme @@ -622,7 +622,7 @@ class Zmake: procs = [] log_writers = [] - dirs = {} + dirs: Dict[str, pathlib.Path] = {} build_dir = build_dir.resolve() @@ -667,12 +667,15 @@ class Zmake: errors="replace", ) job_id = "{}:{}".format(project.config.project_name, build_name) + dirs[build_name].mkdir(parents=True, exist_ok=True) + build_log = open(dirs[build_name] / "build.log", "w") out = zmake.multiproc.log_output( logger=self.logger, log_level=logging.INFO, file_descriptor=proc.stdout, log_level_override_func=ninja_stdout_log_level_override, job_id=job_id, + tee_output=build_log, ) err = zmake.multiproc.log_output( self.logger, -- cgit v1.2.1