# Copyright 2022-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
# ROCm implementation of PyTorch Python bindings
EAPI=8
DISTUTILS_USE_PEP517=setuptools
PYTHON_COMPAT=( python3_{11..14} )
DISTUTILS_SINGLE_IMPL=1
DISTUTILS_EXT=1
inherit distutils-r1 prefix
MY_PN=pytorch
MYPN=pytorch
MYP=${MYPN}-${PV}
DESCRIPTION="Tensors and Dynamic neural networks in Python (ROCm backend)"
HOMEPAGE="https://pytorch.org/"
SRC_URI="https://github.com/pytorch/${MYPN}/archive/refs/tags/v${PV}.tar.gz -> ${MYP}.tar.gz"
S="${WORKDIR}/${MYP}"
LICENSE="BSD"
SLOT="0"
KEYWORDS="~amd64"
RESTRICT="test"
REQUIRED_USE=${PYTHON_REQUIRED_USE}
CAFFE2_PREFIX="/usr/lib/caffe2/rocm"
PYTORCH_PREFIX="/usr/lib/pytorch/rocm"
RDEPEND="
${PYTHON_DEPS}
~sci-ml/caffe2-rocm-${PV}[${PYTHON_SINGLE_USEDEP}]
app-eselect/eselect-pytorch
$(python_gen_cond_dep '
dev-python/sympy[${PYTHON_USEDEP}]
dev-python/typing-extensions[${PYTHON_USEDEP}]
')
"
DEPEND="${RDEPEND}
$(python_gen_cond_dep '
dev-python/pyyaml[${PYTHON_USEDEP}]
')
"
PATCHES=(
"${FILESDIR}"/${MY_PN}-2.9.0-dontbuildagain.patch
"${FILESDIR}"/${MY_PN}-2.10.0-cpp-extension-multilib.patch
)
src_prepare() {
sed -e "s|%LIB_DIR%|$(get_libdir)|g" \
-i torch/utils/cpp_extension.py || die
sed -e "/BUILD_DIR/s|build|/var/lib/caffe2-rocm/|" \
-i tools/setup_helpers/env.py || die
sed -e "/build-backend/s|:__legacy__||" \
-i pyproject.toml || die
distutils-r1_src_prepare
hprefixify tools/setup_helpers/env.py
}
python_compile() {
PYTORCH_BUILD_VERSION=${PV} \
PYTORCH_BUILD_NUMBER=0 \
USE_SYSTEM_LIBS=ON \
CMAKE_BUILD_DIR="${BUILD_DIR}" \
distutils-r1_python_compile develop sdist
}
python_install() {
local dest="${ED}${PYTORCH_PREFIX}"
mkdir -p "${dest}" || die
USE_SYSTEM_LIBS=ON distutils-r1_python_install
local sitedir="$(python_get_sitedir)"
local items=( torch functorch torchgen )
for item in "${items[@]}"; do
if [[ -d "${ED}${sitedir}/${item}" ]]; then
mv "${ED}${sitedir}/${item}" "${dest}/${item}" || die
fi
done
# Move dist-info to prefix to avoid collisions with other backends
local distinfo
for distinfo in "${ED}${sitedir}"/torch-*.dist-info; do
[[ -d "${distinfo}" ]] && mv "${distinfo}" "${dest}/" || true
done
if [[ -f "${ED}/usr/bin/torchrun" ]]; then
dodir "${PYTORCH_PREFIX}/bin"
mv "${ED}/usr/bin/torchrun" "${ED}${PYTORCH_PREFIX}/bin/torchrun" || die
fi
# torch/lib symlinks to caffe2 prefix — native lib resolution without env vars
dodir "${PYTORCH_PREFIX}/torch/lib"
local caffe2lib="${CAFFE2_PREFIX}/$(get_libdir)"
local lib
for lib in "${ED}${caffe2lib}"/*.so; do
[[ -f "${lib}" ]] || continue
local bname="$(basename "${lib}")"
dosym "${caffe2lib}/${bname}" "${PYTORCH_PREFIX}/torch/lib/${bname}"
done
}
pkg_postinst() {
local active
active=$(eselect pytorch show 2>/dev/null)
if [[ "${active}" == "(unset)" || -z "${active}" ]]; then
eselect pytorch set rocm
elog "PyTorch backend set to: rocm"
fi
}