From patchwork Sun Jan 4 20:08: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: 1268 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=1767557378; bh=Jnx+PYSutxe5TLv21xq8gT36yzTvv32ZBjri3IPgLTs=; 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=R94C76LtnrMfbg8Sv3PJ9lklfVbCQ/spONehqjdn5nUjzkBkXxmCTymp1dRWqhRdc rd4SrOelKs4rmArKNnBDe9WnkwMnzkLA4EagCIx0X3WPtMKNVynbdBsgKcmo6Ak2ii w8pPx83xiy8kbx0UqOwU+jhMqNK4wpvDhv/AVXyjDPjgqgSdZriTz+aOZdIRbbysri tA0QqWxAPTdJWd4nTAZg7Y313fAorAcFf2To2fymFCmnX6I8ykTBYCV5UEkRVO0aGx TBSdYFdZajliLBRaoJ+iC/ssCfZil574UzPAnXTKfMWiaut9seOvM7jMJSHX+xQ6ya gqWWpHWPgOgeA== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 8726669003 for ; Sun, 4 Jan 2026 13:09:38 -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 6jenHkQ9T1Pp for ; Sun, 4 Jan 2026 13:09:38 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767557378; bh=Jnx+PYSutxe5TLv21xq8gT36yzTvv32ZBjri3IPgLTs=; 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=R94C76LtnrMfbg8Sv3PJ9lklfVbCQ/spONehqjdn5nUjzkBkXxmCTymp1dRWqhRdc rd4SrOelKs4rmArKNnBDe9WnkwMnzkLA4EagCIx0X3WPtMKNVynbdBsgKcmo6Ak2ii w8pPx83xiy8kbx0UqOwU+jhMqNK4wpvDhv/AVXyjDPjgqgSdZriTz+aOZdIRbbysri tA0QqWxAPTdJWd4nTAZg7Y313fAorAcFf2To2fymFCmnX6I8ykTBYCV5UEkRVO0aGx TBSdYFdZajliLBRaoJ+iC/ssCfZil574UzPAnXTKfMWiaut9seOvM7jMJSHX+xQ6ya gqWWpHWPgOgeA== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 7490B690BD for ; Sun, 4 Jan 2026 13:09:38 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767557376; bh=DjBZaNlL5x4d7R5lRkqip93P1zWNkFmZgNITh5mzyHc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=H3HCtENiyyHxdxkJdJxzTXGgMZ4/SGJ62a+WAUKI0BXzOAKHELSpivHZ02lTGosYz ZW0nsllS4kJaYRDNldKlvfCFsKPRZx9EP1TjlxNvPqEuD5VdL1e/pEaik/ERv4MnCZ n2kPHw5Hk/X1pJfHx6kU2jVJpPenkl521hOsWEt+z1FwBVPBHpccua1gjkWqDBOUwf 2LiYYv88azJvGXdwIUPlfezJINUk9kLl/fLE2z6Tet2bxWjo+i7f21D4i8M2FNliuN j3uaJ3jVCFEUXutr8vqM7fXU7czm2oeMcwK8MuTPzAinDtVAyJvwEVqqr82s7itqT0 /oSVmfJEfRJKA== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 7366B69003; Sun, 4 Jan 2026 13:09:36 -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 O_JEU1TZQDdG; Sun, 4 Jan 2026 13:09:36 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1767557372; bh=4ufJ7mWgvDr2TqwGHtp8C52cyYIv53SFIb373uYIO7Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Da8D98lAP1IaTurBLpHtGi4rLx/qMm8mmeIZ2A4CcmXhJI96Buft4uOYpNP4m0l43 7wERWxqr3CZZEbFIHYK9tIBTVUtpcmWG5HJ1pmoAQQanl7uGGBv0H7dkbUcTr1/ev0 N6Xkm0fYGLVkpYOpVArky7k3cAHP2+k6GFZOKpjgAphiLjTHds9jBiQ7bkoJj9v1bX X/uvyeDFcQPeY4egr2NPxpHz8+mn3bD9w+X6rERZe3c9cEClaxlQjQEoc98uRUJiRw rI90zZW5fntoWLso2RwpVWJ2rh7dArfzrWvIWloE/xFHymLSHjca8YcwkZ1LiVtEV1 W59gBzun4UHAA== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id EA59A68FD8; Sun, 4 Jan 2026 13:09:31 -0700 (MST) From: Simon Glass To: U-Boot Concept Date: Sun, 4 Jan 2026 13:08:38 -0700 Message-ID: <20260104200844.481633-10-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260104200844.481633-1-sjg@u-boot.org> References: <20260104200844.481633-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: AJHB3BQ62CLTVDYKUKXPVS5DL5BGRV6X X-Message-ID-Hash: AJHB3BQ62CLTVDYKUKXPVS5DL5BGRV6X 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: Heinrich Schuchardt , Simon Glass , "Claude Opus 4 . 5" X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 09/11] buildman: Use f-strings in toolchain.py 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 Replace all string formatting with f-strings for better readability and consistency with modern Python style. Co-developed-by: Claude Opus 4.5 Signed-off-by: Simon Glass --- tools/buildman/toolchain.py | 69 +++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/tools/buildman/toolchain.py b/tools/buildman/toolchain.py index 7ccb56a74aa..90f56813300 100644 --- a/tools/buildman/toolchain.py +++ b/tools/buildman/toolchain.py @@ -43,7 +43,7 @@ class MyHTMLParser(HTMLParser): HTMLParser.__init__(self) self.arch_link = None self.links = [] - self._re_arch = re.compile('[-_]%s-' % arch) + self._re_arch = re.compile(f'[-_]{arch}-') def handle_starttag(self, tag, attrs): """Handle a start tag in the HTML being parsed""" @@ -120,8 +120,7 @@ class Toolchain: if verbose: print('Tool chain test: ', end=' ') if self.ok: - print("OK, arch='%s', priority %d" % (self.arch, - self.priority)) + print(f"OK, arch='{self.arch}', priority {self.priority}") else: print('BAD') print(f"Command: {' '.join(cmd)}") @@ -188,7 +187,7 @@ class Toolchain: return ' '.join(args) return '' else: - raise ValueError('Unknown arg to GetEnvArgs (%d)' % which) + raise ValueError(f'Unknown arg to GetEnvArgs ({which})') def make_environment(self, full_path, env=None): """Returns an environment for using the toolchain. @@ -266,8 +265,8 @@ class Toolchain: List of arguments to pass to 'make' """ if self.override_toolchain: - return ['HOSTCC=%s' % self.override_toolchain, - 'CC=%s' % self.override_toolchain] + return [f'HOSTCC={self.override_toolchain}', + f'CC={self.override_toolchain}'] return [] @@ -306,11 +305,10 @@ class Toolchains: """ toolchains = bsettings.get_items('toolchain') if show_warning and not toolchains: - print(("Warning: No tool chains. Please run 'buildman " - "--fetch-arch all' to download all available toolchains, or " - "add a [toolchain] section to your buildman config file " - "%s. See buildman.rst for details" % - bsettings.config_fname)) + print(f"Warning: No tool chains. Please run 'buildman " + f"--fetch-arch all' to download all available toolchains, or " + f"add a [toolchain] section to your buildman config file " + f"{bsettings.config_fname}. See buildman.rst for details") paths = [] for name, value in toolchains: @@ -355,10 +353,10 @@ class Toolchains: if add_it: self.toolchains[toolchain.arch] = toolchain elif verbose: - print(("Toolchain '%s' at priority %d will be ignored because " - "another toolchain for arch '%s' has priority %d" % - (toolchain.gcc, toolchain.priority, toolchain.arch, - self.toolchains[toolchain.arch].priority))) + print(f"Toolchain '{toolchain.gcc}' at priority " + f"{toolchain.priority} will be ignored because another " + f"toolchain for arch '{toolchain.arch}' has priority " + f"{self.toolchains[toolchain.arch].priority}") def scan_path(self, path, verbose): """Scan a path for a valid toolchain @@ -373,9 +371,9 @@ class Toolchains: fnames = [] for subdir in ['.', 'bin', 'usr/bin']: dirname = os.path.join(path, subdir) - if verbose: print(" - looking in '%s'" % dirname) + if verbose: print(f" - looking in '{dirname}'") for fname in glob.glob(dirname + '/*gcc'): - if verbose: print(" - found '%s'" % fname) + if verbose: print(f" - found '{fname}'") fnames.append(fname) return fnames @@ -411,7 +409,8 @@ class Toolchains: if verbose: print('Scanning for tool chains') for name, value in self.prefixes: fname = os.path.expanduser(value) - if verbose: print(" - scanning prefix '%s'" % fname) + if verbose: + print(f" - scanning prefix '{fname}'") if os.path.exists(fname): self.add(fname, True, verbose, PRIORITY_FULL_PREFIX, name) continue @@ -429,7 +428,7 @@ class Toolchains: else: print(f'Error: {msg}') for path in self.paths: - if verbose: print(" - scanning path '%s'" % path) + if verbose: print(f" - scanning path '{path}'") fnames = self.scan_path(path, verbose) for fname in fnames: self.add(fname, True, verbose) @@ -437,11 +436,12 @@ class Toolchains: def list(self): """List out the selected toolchains for each architecture""" col = terminal.Color() - print(col.build(col.BLUE, 'List of available toolchains (%d):' % - len(self.toolchains))) + print(col.build( + col.BLUE, + f'List of available toolchains ({len(self.toolchains)}):')) if len(self.toolchains): for key, value in sorted(self.toolchains.items()): - print('%-10s: %s' % (key, value.gcc)) + print(f'{key:10}: {value.gcc}') else: print('None') @@ -461,7 +461,7 @@ class Toolchains: return self.toolchains[alias] if not arch in self.toolchains: - raise ValueError("No tool chain found for arch '%s'" % arch) + raise ValueError(f"No tool chain found for arch '{arch}'") return self.toolchains[arch] def resolve_references(self, var_dict, args): @@ -558,8 +558,8 @@ class Toolchains: versions = ['14.2.0', '13.2.0'] links = [] for version in versions: - url = '%s/%s/%s/' % (base, arch, version) - print('Checking: %s' % url) + url = f'{base}/{arch}/{version}/' + print(f'Checking: {url}') response = urllib.request.urlopen(url) html = tools.to_string(response.read()) parser = MyHTMLParser(fetch_arch) @@ -617,11 +617,11 @@ class Toolchains: """ # Fist get the URL for this architecture col = terminal.Color() - print(col.build(col.BLUE, "Downloading toolchain for arch '%s'" % arch)) + print(col.build(col.BLUE, f"Downloading toolchain for arch '{arch}'")) url = self.locate_arch_url(arch) if not url: - print(("Cannot find toolchain for arch '%s' - use 'list' to list" % - arch)) + print(f"Cannot find toolchain for arch '{arch}' - " + "use 'list' to list") return 2 home = os.environ['HOME'] dest = os.path.join(home, '.buildman-toolchains') @@ -632,7 +632,7 @@ class Toolchains: tarfile, tmpdir = tools.download(url, '.buildman') if not tarfile: return 1 - print(col.build(col.GREEN, 'Unpacking to: %s' % dest), end=' ') + print(col.build(col.GREEN, f'Unpacking to: {dest}'), end=' ') sys.stdout.flush() path = self.unpack(tarfile, dest) os.remove(tarfile) @@ -647,13 +647,14 @@ class Toolchains: print('Could not locate C compiler - fetch failed.') return 1 if len(compiler_fname_list) != 1: - print(col.build(col.RED, 'Warning, ambiguous toolchains: %s' % - ', '.join(compiler_fname_list))) + print(col.build(col.RED, + f"Warning, ambiguous toolchains: " + f"{', '.join(compiler_fname_list)}")) toolchain = Toolchain(compiler_fname_list[0], True, True) # Make sure that it will be found by buildman if not self.test_settings_has_path(dirpath): - print(("Adding 'download' to config file '%s'" % - bsettings.config_fname)) - bsettings.set_item('toolchain', 'download', '%s/*/*' % dest) + print(f"Adding 'download' to config file " + f"'{bsettings.config_fname}'") + bsettings.set_item('toolchain', 'download', f'{dest}/*/*') return 0