From 694b374cc9cc93036f1ce6ae023d1f09fc345137 Mon Sep 17 00:00:00 2001 From: Daniel Garcia Moreno Date: Thu, 4 Sep 2025 11:59:50 +0200 Subject: [PATCH 01/10] Support LLVM_VERSION configuration via env This patch makes possible to override the llvm version used during build using "LLVM_VERSION" and "EXTERNALS_LLVM_TAG" environment variables. This is useful to test the build with other LLVM versions without changing the sources, for example to build with llvm-20. --- .../Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst | 2 ++ Tools/jit/_llvm.py | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst diff --git a/Misc/NEWS.d/next/Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst b/Misc/NEWS.d/next/Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst new file mode 100644 index 00000000000000..10066ffb747e75 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst @@ -0,0 +1,2 @@ +LLVM version can be modified during build with environment variables +"LLVM_VERSION" and "EXTERNALS_LLVM_TAG". diff --git a/Tools/jit/_llvm.py b/Tools/jit/_llvm.py index f09a8404871b24..aa05e3fbde7f34 100644 --- a/Tools/jit/_llvm.py +++ b/Tools/jit/_llvm.py @@ -10,9 +10,12 @@ import _targets -_LLVM_VERSION = 19 +_LLVM_VERSION_DEFAULT = "19" +_EXTERNALS_LLVM_TAG_DEFAULT = "llvm-19.1.7.0" + +_LLVM_VERSION = os.getenv("LLVM_VERSION", _LLVM_VERSION_DEFAULT) _LLVM_VERSION_PATTERN = re.compile(rf"version\s+{_LLVM_VERSION}\.\d+\.\d+\S*\s+") -_EXTERNALS_LLVM_TAG = "llvm-19.1.7.0" +_EXTERNALS_LLVM_TAG = os.getenv("EXTERNALS_LLVM_TAG", _EXTERNALS_LLVM_TAG_DEFAULT) _P = typing.ParamSpec("_P") _R = typing.TypeVar("_R") From 38626958dab634b0b0d650dc3db14792202413d7 Mon Sep 17 00:00:00 2001 From: Daniel Garcia Moreno Date: Tue, 9 Sep 2025 08:54:00 +0200 Subject: [PATCH 02/10] Move LLVM_VERSION env var detection to configure The LLVM_VERSION env variable is passed at configure time to the Tools/jit/build.py script as --llvm-version parameter. --- ...-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst | 4 +- Tools/jit/_llvm.py | 52 +++++++++++-------- Tools/jit/_targets.py | 17 ++++-- Tools/jit/build.py | 2 + configure | 2 +- configure.ac | 2 +- 6 files changed, 50 insertions(+), 29 deletions(-) diff --git a/Misc/NEWS.d/next/Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst b/Misc/NEWS.d/next/Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst index 10066ffb747e75..c408cd149e1df3 100644 --- a/Misc/NEWS.d/next/Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst +++ b/Misc/NEWS.d/next/Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst @@ -1,2 +1,2 @@ -LLVM version can be modified during build with environment variables -"LLVM_VERSION" and "EXTERNALS_LLVM_TAG". +LLVM version can be modified during build with environment variable +"LLVM_VERSION". diff --git a/Tools/jit/_llvm.py b/Tools/jit/_llvm.py index aa05e3fbde7f34..c4bb6f7446d052 100644 --- a/Tools/jit/_llvm.py +++ b/Tools/jit/_llvm.py @@ -10,12 +10,9 @@ import _targets -_LLVM_VERSION_DEFAULT = "19" -_EXTERNALS_LLVM_TAG_DEFAULT = "llvm-19.1.7.0" -_LLVM_VERSION = os.getenv("LLVM_VERSION", _LLVM_VERSION_DEFAULT) -_LLVM_VERSION_PATTERN = re.compile(rf"version\s+{_LLVM_VERSION}\.\d+\.\d+\S*\s+") -_EXTERNALS_LLVM_TAG = os.getenv("EXTERNALS_LLVM_TAG", _EXTERNALS_LLVM_TAG_DEFAULT) +_LLVM_VERSION = "19" +_EXTERNALS_LLVM_TAG = "llvm-19.1.7.0" _P = typing.ParamSpec("_P") _R = typing.TypeVar("_R") @@ -59,53 +56,66 @@ async def _run(tool: str, args: typing.Iterable[str], echo: bool = False) -> str @_async_cache -async def _check_tool_version(name: str, *, echo: bool = False) -> bool: +async def _check_tool_version( + name: str, llvm_version: str, *, echo: bool = False +) -> bool: output = await _run(name, ["--version"], echo=echo) - return bool(output and _LLVM_VERSION_PATTERN.search(output)) + _llvm_version_pattern = re.compile(rf"version\s+{llvm_version}\.\d+\.\d+\S*\s+") + return bool(output and _llvm_version_pattern.search(output)) @_async_cache -async def _get_brew_llvm_prefix(*, echo: bool = False) -> str | None: - output = await _run("brew", ["--prefix", f"llvm@{_LLVM_VERSION}"], echo=echo) +async def _get_brew_llvm_prefix(llvm_version: str, *, echo: bool = False) -> str | None: + output = await _run("brew", ["--prefix", f"llvm@{llvm_version}"], echo=echo) return output and output.removesuffix("\n") @_async_cache -async def _find_tool(tool: str, *, echo: bool = False) -> str | None: +async def _find_tool(tool: str, llvm_version: str, *, echo: bool = False) -> str | None: # Unversioned executables: path = tool - if await _check_tool_version(path, echo=echo): + if await _check_tool_version(path, llvm_version, echo=echo): return path # Versioned executables: - path = f"{tool}-{_LLVM_VERSION}" - if await _check_tool_version(path, echo=echo): + path = f"{tool}-{llvm_version}" + if await _check_tool_version(path, llvm_version, echo=echo): return path # PCbuild externals: externals = os.environ.get("EXTERNALS_DIR", _targets.EXTERNALS) path = os.path.join(externals, _EXTERNALS_LLVM_TAG, "bin", tool) - if await _check_tool_version(path, echo=echo): + if await _check_tool_version(path, llvm_version, echo=echo): return path # Homebrew-installed executables: - prefix = await _get_brew_llvm_prefix(echo=echo) + prefix = await _get_brew_llvm_prefix(llvm_version, echo=echo) if prefix is not None: path = os.path.join(prefix, "bin", tool) - if await _check_tool_version(path, echo=echo): + if await _check_tool_version(path, llvm_version, echo=echo): return path # Nothing found: return None async def maybe_run( - tool: str, args: typing.Iterable[str], echo: bool = False + tool: str, args: typing.Iterable[str], echo: bool = False, llvm_version: str = "" ) -> str | None: """Run an LLVM tool if it can be found. Otherwise, return None.""" - path = await _find_tool(tool, echo=echo) + + if not llvm_version: + llvm_version = _LLVM_VERSION + + path = await _find_tool(tool, llvm_version, echo=echo) return path and await _run(path, args, echo=echo) -async def run(tool: str, args: typing.Iterable[str], echo: bool = False) -> str: +async def run( + tool: str, args: typing.Iterable[str], echo: bool = False, llvm_version: str = "" +) -> str: """Run an LLVM tool if it can be found. Otherwise, raise RuntimeError.""" - output = await maybe_run(tool, args, echo=echo) + + if not llvm_version: + llvm_version = _LLVM_VERSION + + output = await maybe_run(tool, args, echo=echo, llvm_version=llvm_version) if output is None: - raise RuntimeError(f"Can't find {tool}-{_LLVM_VERSION}!") + raise RuntimeError(f"Can't find {tool}-{llvm_version}!") return output diff --git a/Tools/jit/_targets.py b/Tools/jit/_targets.py index 2f3969e7d0540c..5e4ef9003d77e8 100644 --- a/Tools/jit/_targets.py +++ b/Tools/jit/_targets.py @@ -50,6 +50,7 @@ class _Target(typing.Generic[_S, _R]): debug: bool = False verbose: bool = False cflags: str = "" + llvm_version: str = "" known_symbols: dict[str, int] = dataclasses.field(default_factory=dict) pyconfig_dir: pathlib.Path = pathlib.Path.cwd().resolve() @@ -81,7 +82,9 @@ def _compute_digest(self) -> str: async def _parse(self, path: pathlib.Path) -> _stencils.StencilGroup: group = _stencils.StencilGroup() args = ["--disassemble", "--reloc", f"{path}"] - output = await _llvm.maybe_run("llvm-objdump", args, echo=self.verbose) + output = await _llvm.maybe_run( + "llvm-objdump", args, echo=self.verbose, llvm_version=self.llvm_version + ) if output is not None: # Make sure that full paths don't leak out (for reproducibility): long, short = str(path), str(path.name) @@ -99,7 +102,9 @@ async def _parse(self, path: pathlib.Path) -> _stencils.StencilGroup: "--sections", f"{path}", ] - output = await _llvm.run("llvm-readobj", args, echo=self.verbose) + output = await _llvm.run( + "llvm-readobj", args, echo=self.verbose, llvm_version=self.llvm_version + ) # --elf-output-style=JSON is only *slightly* broken on Mach-O... output = output.replace("PrivateExtern\n", "\n") output = output.replace("Extern\n", "\n") @@ -175,12 +180,16 @@ async def _compile( # Allow user-provided CFLAGS to override any defaults *shlex.split(self.cflags), ] - await _llvm.run("clang", args_s, echo=self.verbose) + await _llvm.run( + "clang", args_s, echo=self.verbose, llvm_version=self.llvm_version + ) self.optimizer( s, label_prefix=self.label_prefix, symbol_prefix=self.symbol_prefix ).run() args_o = [f"--target={self.triple}", "-c", "-o", f"{o}", f"{s}"] - await _llvm.run("clang", args_o, echo=self.verbose) + await _llvm.run( + "clang", args_o, echo=self.verbose, llvm_version=self.llvm_version + ) return await self._parse(o) async def _build_stencils(self) -> dict[str, _stencils.StencilGroup]: diff --git a/Tools/jit/build.py b/Tools/jit/build.py index a0733005929bf2..3e14cecef8f7db 100644 --- a/Tools/jit/build.py +++ b/Tools/jit/build.py @@ -42,12 +42,14 @@ parser.add_argument( "--cflags", help="additional flags to pass to the compiler", default="" ) + parser.add_argument("--llvm-version", help="LLVM version to use") args = parser.parse_args() for target in args.target: target.debug = args.debug target.force = args.force target.verbose = args.verbose target.cflags = args.cflags + target.llvm_version = args.llvm_version target.pyconfig_dir = args.pyconfig_dir target.build( comment=comment, diff --git a/configure b/configure index 0d1f6a29e9b432..d80340e3015bee 100755 --- a/configure +++ b/configure @@ -10875,7 +10875,7 @@ then : else case e in #( e) as_fn_append CFLAGS_NODIST " $jit_flags" - REGEN_JIT_COMMAND="\$(PYTHON_FOR_REGEN) \$(srcdir)/Tools/jit/build.py ${ARCH_TRIPLES:-$host} --output-dir . --pyconfig-dir . --cflags=\"$CFLAGS_JIT\"" + REGEN_JIT_COMMAND="\$(PYTHON_FOR_REGEN) \$(srcdir)/Tools/jit/build.py ${ARCH_TRIPLES:-$host} --output-dir . --pyconfig-dir . --cflags=\"$CFLAGS_JIT\" --llvm-version=\"$LLVM_VERSION\"" if test "x$Py_DEBUG" = xtrue then : as_fn_append REGEN_JIT_COMMAND " --debug" diff --git a/configure.ac b/configure.ac index 7b5da6e0d15682..1e0c0f71b7c281 100644 --- a/configure.ac +++ b/configure.ac @@ -2786,7 +2786,7 @@ AS_VAR_IF([jit_flags], [], [AS_VAR_APPEND([CFLAGS_NODIST], [" $jit_flags"]) AS_VAR_SET([REGEN_JIT_COMMAND], - ["\$(PYTHON_FOR_REGEN) \$(srcdir)/Tools/jit/build.py ${ARCH_TRIPLES:-$host} --output-dir . --pyconfig-dir . --cflags=\"$CFLAGS_JIT\""]) + ["\$(PYTHON_FOR_REGEN) \$(srcdir)/Tools/jit/build.py ${ARCH_TRIPLES:-$host} --output-dir . --pyconfig-dir . --cflags=\"$CFLAGS_JIT\" --llvm-version=\"$LLVM_VERSION\""]) AS_VAR_IF([Py_DEBUG], [true], [AS_VAR_APPEND([REGEN_JIT_COMMAND], [" --debug"])], From 42d1d121818b759ea585e8935cd4e514e55efbf7 Mon Sep 17 00:00:00 2001 From: Daniel Garcia Moreno Date: Tue, 16 Sep 2025 07:20:56 +0200 Subject: [PATCH 03/10] Reword news line with more information about LLVM --- .../next/Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst b/Misc/NEWS.d/next/Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst index c408cd149e1df3..40b163104165aa 100644 --- a/Misc/NEWS.d/next/Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst +++ b/Misc/NEWS.d/next/Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst @@ -1,2 +1,4 @@ LLVM version can be modified during build with environment variable -"LLVM_VERSION". +"LLVM_VERSION". Use this at your own risk, as there is only one +officially supported LLVM version. For more information, please check +Tools/jit/README.md. From 4ce99f37902f38e39df5889316a677c2b8df6e74 Mon Sep 17 00:00:00 2001 From: Daniel Garcia Moreno Date: Tue, 16 Sep 2025 07:36:33 +0200 Subject: [PATCH 04/10] Set _LLVM_VERSION as default value for Target.llvm_version --- Tools/jit/_llvm.py | 16 ++++++++-------- Tools/jit/_targets.py | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Tools/jit/_llvm.py b/Tools/jit/_llvm.py index c4bb6f7446d052..bc3b50ffe61634 100644 --- a/Tools/jit/_llvm.py +++ b/Tools/jit/_llvm.py @@ -96,25 +96,25 @@ async def _find_tool(tool: str, llvm_version: str, *, echo: bool = False) -> str async def maybe_run( - tool: str, args: typing.Iterable[str], echo: bool = False, llvm_version: str = "" + tool: str, + args: typing.Iterable[str], + echo: bool = False, + llvm_version: str = _LLVM_VERSION, ) -> str | None: """Run an LLVM tool if it can be found. Otherwise, return None.""" - if not llvm_version: - llvm_version = _LLVM_VERSION - path = await _find_tool(tool, llvm_version, echo=echo) return path and await _run(path, args, echo=echo) async def run( - tool: str, args: typing.Iterable[str], echo: bool = False, llvm_version: str = "" + tool: str, + args: typing.Iterable[str], + echo: bool = False, + llvm_version: str = _LLVM_VERSION, ) -> str: """Run an LLVM tool if it can be found. Otherwise, raise RuntimeError.""" - if not llvm_version: - llvm_version = _LLVM_VERSION - output = await maybe_run(tool, args, echo=echo, llvm_version=llvm_version) if output is None: raise RuntimeError(f"Can't find {tool}-{llvm_version}!") diff --git a/Tools/jit/_targets.py b/Tools/jit/_targets.py index 5e4ef9003d77e8..347db9b4b06e53 100644 --- a/Tools/jit/_targets.py +++ b/Tools/jit/_targets.py @@ -50,7 +50,7 @@ class _Target(typing.Generic[_S, _R]): debug: bool = False verbose: bool = False cflags: str = "" - llvm_version: str = "" + llvm_version: str = _llvm._LLVM_VERSION known_symbols: dict[str, int] = dataclasses.field(default_factory=dict) pyconfig_dir: pathlib.Path = pathlib.Path.cwd().resolve() From 2a825372b8c8bc713637f930c5e5b9edc1581038 Mon Sep 17 00:00:00 2001 From: Daniel Garcia Moreno Date: Tue, 16 Sep 2025 08:00:16 +0200 Subject: [PATCH 05/10] Do not set target.llvm_version on empty string --- Tools/jit/build.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Tools/jit/build.py b/Tools/jit/build.py index 3e14cecef8f7db..ce7494247051c7 100644 --- a/Tools/jit/build.py +++ b/Tools/jit/build.py @@ -49,7 +49,8 @@ target.force = args.force target.verbose = args.verbose target.cflags = args.cflags - target.llvm_version = args.llvm_version + if args.llvm_version: + target.llvm_version = args.llvm_version target.pyconfig_dir = args.pyconfig_dir target.build( comment=comment, From 6528daecc25db5cffa439b6d8e98eef9aa872fec Mon Sep 17 00:00:00 2001 From: Daniel Garcia Moreno Date: Wed, 17 Sep 2025 08:08:07 +0200 Subject: [PATCH 06/10] Add warning when building with custom LLVM_VERSION --- Tools/jit/_targets.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Tools/jit/_targets.py b/Tools/jit/_targets.py index 347db9b4b06e53..dd082966db021e 100644 --- a/Tools/jit/_targets.py +++ b/Tools/jit/_targets.py @@ -235,6 +235,13 @@ def build( request = "Please report any issues you encounter.".center(len(warning)) outline = "=" * len(warning) print("\n".join(["", outline, warning, request, outline, ""])) + + if self.llvm_version != _llvm._LLVM_VERSION: + warning = f"LLVM version {self.llvm_version} is not officially supported!" + request = "Use custom LLVM version at your own rist.".center(len(warning)) + outline = "=" * len(warning) + print("\n".join(["", outline, warning, request, outline, ""])) + digest = f"// {self._compute_digest()}\n" if ( not force From c45361d7a540001ffac5c736a5d7e14e7d955b28 Mon Sep 17 00:00:00 2001 From: danigm Date: Wed, 17 Sep 2025 12:26:02 +0200 Subject: [PATCH 07/10] Update Misc/NEWS.d/next/Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst Rewording news entry Co-authored-by: Savannah Bailey --- .../Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Misc/NEWS.d/next/Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst b/Misc/NEWS.d/next/Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst index 40b163104165aa..7eb0770996877a 100644 --- a/Misc/NEWS.d/next/Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst +++ b/Misc/NEWS.d/next/Build/2025-09-04-12-16-31.gh-issue-138497.Y_5YXh.rst @@ -1,4 +1,4 @@ -LLVM version can be modified during build with environment variable -"LLVM_VERSION". Use this at your own risk, as there is only one -officially supported LLVM version. For more information, please check -Tools/jit/README.md. +The LLVM version used by the JIT at build time can now be modified using +the ``LLVM_VERSION`` environment variable. Use this at your own risk, as +there is only one officially supported LLVM version. For more information, +please check ``Tools/jit/README.md``. From 10175c78762b7bb7bbe7b32a1c978ef1512e8362 Mon Sep 17 00:00:00 2001 From: Daniel Garcia Moreno Date: Wed, 17 Sep 2025 12:48:11 +0200 Subject: [PATCH 08/10] Move LLVM version warning to experimental banner --- Tools/jit/_targets.py | 9 ++------- Tools/jit/build.py | 2 +- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/Tools/jit/_targets.py b/Tools/jit/_targets.py index dd082966db021e..703206d71d4b4b 100644 --- a/Tools/jit/_targets.py +++ b/Tools/jit/_targets.py @@ -233,15 +233,10 @@ def build( if not self.stable: warning = f"JIT support for {self.triple} is still experimental!" request = "Please report any issues you encounter.".center(len(warning)) + if self.llvm_version != _llvm._LLVM_VERSION: + request = f"Warning! Building with a LLVM version other than {_llvm._LLVM_VERSION} is not supported." outline = "=" * len(warning) print("\n".join(["", outline, warning, request, outline, ""])) - - if self.llvm_version != _llvm._LLVM_VERSION: - warning = f"LLVM version {self.llvm_version} is not officially supported!" - request = "Use custom LLVM version at your own rist.".center(len(warning)) - outline = "=" * len(warning) - print("\n".join(["", outline, warning, request, outline, ""])) - digest = f"// {self._compute_digest()}\n" if ( not force diff --git a/Tools/jit/build.py b/Tools/jit/build.py index ce7494247051c7..127d93b317fb09 100644 --- a/Tools/jit/build.py +++ b/Tools/jit/build.py @@ -49,9 +49,9 @@ target.force = args.force target.verbose = args.verbose target.cflags = args.cflags + target.pyconfig_dir = args.pyconfig_dir if args.llvm_version: target.llvm_version = args.llvm_version - target.pyconfig_dir = args.pyconfig_dir target.build( comment=comment, force=args.force, From a60b02d1a9f01de3923f18dec7c0dcbd26c720e0 Mon Sep 17 00:00:00 2001 From: Daniel Garcia Moreno Date: Wed, 17 Sep 2025 12:51:19 +0200 Subject: [PATCH 09/10] Add LLVM_VERSION env info to Tools/jit/README.md --- Tools/jit/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/jit/README.md b/Tools/jit/README.md index ffc762d3828bfb..35c7ffd7a283f8 100644 --- a/Tools/jit/README.md +++ b/Tools/jit/README.md @@ -9,7 +9,7 @@ Python 3.11 or newer is required to build the JIT. The JIT compiler does not require end users to install any third-party dependencies, but part of it must be *built* using LLVM[^why-llvm]. You are *not* required to build the rest of CPython using LLVM, or even the same version of LLVM (in fact, this is uncommon). -LLVM version 19 is required. Both `clang` and `llvm-readobj` need to be installed and discoverable (version suffixes, like `clang-19`, are okay). It's highly recommended that you also have `llvm-objdump` available, since this allows the build script to dump human-readable assembly for the generated code. +LLVM version 19 is the officially supported version. You can modify if needed using the `LLVM_VERSION` env var during configure. Both `clang` and `llvm-readobj` need to be installed and discoverable (version suffixes, like `clang-19`, are okay). It's highly recommended that you also have `llvm-objdump` available, since this allows the build script to dump human-readable assembly for the generated code. It's easy to install all of the required tools: From 8cea949c30d308a7a5731f7b5582510441cdd76d Mon Sep 17 00:00:00 2001 From: danigm Date: Thu, 2 Oct 2025 10:57:03 +0200 Subject: [PATCH 10/10] Fix warning synxtax in Tools/jit/_targets.py Co-authored-by: Savannah Ostrowski --- Tools/jit/_targets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/jit/_targets.py b/Tools/jit/_targets.py index 703206d71d4b4b..9fc3522d23d982 100644 --- a/Tools/jit/_targets.py +++ b/Tools/jit/_targets.py @@ -234,7 +234,7 @@ def build( warning = f"JIT support for {self.triple} is still experimental!" request = "Please report any issues you encounter.".center(len(warning)) if self.llvm_version != _llvm._LLVM_VERSION: - request = f"Warning! Building with a LLVM version other than {_llvm._LLVM_VERSION} is not supported." + request = f"Warning! Building with an LLVM version other than {_llvm._LLVM_VERSION} is not supported." outline = "=" * len(warning) print("\n".join(["", outline, warning, request, outline, ""])) digest = f"// {self._compute_digest()}\n"