From patchwork Tue Jan 6 22:03:38 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1323 Return-Path: X-Original-To: u-boot-concept@u-boot.org Delivered-To: u-boot-concept@u-boot.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767737153; bh=mfULeNyw6/jFe78mB7j4dFKZnnYEB+Ekn2lryZvdEok=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=kqDjgIkjL7GcJiXY6OlQ66EC3ma8Zzt4H/9lNXaT2vKRi8x/78pUqdqzeZEZ/gm4F w7lW7Vis4DvEFO8mPVldMUC8V0rQCPcn5ocUq/TanLO8dmRieVA5VY1ejTQ4Ft97H7 VRp6zH1TaP6+8+hCOAmF+GE7mcq3h9Eq/0Ir9PiagSevH2USZEob3265sdqFv8g4s/ qsoNGUL2SUY/cb5wwJX4t0+Z7zEDxBS0DB4KgTv4fgBAleCjOfbB4O00AvwnALXcB5 WyrWWHa61tXwAKIxWMaIKFOSEdKbX53d5DlM6f7gIqAVA+A2Ptx25a5X9k2aAa1244 V8AJvs/LM3cNg== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 6299B5FF82 for ; Tue, 6 Jan 2026 15:05:53 -0700 (MST) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id NZ1QeOMmJr2p for ; Tue, 6 Jan 2026 15:05:53 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767737153; bh=mfULeNyw6/jFe78mB7j4dFKZnnYEB+Ekn2lryZvdEok=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=kqDjgIkjL7GcJiXY6OlQ66EC3ma8Zzt4H/9lNXaT2vKRi8x/78pUqdqzeZEZ/gm4F w7lW7Vis4DvEFO8mPVldMUC8V0rQCPcn5ocUq/TanLO8dmRieVA5VY1ejTQ4Ft97H7 VRp6zH1TaP6+8+hCOAmF+GE7mcq3h9Eq/0Ir9PiagSevH2USZEob3265sdqFv8g4s/ qsoNGUL2SUY/cb5wwJX4t0+Z7zEDxBS0DB4KgTv4fgBAleCjOfbB4O00AvwnALXcB5 WyrWWHa61tXwAKIxWMaIKFOSEdKbX53d5DlM6f7gIqAVA+A2Ptx25a5X9k2aAa1244 V8AJvs/LM3cNg== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 50EA669146 for ; Tue, 6 Jan 2026 15:05:53 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767737152; bh=iH1F/wSPJNi7yi367zxCKWHlFlbmRNYZAUFsakGPvUY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FWJE7oGAzDVWUAVNWXWQvdOW0o/+dgUT2kEfpQQoJXONSpoenaWT6B9knNbkeUoGN EOXh8ALDoaBFXVYIqyQJjcaXoB+1gEydRZz/UIy9rFTy3QeOQ+/RkgqIUbnHDcAG6g CDuyNN784TTzKuvl8AiFBPBdCtom9lpsGBx0HV4OhBIOA+dUGf3ST9uX9XAfjSYcD+ Jq/8GyOwMBP3Fa2lOLAHLUEeGU8aJyW6P1Fur0QLiia+4srPWbgR6IcXCBZ7em3WZC eADsTcZ8kmZoWSr7LK0ixlf1IgOVNV/5DN70aDgegCXLdukCaJMxnqm0TBGjUcn1lX RI3CIwFbRdJfA== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 5606E5FF82; Tue, 6 Jan 2026 15:05:52 -0700 (MST) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10026) with ESMTP id lc7v1n5kGq7k; Tue, 6 Jan 2026 15:05:52 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767737148; bh=mJOgYSsdaM7QXTfhYhzo9M61R6/L1/63YLTspalzdKI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Q5RBFoK4CfROQd9H3Ol5NsaxyyU0kLNUvAAbx2xWVpn6WO1VJtzkk/RSsgr//5Uyq zFQLKz2mvojjZNm9lgUzvRRyTlTB9vL8/jeS493VAPkY+TdNyS+mUAnZfNFOZC7xcS o4+a6/+XoYTvfOQE+EE7SN2TO3jR6wrRnwMz/aNVosIgl4w+gJwFU17T7aBFz2zkIq Fkp6PyRes2iLDQ8CtuchxWg26IopLAwEgG+pVljCsAhLCLHcOPN8Gh9gC7C5gSUO1G 3nULdrujLcU2HetfqLDZKaq6TbjsgP8s/v65XM2nQTlWtgMd/hzZUpWikoEphFFuc6 mr5aOglHV48Lw== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id CE80A690CB; Tue, 6 Jan 2026 15:05:47 -0700 (MST) From: Simon Glass To: U-Boot Concept Date: Tue, 6 Jan 2026 15:03:38 -0700 Message-ID: <20260106220403.2915630-21-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260106220403.2915630-1-sjg@u-boot.org> References: <20260106220403.2915630-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: OCAXOF5PYSVTY45RYUTUKI7ORMGDOHKU X-Message-ID-Hash: OCAXOF5PYSVTY45RYUTUKI7ORMGDOHKU X-MailFrom: sjg@u-boot.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Simon Glass , Claude X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 20/29] buildman: Split out environment and config display List-Id: Discussion and patches related to U-Boot Concept Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Simon Glass Extract the environment and config display logic from print_result_summary() into separate methods: - _show_environment_changes(): Display environment variable changes - _show_config_changes(): Display configuration changes Co-developed-by: Claude Signed-off-by: Simon Glass --- tools/buildman/builder.py | 274 +++++++++++++++++++++----------------- 1 file changed, 149 insertions(+), 125 deletions(-) diff --git a/tools/buildman/builder.py b/tools/buildman/builder.py index 011cd326926..a632a6a6ade 100644 --- a/tools/buildman/builder.py +++ b/tools/buildman/builder.py @@ -1493,6 +1493,152 @@ class Builder: col = self.col.YELLOW tprint(' ' + line, newline=True, colour=col) + def _show_environment_changes(self, board_selected, board_dict, + environment): + """Show changes in environment variables + + Args: + board_selected (dict): Dict containing boards to summarise, keyed + by board.target + board_dict (dict): Dict containing boards for which we built this + commit, keyed by board.target. The value is an Outcome object. + environment (dict): Dict of environment changes, keyed by + board.target + """ + lines = [] + for target in board_dict: + if target not in board_selected: + continue + + tbase = self._base_environment[target] + tenvironment = environment[target] + environment_plus = {} + environment_minus = {} + environment_change = {} + base = tbase.environment + for key, value in tenvironment.environment.items(): + if key not in base: + environment_plus[key] = value + for key, value in base.items(): + if key not in tenvironment.environment: + environment_minus[key] = value + for key, value in base.items(): + new_value = tenvironment.environment.get(key) + if new_value and value != new_value: + desc = f'{value} -> {new_value}' + environment_change[key] = desc + + self._add_config(lines, target, environment_plus, + environment_minus, environment_change) + self._output_config_info(lines) + + def _show_config_changes(self, board_selected, board_dict, config): + """Show changes in configuration + + Args: + board_selected (dict): Dict containing boards to summarise, keyed + by board.target + board_dict (dict): Dict containing boards for which we built this + commit, keyed by board.target. The value is an Outcome object. + config (dict): Dict of config changes, keyed by board.target + """ + summary = {} + arch_config_plus = {} + arch_config_minus = {} + arch_config_change = {} + arch_list = [] + + for target in board_dict: + if target not in board_selected: + continue + arch = board_selected[target].arch + if arch not in arch_list: + arch_list.append(arch) + + for arch in arch_list: + arch_config_plus[arch] = {} + arch_config_minus[arch] = {} + arch_config_change[arch] = {} + for name in self.config_filenames: + arch_config_plus[arch][name] = {} + arch_config_minus[arch][name] = {} + arch_config_change[arch][name] = {} + + for target in board_dict: + if target not in board_selected: + continue + + arch = board_selected[target].arch + + all_config_plus = {} + all_config_minus = {} + all_config_change = {} + tbase = self._base_config[target] + tconfig = config[target] + lines = [] + for name in self.config_filenames: + if not tconfig.config[name]: + continue + config_plus = {} + config_minus = {} + config_change = {} + base = tbase.config[name] + 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.items(): + if key not in tconfig.config[name]: + config_minus[key] = value + all_config_minus[key] = value + for key, value in base.items(): + new_value = tconfig.config.get(key) + if new_value and value != new_value: + desc = f'{value} -> {new_value}' + config_change[key] = desc + all_config_change[key] = desc + + arch_config_plus[arch][name].update(config_plus) + arch_config_minus[arch][name].update(config_minus) + arch_config_change[arch][name].update(config_change) + + self._add_config(lines, name, config_plus, config_minus, + config_change) + self._add_config(lines, 'all', all_config_plus, + all_config_minus, all_config_change) + summary[target] = '\n'.join(lines) + + lines_by_target = {} + for target, lines in summary.items(): + if lines in lines_by_target: + lines_by_target[lines].append(target) + else: + lines_by_target[lines] = [target] + + for arch in arch_list: + lines = [] + all_plus = {} + all_minus = {} + all_change = {} + for name in self.config_filenames: + all_plus.update(arch_config_plus[arch][name]) + all_minus.update(arch_config_minus[arch][name]) + all_change.update(arch_config_change[arch][name]) + self._add_config(lines, name, + arch_config_plus[arch][name], + arch_config_minus[arch][name], + arch_config_change[arch][name]) + self._add_config(lines, 'all', all_plus, all_minus, all_change) + if lines: + tprint(f'{arch}:') + self._output_config_info(lines) + + for lines, targets in lines_by_target.items(): + if not lines: + continue + tprint(f"{' '.join(sorted(targets))} :") + self._output_config_info(lines.split('\n')) + def print_result_summary(self, board_selected, board_dict, err_lines, err_line_boards, warn_lines, warn_line_boards, config, environment, show_sizes, show_detail, @@ -1657,133 +1803,11 @@ class Builder: show_bloat) if show_environment and self._base_environment: - lines = [] - - for target in board_dict: - if target not in board_selected: - continue - - tbase = self._base_environment[target] - tenvironment = environment[target] - environment_plus = {} - environment_minus = {} - environment_change = {} - base = tbase.environment - for key, value in tenvironment.environment.items(): - if key not in base: - environment_plus[key] = value - for key, value in base.items(): - if key not in tenvironment.environment: - environment_minus[key] = value - for key, value in base.items(): - new_value = tenvironment.environment.get(key) - if new_value and value != new_value: - desc = f'{value} -> {new_value}' - environment_change[key] = desc - - self._add_config(lines, target, environment_plus, - environment_minus, environment_change) - - self._output_config_info(lines) + self._show_environment_changes(board_selected, board_dict, + environment) if show_config and self._base_config: - summary = {} - arch_config_plus = {} - arch_config_minus = {} - arch_config_change = {} - arch_list = [] - - for target in board_dict: - if target not in board_selected: - continue - arch = board_selected[target].arch - if arch not in arch_list: - arch_list.append(arch) - - for arch in arch_list: - arch_config_plus[arch] = {} - arch_config_minus[arch] = {} - arch_config_change[arch] = {} - for name in self.config_filenames: - arch_config_plus[arch][name] = {} - arch_config_minus[arch][name] = {} - arch_config_change[arch][name] = {} - - for target in board_dict: - if target not in board_selected: - continue - - arch = board_selected[target].arch - - all_config_plus = {} - all_config_minus = {} - all_config_change = {} - tbase = self._base_config[target] - tconfig = config[target] - lines = [] - for name in self.config_filenames: - if not tconfig.config[name]: - continue - config_plus = {} - config_minus = {} - config_change = {} - base = tbase.config[name] - 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.items(): - if key not in tconfig.config[name]: - config_minus[key] = value - all_config_minus[key] = value - for key, value in base.items(): - new_value = tconfig.config.get(key) - if new_value and value != new_value: - desc = f'{value} -> {new_value}' - config_change[key] = desc - all_config_change[key] = desc - - arch_config_plus[arch][name].update(config_plus) - arch_config_minus[arch][name].update(config_minus) - arch_config_change[arch][name].update(config_change) - - self._add_config(lines, name, config_plus, config_minus, - config_change) - self._add_config(lines, 'all', all_config_plus, - all_config_minus, all_config_change) - summary[target] = '\n'.join(lines) - - lines_by_target = {} - for target, lines in summary.items(): - if lines in lines_by_target: - lines_by_target[lines].append(target) - else: - lines_by_target[lines] = [target] - - for arch in arch_list: - lines = [] - all_plus = {} - all_minus = {} - all_change = {} - for name in self.config_filenames: - all_plus.update(arch_config_plus[arch][name]) - all_minus.update(arch_config_minus[arch][name]) - all_change.update(arch_config_change[arch][name]) - self._add_config(lines, name, - arch_config_plus[arch][name], - arch_config_minus[arch][name], - arch_config_change[arch][name]) - self._add_config(lines, 'all', all_plus, all_minus, all_change) - #arch_summary[target] = '\n'.join(lines) - if lines: - tprint(f'{arch}:') - self._output_config_info(lines) - - for lines, targets in lines_by_target.items(): - if not lines: - continue - tprint(f"{' '.join(sorted(targets))} :") - self._output_config_info(lines.split('\n')) + self._show_config_changes(board_selected, board_dict, config) # Save our updated information for the next call to this function