]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-133779: Fix finding pyconfig.h on Windows JIT builds (GH-134349)
authorBrandt Bucher <brandtbucher@microsoft.com>
Tue, 20 May 2025 16:32:26 +0000 (12:32 -0400)
committerGitHub <noreply@github.com>
Tue, 20 May 2025 16:32:26 +0000 (12:32 -0400)
PCbuild/regen.targets
Tools/jit/_targets.py
Tools/jit/build.py
configure
configure.ac

index 21de614e71ddcee8104e5352ef5770020a614b1e..742597f5cb5ebd2385286e0a8fb75b7c7ab81e96 100644 (file)
       <JITArgs Condition="$(Platform) == 'x64'">x86_64-pc-windows-msvc</JITArgs>
       <JITArgs Condition="$(Configuration) == 'Debug'">$(JITArgs) --debug</JITArgs>
     </PropertyGroup>
-    <Exec Command='$(PythonForBuild) "$(PySourcePath)Tools\jit\build.py" $(JITArgs)'
-          WorkingDirectory="$(GeneratedJitStencilsDir)"/>
+    <Exec Command='$(PythonForBuild) "$(PySourcePath)Tools\jit\build.py" $(JITArgs) --output-dir "$(GeneratedJitStencilsDir)" --pyconfig-dir "$(PySourcePath)PC"'/>
   </Target>
   <Target Name="_CleanJIT" AfterTargets="Clean">
     <Delete Files="@(_JITOutputs)"/>
index 6ceb4404e74ce7e84d9574fef3f3b831b8cb8d26..d0a1c081ffecc2e2b81447807ae2e14ab7d87ee3 100644 (file)
@@ -47,6 +47,7 @@ class _Target(typing.Generic[_S, _R]):
     debug: bool = False
     verbose: bool = False
     known_symbols: dict[str, int] = dataclasses.field(default_factory=dict)
+    pyconfig_dir: pathlib.Path = pathlib.Path.cwd().resolve()
 
     def _get_nop(self) -> bytes:
         if re.fullmatch(r"aarch64-.*", self.triple):
@@ -57,13 +58,13 @@ class _Target(typing.Generic[_S, _R]):
             raise ValueError(f"NOP not defined for {self.triple}")
         return nop
 
-    def _compute_digest(self, out: pathlib.Path) -> str:
+    def _compute_digest(self) -> str:
         hasher = hashlib.sha256()
         hasher.update(self.triple.encode())
         hasher.update(self.debug.to_bytes())
         # These dependencies are also reflected in _JITSources in regen.targets:
         hasher.update(PYTHON_EXECUTOR_CASES_C_H.read_bytes())
-        hasher.update((out / "pyconfig.h").read_bytes())
+        hasher.update((self.pyconfig_dir / "pyconfig.h").read_bytes())
         for dirpath, _, filenames in sorted(os.walk(TOOLS_JIT)):
             for filename in filenames:
                 hasher.update(pathlib.Path(dirpath, filename).read_bytes())
@@ -125,7 +126,7 @@ class _Target(typing.Generic[_S, _R]):
             f"-D_JIT_OPCODE={opname}",
             "-D_PyJIT_ACTIVE",
             "-D_Py_JIT",
-            "-I.",
+            f"-I{self.pyconfig_dir}",
             f"-I{CPYTHON / 'Include'}",
             f"-I{CPYTHON / 'Include' / 'internal'}",
             f"-I{CPYTHON / 'Include' / 'internal' / 'mimalloc'}",
@@ -193,20 +194,19 @@ class _Target(typing.Generic[_S, _R]):
 
     def build(
         self,
-        out: pathlib.Path,
         *,
         comment: str = "",
         force: bool = False,
-        stencils_h: str = "jit_stencils.h",
+        jit_stencils: pathlib.Path,
     ) -> None:
         """Build jit_stencils.h in the given directory."""
+        jit_stencils.parent.mkdir(parents=True, exist_ok=True)
         if not self.stable:
             warning = f"JIT support for {self.triple} is still experimental!"
             request = "Please report any issues you encounter.".center(len(warning))
             outline = "=" * len(warning)
             print("\n".join(["", outline, warning, request, outline, ""]))
-        digest = f"// {self._compute_digest(out)}\n"
-        jit_stencils = out / stencils_h
+        digest = f"// {self._compute_digest()}\n"
         if (
             not force
             and jit_stencils.exists()
@@ -214,7 +214,7 @@ class _Target(typing.Generic[_S, _R]):
         ):
             return
         stencil_groups = ASYNCIO_RUNNER.run(self._build_stencils())
-        jit_stencils_new = out / "jit_stencils.h.new"
+        jit_stencils_new = jit_stencils.parent / "jit_stencils.h.new"
         try:
             with jit_stencils_new.open("w") as file:
                 file.write(digest)
index 49b08f477dbed7bf10239535342f1477a949f93c..1afd0c76bad1d2d7a1e594c9dbf42953b3ab2a20 100644 (file)
@@ -8,7 +8,6 @@ import sys
 import _targets
 
 if __name__ == "__main__":
-    out = pathlib.Path.cwd().resolve()
     comment = f"$ {shlex.join([pathlib.Path(sys.executable).name] + sys.argv)}"
     parser = argparse.ArgumentParser(description=__doc__)
     parser.add_argument(
@@ -23,6 +22,20 @@ if __name__ == "__main__":
     parser.add_argument(
         "-f", "--force", action="store_true", help="force the entire JIT to be rebuilt"
     )
+    parser.add_argument(
+        "-o",
+        "--output-dir",
+        help="where to output generated files",
+        required=True,
+        type=lambda p: pathlib.Path(p).resolve(),
+    )
+    parser.add_argument(
+        "-p",
+        "--pyconfig-dir",
+        help="where to find pyconfig.h",
+        required=True,
+        type=lambda p: pathlib.Path(p).resolve(),
+    )
     parser.add_argument(
         "-v", "--verbose", action="store_true", help="echo commands as they are run"
     )
@@ -31,13 +44,13 @@ if __name__ == "__main__":
         target.debug = args.debug
         target.force = args.force
         target.verbose = args.verbose
+        target.pyconfig_dir = args.pyconfig_dir
         target.build(
-            out,
             comment=comment,
-            stencils_h=f"jit_stencils-{target.triple}.h",
             force=args.force,
+            jit_stencils=args.output_dir / f"jit_stencils-{target.triple}.h",
         )
-    jit_stencils_h = out / "jit_stencils.h"
+    jit_stencils_h = args.output_dir / "jit_stencils.h"
     lines = [f"// {comment}\n"]
     guard = "#if"
     for target in args.target:
index 2649a800f91a481e5d0958de0f945c51a5e63a2d..abdd28fcabf769f80a4e0ef1524291f149c7df71 100755 (executable)
--- a/configure
+++ b/configure
@@ -10863,7 +10863,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}"
+           REGEN_JIT_COMMAND="\$(PYTHON_FOR_REGEN) \$(srcdir)/Tools/jit/build.py ${ARCH_TRIPLES:-$host} --output-dir . --pyconfig-dir ."
            JIT_STENCILS_H="jit_stencils.h"
            if test "x$Py_DEBUG" = xtrue
 then :
index 5525a5b0ed5240593a1f73018d9e73c81169196f..8d939f075058bf904cfcc3c2696e0feb6554c810 100644 (file)
@@ -2776,7 +2776,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}"])
+                      ["\$(PYTHON_FOR_REGEN) \$(srcdir)/Tools/jit/build.py ${ARCH_TRIPLES:-$host} --output-dir . --pyconfig-dir ."])
            AS_VAR_SET([JIT_STENCILS_H], ["jit_stencils.h"])
            AS_VAR_IF([Py_DEBUG],
                      [true],