diff --git a/Doc/c-api/buffer.rst b/Doc/c-api/buffer.rst
index fe950196297a24..dc3e0f37c36c5b 100644
--- a/Doc/c-api/buffer.rst
+++ b/Doc/c-api/buffer.rst
@@ -258,7 +258,9 @@ readonly, format
.. c:macro:: PyBUF_WRITEABLE
- This is a :term:`soft deprecated` alias to :c:macro:`PyBUF_WRITABLE`.
+ This is an alias to :c:macro:`PyBUF_WRITABLE`.
+
+ .. soft-deprecated:: 3.13
.. c:macro:: PyBUF_FORMAT
diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst
index be2c85ec97489e..57b77f92a7d2e6 100644
--- a/Doc/c-api/code.rst
+++ b/Doc/c-api/code.rst
@@ -212,7 +212,7 @@ bound into a function.
.. c:function:: PyObject *PyCode_Optimize(PyObject *code, PyObject *consts, PyObject *names, PyObject *lnotab_obj)
- This is a :term:`soft deprecated` function that does nothing.
+ This is a function that does nothing.
Prior to Python 3.10, this function would perform basic optimizations to a
code object.
@@ -220,6 +220,8 @@ bound into a function.
.. versionchanged:: 3.10
This function now does nothing.
+ .. soft-deprecated:: 3.13
+
.. _c_codeobject_flags:
diff --git a/Doc/c-api/descriptor.rst b/Doc/c-api/descriptor.rst
index b913e24b3c7cc8..539c4610ce4f5b 100644
--- a/Doc/c-api/descriptor.rst
+++ b/Doc/c-api/descriptor.rst
@@ -140,7 +140,7 @@ found in the dictionary of type objects.
.. c:macro:: PyDescr_COMMON
- This is a :term:`soft deprecated` macro including the common fields for a
+ This is a macro including the common fields for a
descriptor object.
This was included in Python's C API by mistake; do not use it in extensions.
@@ -148,6 +148,8 @@ found in the dictionary of type objects.
descriptor protocol (:c:member:`~PyTypeObject.tp_descr_get` and
:c:member:`~PyTypeObject.tp_descr_set`).
+ .. soft-deprecated:: 3.15
+
Built-in descriptors
^^^^^^^^^^^^^^^^^^^^
diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst
index 8ecd7c62517104..7a07818b7b4d1a 100644
--- a/Doc/c-api/exceptions.rst
+++ b/Doc/c-api/exceptions.rst
@@ -818,7 +818,7 @@ Exception Classes
.. c:macro:: PyException_HEAD
- This is a :term:`soft deprecated` macro including the base fields for an
+ This is a macro including the base fields for an
exception object.
This was included in Python's C API by mistake and is not designed for use
@@ -826,6 +826,8 @@ Exception Classes
:c:func:`PyErr_NewException` or otherwise create a class inheriting from
:c:data:`PyExc_BaseException`.
+ .. soft-deprecated:: 3.15
+
Exception Objects
=================
diff --git a/Doc/c-api/gen.rst b/Doc/c-api/gen.rst
index 74db49a6814800..ed121726b89620 100644
--- a/Doc/c-api/gen.rst
+++ b/Doc/c-api/gen.rst
@@ -90,7 +90,9 @@ Deprecated API
.. c:macro:: PyAsyncGenASend_CheckExact(op)
- This is a :term:`soft deprecated` API that was included in Python's C API
+ This is an API that was included in Python's C API
by mistake.
It is solely here for completeness; do not use this API.
+
+ .. soft-deprecated:: 3.14
diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst
index 0e6fd3421f2b3e..500f2818e2e40a 100644
--- a/Doc/c-api/intro.rst
+++ b/Doc/c-api/intro.rst
@@ -587,10 +587,10 @@ have been standardized in C11 (or previous standards).
.. c:macro:: Py_MEMCPY(dest, src, n)
- This is a :term:`soft deprecated` alias to :c:func:`!memcpy`.
- Use :c:func:`!memcpy` directly instead.
+ This is an alias to :c:func:`!memcpy`.
.. soft-deprecated:: 3.14
+ Use :c:func:`!memcpy` directly instead.
.. c:macro:: Py_UNICODE_SIZE
@@ -611,8 +611,7 @@ have been standardized in C11 (or previous standards).
.. c:macro:: Py_VA_COPY
- This is a :term:`soft deprecated` alias to the C99-standard ``va_copy``
- function.
+ This is an alias to the C99-standard ``va_copy`` function.
Historically, this would use a compiler-specific method to copy a ``va_list``.
diff --git a/Doc/c-api/set.rst b/Doc/c-api/set.rst
index 53febd0c4c116c..db537aff2e6ce5 100644
--- a/Doc/c-api/set.rst
+++ b/Doc/c-api/set.rst
@@ -201,7 +201,7 @@ Deprecated API
.. c:macro:: PySet_MINSIZE
- A :term:`soft deprecated` constant representing the size of an internal
+ A constant representing the size of an internal
preallocated table inside :c:type:`PySetObject` instances.
This is documented solely for completeness, as there are no guarantees
@@ -211,3 +211,5 @@ Deprecated API
:c:macro:`!PySet_MINSIZE` can be replaced with a small constant like ``8``.
If looking for the size of a set, use :c:func:`PySet_Size` instead.
+
+ .. soft-deprecated:: 3.14
diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst
index c3960d6ff87ec8..d3d8239365f9bf 100644
--- a/Doc/c-api/typeobj.rst
+++ b/Doc/c-api/typeobj.rst
@@ -1391,8 +1391,8 @@ and :c:data:`PyType_Type` effectively act as defaults.)
.. versionchanged:: 3.9
- Renamed to the current name, without the leading underscore.
- The old provisional name is :term:`soft deprecated`.
+ Renamed to the current name, without the leading underscore.
+ The old provisional name is :term:`soft deprecated`.
.. versionchanged:: 3.12
@@ -1501,11 +1501,13 @@ and :c:data:`PyType_Type` effectively act as defaults.)
.. c:macro:: Py_TPFLAGS_HAVE_VERSION_TAG
- This is a :term:`soft deprecated` macro that does nothing.
+ This macro does nothing.
Historically, this would indicate that the
:c:member:`~PyTypeObject.tp_version_tag` field was available and
initialized.
+ .. soft-deprecated:: 3.13
+
.. c:macro:: Py_TPFLAGS_INLINE_VALUES
diff --git a/Doc/library/calendar.rst b/Doc/library/calendar.rst
index 54cafaf4fe47d8..2ddef79eab0bfb 100644
--- a/Doc/library/calendar.rst
+++ b/Doc/library/calendar.rst
@@ -54,13 +54,13 @@ interpreted as prescribed by the ISO 8601 standard. Year 0 is 1 BC, year -1 is
.. method:: setfirstweekday(firstweekday)
- Set the first weekday to *firstweekday*, passed as an :class:`int` (0--6)
+ Set the first weekday to *firstweekday*, passed as an :class:`int` (0--6).
Identical to setting the :attr:`~Calendar.firstweekday` property.
.. method:: iterweekdays()
- Return an iterator for the week day numbers that will be used for one
+ Return an iterator for the weekday numbers that will be used for one
week. The first value from the iterator will be the same as the value of
the :attr:`~Calendar.firstweekday` property.
@@ -86,7 +86,7 @@ interpreted as prescribed by the ISO 8601 standard. Year 0 is 1 BC, year -1 is
Return an iterator for the month *month* in the year *year* similar to
:meth:`itermonthdates`, but not restricted by the :class:`datetime.date`
range. Days returned will be tuples consisting of a day of the month
- number and a week day number.
+ number and a weekday number.
.. method:: itermonthdays3(year, month)
@@ -408,7 +408,7 @@ For simple text calendars this module provides the following functions.
.. function:: monthrange(year, month)
- Returns weekday of first day of the month and number of days in month, for the
+ Returns weekday of first day of the month and number of days in month, for the
specified *year* and *month*.
@@ -446,7 +446,7 @@ For simple text calendars this module provides the following functions.
An unrelated but handy function that takes a time tuple such as returned by
the :func:`~time.gmtime` function in the :mod:`time` module, and returns the
corresponding Unix timestamp value, assuming an epoch of 1970, and the POSIX
- encoding. In fact, :func:`time.gmtime` and :func:`timegm` are each others'
+ encoding. In fact, :func:`time.gmtime` and :func:`timegm` are each other's
inverse.
diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst
index ff09bb8d884ab6..e71d1d06d49b96 100644
--- a/Doc/library/ctypes.rst
+++ b/Doc/library/ctypes.rst
@@ -3190,8 +3190,8 @@ Arrays and pointers
Equivalent to ``type * length``, where *type* is a
:mod:`!ctypes` data type and *length* an integer.
- This function is :term:`soft deprecated` in favor of multiplication.
- There are no plans to remove it.
+ .. soft-deprecated:: 3.14
+ In favor of multiplication.
.. class:: _Pointer
diff --git a/Doc/library/mimetypes.rst b/Doc/library/mimetypes.rst
index af9098c4970805..0facacd50fd389 100644
--- a/Doc/library/mimetypes.rst
+++ b/Doc/library/mimetypes.rst
@@ -55,7 +55,7 @@ the information :func:`init` sets up.
Added support for *url* being a :term:`path-like object`.
.. soft-deprecated:: 3.13
- Passing a file path instead of URL is :term:`soft deprecated`.
+ Passing a file path instead of URL.
Use :func:`guess_file_type` for this.
diff --git a/Include/internal/pycore_stackref.h b/Include/internal/pycore_stackref.h
index 329045b5faaa22..ca4a7c216eda53 100644
--- a/Include/internal/pycore_stackref.h
+++ b/Include/internal/pycore_stackref.h
@@ -71,8 +71,10 @@ static const _PyStackRef PyStackRef_NULL = { .index = 0 };
static const _PyStackRef PyStackRef_ERROR = { .index = (1 << Py_TAGGED_SHIFT) };
#define PyStackRef_None ((_PyStackRef){ .index = (2 << Py_TAGGED_SHIFT) } )
-#define PyStackRef_False ((_PyStackRef){ .index = (3 << Py_TAGGED_SHIFT) })
-#define PyStackRef_True ((_PyStackRef){ .index = (4 << Py_TAGGED_SHIFT) })
+#define _Py_STACKREF_FALSE_INDEX (3 << Py_TAGGED_SHIFT)
+#define _Py_STACKREF_TRUE_INDEX (4 << Py_TAGGED_SHIFT)
+#define PyStackRef_False ((_PyStackRef){ .index = _Py_STACKREF_FALSE_INDEX })
+#define PyStackRef_True ((_PyStackRef){ .index = _Py_STACKREF_TRUE_INDEX })
#define INITIAL_STACKREF_INDEX (5 << Py_TAGGED_SHIFT)
diff --git a/Lib/test/support/strace_helper.py b/Lib/test/support/strace_helper.py
index cf95f7bdc7d2ca..bf15283d3027da 100644
--- a/Lib/test/support/strace_helper.py
+++ b/Lib/test/support/strace_helper.py
@@ -74,7 +74,7 @@ def sections(self):
def _filter_memory_call(call):
# mmap can operate on a fd or "MAP_ANONYMOUS" which gives a block of memory.
# Ignore "MAP_ANONYMOUS + the "MAP_ANON" alias.
- if call.syscall == "mmap" and "MAP_ANON" in call.args[3]:
+ if call.syscall in ("mmap", "mmap2") and "MAP_ANON" in call.args[3]:
return True
if call.syscall in ("munmap", "mprotect"):
diff --git a/Misc/NEWS.d/next/Build/2025-09-03-14-55-59.gh-issue-138451.-Qzh2S.rst b/Misc/NEWS.d/next/Build/2025-09-03-14-55-59.gh-issue-138451.-Qzh2S.rst
new file mode 100644
index 00000000000000..d83aee08025502
--- /dev/null
+++ b/Misc/NEWS.d/next/Build/2025-09-03-14-55-59.gh-issue-138451.-Qzh2S.rst
@@ -0,0 +1 @@
+Allow for custom LLVM path using ``LLVM_TOOLS_INSTALL_DIR`` during JIT build.
diff --git a/Misc/NEWS.d/next/Build/2026-04-17-21-45-32.gh-issue-148644.vwkknh.rst b/Misc/NEWS.d/next/Build/2026-04-17-21-45-32.gh-issue-148644.vwkknh.rst
new file mode 100644
index 00000000000000..a0cc9c9358cb26
--- /dev/null
+++ b/Misc/NEWS.d/next/Build/2026-04-17-21-45-32.gh-issue-148644.vwkknh.rst
@@ -0,0 +1 @@
+Errors during the PGO training job on Windows are no longer ignored, and a non-zero return code will cause the build to fail.
diff --git a/PCbuild/build.bat b/PCbuild/build.bat
index 8fb2f096c93c0e..9d2f032f5a9355 100644
--- a/PCbuild/build.bat
+++ b/PCbuild/build.bat
@@ -170,16 +170,20 @@ if "%do_pgo%"=="true" (
del /s "%dir%\*.pgc"
del /s "%dir%\..\Lib\*.pyc"
set conf=PGUpdate
- if "%clean%"=="false" (
- echo on
- call "%dir%\..\python.bat" %pgo_job%
- @echo off
- call :Kill
- set target=Build
- )
+ if "%clean%"=="false" goto :RunPgoJob
)
goto :Build
+:RunPgoJob
+echo on
+call "%dir%\..\python.bat" %pgo_job%
+@echo off
+set pgo_errorlevel=%ERRORLEVEL%
+call :Kill
+if %pgo_errorlevel% NEQ 0 exit /B %pgo_errorlevel%
+set target=Build
+goto :Build
+
:Kill
echo on
%MSBUILD% "%dir%\pythoncore.vcxproj" /t:KillPython %verbose%^
diff --git a/PCbuild/regen.targets b/PCbuild/regen.targets
index 41af9cacfb912b..bb059f382eb375 100644
--- a/PCbuild/regen.targets
+++ b/PCbuild/regen.targets
@@ -129,7 +129,7 @@
x86_64-pc-windows-msvc
$(JITArgs) --debug
-
+
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index d9fc28475a489d..0232ed6c382c61 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -1641,18 +1641,12 @@ Py_InitializeFromConfig(const PyConfig *config)
void
Py_InitializeEx(int install_sigs)
{
- PyStatus status;
-
- status = _PyRuntime_Initialize();
- if (_PyStatus_EXCEPTION(status)) {
- Py_ExitStatusException(status);
- }
-
if (Py_IsInitialized()) {
/* bpo-33932: Calling Py_Initialize() twice does nothing. */
return;
}
+ PyStatus status;
PyConfig config;
_PyConfig_InitCompatConfig(&config);
diff --git a/Tools/jit/README.md b/Tools/jit/README.md
index 8eadb3349ba6da..fd7154d0e76d0a 100644
--- a/Tools/jit/README.md
+++ b/Tools/jit/README.md
@@ -9,7 +9,12 @@ 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 21 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.
+LLVM version 21 is the officially supported version. Both `clang` and `llvm-readobj` need to be installed and discoverable (version suffixes, like `clang-21`, 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.
+
+You can customize the LLVM configuration using environment variables before running configure:
+
+- LLVM_VERSION: Specify a different LLVM version (default: 21)
+- LLVM_TOOLS_INSTALL_DIR: Point to a specific LLVM installation prefix when multiple installations exist (the tools are expected in `/bin`)
It's easy to install all of the required tools:
@@ -62,7 +67,7 @@ choco install llvm --version=21.1.0
### Dev Containers
-If you are working on CPython in a [Codespaces instance](https://devguide.python.org/getting-started/setup-building/#using-codespaces), there's no
+If you are working on CPython in a [Codespaces instance](https://devguide.python.org/getting-started/setup-building/#using-codespaces), there's no
need to install LLVM as the Fedora 43 base image includes LLVM 21 out of the box.
## Building
diff --git a/Tools/jit/_llvm.py b/Tools/jit/_llvm.py
index a4aaacdf41249d..601752bf1f6396 100644
--- a/Tools/jit/_llvm.py
+++ b/Tools/jit/_llvm.py
@@ -80,7 +80,18 @@ async def _get_brew_llvm_prefix(llvm_version: str, *, echo: bool = False) -> str
@_async_cache
-async def _find_tool(tool: str, llvm_version: str, *, echo: bool = False) -> str | None:
+async def _find_tool(
+ tool: str,
+ llvm_version: str,
+ llvm_tools_install_dir: str | None,
+ *,
+ echo: bool = False,
+) -> str | None:
+ # Explicitly defined LLVM installation location
+ if llvm_tools_install_dir:
+ path = os.path.join(llvm_tools_install_dir, "bin", tool)
+ if await _check_tool_version(path, llvm_version, echo=echo):
+ return path
# Unversioned executables:
path = tool
if await _check_tool_version(path, llvm_version, echo=echo):
@@ -114,10 +125,11 @@ async def maybe_run(
args: typing.Iterable[str],
echo: bool = False,
llvm_version: str = _LLVM_VERSION,
+ llvm_tools_install_dir: str | None = None,
) -> str | None:
"""Run an LLVM tool if it can be found. Otherwise, return None."""
- path = await _find_tool(tool, llvm_version, echo=echo)
+ path = await _find_tool(tool, llvm_version, llvm_tools_install_dir, echo=echo)
return path and await _run(path, args, echo=echo)
@@ -126,10 +138,17 @@ async def run(
args: typing.Iterable[str],
echo: bool = False,
llvm_version: str = _LLVM_VERSION,
+ llvm_tools_install_dir: str | None = None,
) -> str:
"""Run an LLVM tool if it can be found. Otherwise, raise RuntimeError."""
- output = await maybe_run(tool, args, echo=echo, llvm_version=llvm_version)
+ output = await maybe_run(
+ tool,
+ args,
+ echo=echo,
+ llvm_version=llvm_version,
+ llvm_tools_install_dir=llvm_tools_install_dir,
+ )
if output is None:
raise RuntimeError(f"Can't find {tool}-{llvm_version}!")
return output
diff --git a/Tools/jit/_targets.py b/Tools/jit/_targets.py
index fd5c143b8a812f..f78e80db165fc8 100644
--- a/Tools/jit/_targets.py
+++ b/Tools/jit/_targets.py
@@ -53,6 +53,7 @@ class _Target(typing.Generic[_S, _R]):
cflags: str = ""
frame_pointers: bool = False
llvm_version: str = _llvm._LLVM_VERSION
+ llvm_tools_install_dir: str | None = None
known_symbols: dict[str, int] = dataclasses.field(default_factory=dict)
pyconfig_dir: pathlib.Path = pathlib.Path.cwd().resolve()
@@ -85,7 +86,11 @@ 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, llvm_version=self.llvm_version
+ "llvm-objdump",
+ args,
+ echo=self.verbose,
+ llvm_version=self.llvm_version,
+ llvm_tools_install_dir=self.llvm_tools_install_dir,
)
if output is not None:
# Make sure that full paths don't leak out (for reproducibility):
@@ -105,7 +110,11 @@ async def _parse(self, path: pathlib.Path) -> _stencils.StencilGroup:
f"{path}",
]
output = await _llvm.run(
- "llvm-readobj", args, echo=self.verbose, llvm_version=self.llvm_version
+ "llvm-readobj",
+ args,
+ echo=self.verbose,
+ llvm_version=self.llvm_version,
+ llvm_tools_install_dir=self.llvm_tools_install_dir,
)
# --elf-output-style=JSON is only *slightly* broken on Mach-O...
output = output.replace("PrivateExtern\n", "\n")
@@ -184,7 +193,11 @@ async def _compile(
# Allow user-provided CFLAGS to override any defaults
args_s += shlex.split(self.cflags)
await _llvm.run(
- "clang", args_s, echo=self.verbose, llvm_version=self.llvm_version
+ "clang",
+ args_s,
+ echo=self.verbose,
+ llvm_version=self.llvm_version,
+ llvm_tools_install_dir=self.llvm_tools_install_dir,
)
if not is_shim:
self.optimizer(
@@ -196,7 +209,11 @@ async def _compile(
).run()
args_o = [f"--target={self.triple}", "-c", "-o", f"{o}", f"{s}"]
await _llvm.run(
- "clang", args_o, echo=self.verbose, llvm_version=self.llvm_version
+ "clang",
+ args_o,
+ echo=self.verbose,
+ llvm_version=self.llvm_version,
+ llvm_tools_install_dir=self.llvm_tools_install_dir,
)
return await self._parse(o)
diff --git a/Tools/jit/build.py b/Tools/jit/build.py
index 127d93b317fb09..5e1b05a3d86cb4 100644
--- a/Tools/jit/build.py
+++ b/Tools/jit/build.py
@@ -43,6 +43,9 @@
"--cflags", help="additional flags to pass to the compiler", default=""
)
parser.add_argument("--llvm-version", help="LLVM version to use")
+ parser.add_argument(
+ "--llvm-tools-install-dir", help="Installation location of LLVM tools"
+ )
args = parser.parse_args()
for target in args.target:
target.debug = args.debug
@@ -52,6 +55,8 @@
target.pyconfig_dir = args.pyconfig_dir
if args.llvm_version:
target.llvm_version = args.llvm_version
+ if args.llvm_tools_install_dir:
+ target.llvm_tools_install_dir = args.llvm_tools_install_dir
target.build(
comment=comment,
force=args.force,
diff --git a/configure b/configure
index 562bb6860c79a9..49319bc2aa4459 100755
--- a/configure
+++ b/configure
@@ -11046,7 +11046,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\" --llvm-version=\"$LLVM_VERSION\""
+ 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\" --llvm-tools-install-dir=\"$LLVM_TOOLS_INSTALL_DIR\""
if test "x$Py_DEBUG" = xtrue
then :
as_fn_append REGEN_JIT_COMMAND " --debug"
diff --git a/configure.ac b/configure.ac
index 20e1afc2e9ee14..7b6f3c5e0ed5be 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2850,7 +2850,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\" --llvm-version=\"$LLVM_VERSION\""])
+ ["\$(PYTHON_FOR_REGEN) \$(srcdir)/Tools/jit/build.py ${ARCH_TRIPLES:-$host} --output-dir . --pyconfig-dir . --cflags=\"$CFLAGS_JIT\" --llvm-version=\"$LLVM_VERSION\" --llvm-tools-install-dir=\"$LLVM_TOOLS_INSTALL_DIR\""])
AS_VAR_IF([Py_DEBUG],
[true],
[AS_VAR_APPEND([REGEN_JIT_COMMAND], [" --debug"])],