Move the build of the torch._C Python extension and the install of
torch/version.py from setup.py into torch/CMakeLists.txt, so
both the existing setuptools backend and the upcoming
scikit-build-core backend (#180247) go through the same code path.
The new Python_add_library(_C MODULE WITH_SOABI ...) target builds
the same torch/csrc/stub.c and installs at the wheel root (mapped to
torch/ by wheel.install-dir); setup.py's Extension("torch._C", ...) block and its companion extra_compile_args /
extra_link_args / make_relative_rpath_args plumbing are removed.
version.py is gitignored, so it is installed explicitly via
install(FILES ... DESTINATION ".") rather than relying on Python
package collection.
Adds a BinaryDistribution class in setup.py that forces
has_ext_modules=True so bdist_wheel uses the binary layout
(package_data + data_files only) instead of the purelib layout, which
would otherwise dump CMake's build/lib/ tree -- including test
artifacts -- into the wheel root. package_data collects the
CMake-built extension via the interpreter's exact module name
(f"_C{sysconfig.get_config_var('EXT_SUFFIX')}") rather than a _C*
glob, so a build/ dir reused across Python versions cannot leak
other ABIs' _C modules into the wheel.
Windows handling: the manual setup.py copy of _C.lib from
build_temp to build_lib is replaced by the _C target's
ARCHIVE DESTINATION "lib". For MSVC, the linker is told where to
find pythonXX.lib via /LIBPATH (Python headers use #pragma comment(lib, "pythonXX") which expects a bare-name lookup); for
Windows venvs, FindPython's library search path is extended with
sys.base_prefix/libs since the import library lives in the base
install, not the venv. nnapi_backend gains
TORCH_PYTHON_LINK_FLAGS so it picks up the same MSVC linker
options as torch_python.
Test plan
Verification is via artifact-content comparison against the parent
(#180242). Expectation: the wheel must be content-equivalent modulo
the one file the PR rebuilds (torch/_C.cpython-*.so), which must
remain functionally identical (same exports, same imports, same
rpath).
No regression in artifact sizes across every manywheel /
libtorch artifact (sub-0.001 % to 0.001 % delta, zip-timestamp
noise consistent across artifacts this PR can't directly affect):
artifact
parent (#180242)
this PR (#180243)
delta
manywheel-py3_12-rocm7_2
6,153,280,701
6,153,275,144
-5,557 (-0.000%)
manywheel-py3_12-rocm7_1
5,788,503,789
5,788,499,957
-3,832 (-0.000%)
manywheel-py3_12-cuda12_6
841,797,521
841,797,813
+292 (+0.000%)
manywheel-py3_12-cuda13_2
624,213,880
624,212,127
-1,753 (-0.000%)
manywheel-py3_12-cpu
189,248,452
189,248,117
-335 (-0.000%)
manywheel-py3_12-xpu
778,712,445
778,711,285
-1,160 (-0.000%)
libtorch-rocm7_2-shared-with-deps-release
12,117,315,856
12,117,314,539
-1,317 (-0.000%)
libtorch-cpu-shared-with-deps-release
257,626,615
257,624,612
-2,003 (-0.001%)
Wheel manifest equivalence vs parent
(manywheel-py3_12-rocm7_2): both wheels contain 26,779 entries;
filename diff is empty -- no files added or removed. Confirms the
BinaryDistributionlayout fix worked (nobuild/lib/spillage
into the wheel root).
Per-file size diff: exactly one file changed.
torch/_C.cpython-312-x86_64-linux-gnu.so 22,960 -> 15,720 (-7,240)
Every other one of 26,778 files is byte-identical in size. That is
precisely the file the PR rebuilds via CMake.
torch._Cis functionally equivalent between parent and PR.
Extracted both.sofiles and compared:
- Defined symbols: zero-line diff.
- Undefined symbols (imports from
libtorch_python): zero-line
diff. - RPATH: identical (
$ORIGIN:$ORIGIN/lib). - NEEDED: 180242's
.soincludes a redundant
libpthread.so.0(merged intolibc.so.6since glibc 2.34); the
CMake build drops it. The size shrinkage matches the cleaner
NEEDED + tighter section layout from the CMake toolchain.
torch/version.pyis present in both wheels at 339 bytes,
byte-identical except for the expectedgit_versionSHA (each
commit has its own).__version__,debug,cuda,hip,rocm,
xpufields all match -- the CMake-driven generation produces the
same output as the setuptools path.
Exactly one
_CABI per wheel. On a fresh multi-ABI
manywheel-cpu-build(build_all.sh builds all CPython ABIs in one
checkout), each wheel ships only its owntorch/_C.cpython-XY.so.
An earlier greedy_C*.sopackage_dataglob leaked stale per-ABI
stubs (a cp312 wheel carried cp310/cp311/cp312); pinning to the
exactEXT_SUFFIXfixes it.
unzip -l manywheel-py3_13-cpu.whl | grep 'torch/_C\.cpython'
# -> only torch/_C.cpython-313-x86_64-linux-gnu.so
Coverage notes
- NNAPI MSVC link-flag fix and Windows venv
pythonXX.lib
discovery fix are not exercised by the ROCm-Linux artifacts
above. They are exercised by the Windows pull-CI (where NNAPI
builds run and venv-based discovery is relevant); the green Windows
CI is the evidence for those. - ROCm wheels are Linux-only by build matrix
(.github/scripts/generate_binary_build_matrix.py:130-135,
supported_platforms=["Linux"]).
Co-Generated with Claude Code
Pull Request resolved: #180243
Approved by: https://github.com/malfet
SOCIAL SHARE CARD GENERATOR