dev-lang/pypy: Import 2.7.7.3.17 from dev-python/pypy

Introduce a dev-lang/pypy:2.7 slotted package as an alternative
to the split dev-python/pypy.  While at it, do some cleanup and copy
some improvements from PyPy3.10.

See-Also: https://public-inbox.gentoo.org/gentoo-dev/3413fe34b8a530c98685a2b6bbf00eaee6e3c02f.camel@gentoo.org/T/
Signed-off-by: Michał Górny <mgorny@gentoo.org>
This commit is contained in:
Michał Górny
2024-10-19 12:49:54 +02:00
parent 55119710e6
commit 01ac654372
3 changed files with 336 additions and 0 deletions

2
dev-lang/pypy/Manifest Normal file
View File

@@ -0,0 +1,2 @@
DIST pypy2.7-gentoo-patches-7.3.17.tar.xz 5324 BLAKE2B 866f172a6df6f0e94a98c611b37ae58635623e33a47619a5e44658d3908337a3f9029ff7de6997f760c3f1679fc83bfc6ddfb66852c492a581b3336b5eec3ed2 SHA512 6ce5266d0748f3c18a5546aa2bd8479ecb45923eb7df8a140a195e7f7b44999b9167ffdd44f7fd789ddd3a62cd77cb917863b0144180a1127befce1f290e650a
DIST pypy2.7-v7.3.17-src.tar.bz2 19907140 BLAKE2B de62ebc4e8102867effdecddca64c19c40458b112a6a56ac0c95247047b9f5437a5da68dffb51c14c21bce463c2ca489c6e6a4f86e8cc597b57df2eca707081e SHA512 82b2b9dbf0ea32c405ddc53d98a3a7a153f494d286e8719a0c40960168aadc0f49c3b313416488338f7f51c8fdb58120de41b1d47a8c8eda7db6d4ec4273b4eb

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
<maintainer type="project">
<email>python@gentoo.org</email>
<name>Python</name>
</maintainer>
<upstream>
<remote-id type="github">pypy/pypy</remote-id>
</upstream>
<use>
<flag name="full-stdlib">
Install complete stdlib as necessary to use PyPy for general
purpose programs. By default, only a limited subset that is
used when building PyPy3 executables is installed. Note
that PyPy2.7's stdlib contains multiple known vulnerabilities.
</flag>
</use>
</pkgmetadata>

View File

@@ -0,0 +1,315 @@
# Copyright 1999-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
inherit pax-utils toolchain-funcs
PYVER=$(ver_cut 1-2)
PATCHSET_PV=$(ver_cut 3-)
PYPY_PV=${PATCHSET_PV%_p*}
MY_P="pypy${PYVER}-v${PYPY_PV/_}"
PATCHSET="pypy${PYVER}-gentoo-patches-${PATCHSET_PV/_rc/rc}"
DESCRIPTION="A fast, compliant alternative implementation of the Python (${PYVER}) language"
HOMEPAGE="
https://pypy.org/
https://github.com/pypy/pypy/
"
SRC_URI="
https://downloads.python.org/pypy/${MY_P}-src.tar.bz2
https://buildbot.pypy.org/pypy/${MY_P}-src.tar.bz2
https://dev.gentoo.org/~mgorny/dist/python/${PATCHSET}.tar.xz
"
S="${WORKDIR}/${MY_P}-src"
LICENSE="MIT"
# pypy -c 'import sysconfig; print sysconfig.get_config_var("SOABI")'
SLOT="${PYVER}/73"
KEYWORDS="~amd64 ~arm64 ~ppc64 ~x86 ~amd64-linux ~x86-linux"
IUSE="bzip2 full-stdlib gdbm +jit ncurses sqlite tk"
RESTRICT="test"
RDEPEND="
|| (
>=dev-python/pypy-exe-bin-${PYPY_PV}:${PYPY_PV}
>=dev-python/pypy-exe-${PYPY_PV}:${PYPY_PV}[bzip2?,ncurses?]
)
dev-libs/openssl:0=
gdbm? ( sys-libs/gdbm:0= )
sqlite? ( dev-db/sqlite:3= )
tk? (
dev-lang/tk:0=
dev-tcltk/tix:0=
)
!dev-python/pypy
"
DEPEND="
${RDEPEND}
"
src_prepare() {
local PATCHES=(
"${WORKDIR}/${PATCHSET}"
)
default
}
src_configure() {
tc-export CC
}
src_compile() {
# copy over to make sys.prefix happy
cp -p "${BROOT}/usr/lib/pypy${PYVER}/pypy-c-${PYPY_PV}" pypy-c || die
cp -p "${BROOT}/usr/lib/pypy${PYVER}/include/${PYPY_PV}"/* include/ || die
# (not installed by pypy)
rm pypy/module/cpyext/include/_numpypy/numpy/README || die
mv pypy/module/cpyext/include/* include/ || die
mv pypy/module/cpyext/parse/*.h include/ || die
pax-mark m pypy-c
# verify the subslot
local soabi=$(
./pypy-c - <<-EOF
import sysconfig
print sysconfig.get_config_var("SOABI")
EOF
)
[[ ${soabi#pypy-} == ${SLOT#*/} ]] || die "update subslot to ${soabi}"
einfo "Generating caches and CFFI modules ..."
if use full-stdlib; then
# Generate Grammar and PatternGrammar pickles.
./pypy-c - <<-EOF || die "Generation of Grammar and PatternGrammar pickles failed"
import lib2to3.pygram
import lib2to3.patcomp
lib2to3.patcomp.PatternCompiler()
EOF
# Generate cffi modules
# Please keep in sync with pypy/tool/build_cffi_imports.py!
cffi_targets=( pypy_util ssl audioop syslog pwdgrp resource )
use gdbm && cffi_targets+=( gdbm )
use ncurses && cffi_targets+=( curses )
use sqlite && cffi_targets+=( sqlite3 )
use tk && cffi_targets+=( tkinter/tklib )
local t
# all modules except tkinter output to .
# tkinter outputs to the correct dir ...
cd lib_pypy || die
for t in "${cffi_targets[@]}"; do
# tkinter doesn't work via -m
../pypy-c "_${t}_build.py" || die "Failed to build CFFI bindings for ${t}"
done
# Verify that CFFI module list is up-to-date
local expected_cksum=-7df4eab0
local local_cksum=$(
../pypy-c - <<-EOF
import binascii
import json
from pypy_tools.build_cffi_imports import cffi_build_scripts as x
print("%08x" % (binascii.crc32(json.dumps(x)),))
EOF
)
if [[ ${local_cksum} != ${expected_cksum} ]]; then
die "Please verify cffi_targets and update checksum to ${local_cksum}"
fi
# Cleanup temporary objects
find -name "_cffi_*.[co]" -delete || die
find -type d -empty -delete || die
fi
}
src_test() {
# (unset)
local -x PYTHONDONTWRITEBYTECODE=
local -x COLUMNS=80
local ignored_tests=(
# network
--ignore=lib-python/${PYVER}/test/test_urllibnet.py
--ignore=lib-python/${PYVER}/test/test_urllib2net.py
# lots of free space
--ignore=lib-python/${PYVER}/test/test_zipfile64.py
# broken by expat-2.4.5
--ignore=lib-python/${PYVER}/test/test_minidom.py
--ignore=lib-python/${PYVER}/test/test_xml_etree.py
--ignore=lib-python/${PYVER}/test/test_xml_etree_c.py
)
./pypy-c ./pypy/test_all.py --pypy=./pypy-c -vv \
"${ignored_tests[@]}" lib-python || die
}
src_install() {
local dest="/usr/lib/pypy${PYVER}"
einfo "Installing PyPy ..."
dosym "pypy-c-${PYPY_PV}" "${dest}/pypy-c"
insinto "${dest}"
# preserve mtimes to avoid obsoleting caches
insopts -p
if use full-stdlib; then
doins -r include lib_pypy lib-python
# replace copied headers with symlinks
for x in "${BROOT}/usr/lib/pypy${PYVER}/include/${PYPY_PV}"/*; do
dosym "${PYPY_PV}/${x##*/}" "${dest}/include/${x##*/}"
done
if ! use gdbm; then
rm -r "${ED}${dest}"/lib_pypy/gdbm.py \
"${ED}${dest}"/lib-python/*${PYVER}/test/test_gdbm.py || die
fi
if ! use sqlite; then
rm -r "${ED}${dest}"/lib-python/*${PYVER}/sqlite3 \
"${ED}${dest}"/lib_pypy/_sqlite3.py \
"${ED}${dest}"/lib-python/*${PYVER}/test/test_sqlite.py || die
fi
if ! use tk; then
rm -r "${ED}${dest}"/lib-python/*${PYVER}/{idlelib,lib-tk} \
"${ED}${dest}"/lib_pypy/_tkinter \
"${ED}${dest}"/lib-python/*${PYVER}/test/test_{tcl,tk,ttk*}.py || die
fi
else
# install only the absolutely minimal subset of modules needed
# for pypy3 build
local lib_py_modules=(
# base modules needed to even start pypy (and import site)
codecs.py
copy_reg.py
encodings
genericpath.py
linecache.py
os.py
pkgutil.py
posixpath.py
re.py
runpy.py
site.py
sre_compile.py
sre_constants.py
sre_parse.py
stat.py
string.py
sysconfig.py
traceback.py
warnings.py
UserDict.py
# needed for python_optimize
compileall.py
getopt.py
py_compile.py
struct.py
# needed for rpython
argparse.py
atexit.py
base64.py
bdb.py
bisect.py
cmd.py
code.py
codeop.py
collections.py
colorsys.py
contextlib.py
copy.py
ctypes
dis.py
fnmatch.py
functools.py
gettext.py
hashlib.py
heapq.py
inspect.py
io.py
json
keyword.py
locale.py
logging
new.py
opcode.py
optparse.py
pdb.py
pickle.py
platform.py
pprint.py
random.py
repr.py
shlex.py
shutil.py
StringIO.py
subprocess.py
tempfile.py
textwrap.py
threading.py
tokenize.py
weakref.py
zipfile.py
)
local distutils_modules=(
# needed by site
__init__.py
errors.py
sysconfig.py
sysconfig_cpython.py
sysconfig_pypy.py
)
local lib_pypy_modules=(
# needed by site
_sysconfigdata.py
# needed by rpython
cffi
_ctypes
_ffi.py
_functools.py
_sha.py
_sha256.py
_sha512.py
# NB: we're deliberately skipping _hashlib to avoid some deps
)
cd "lib-python/${PYVER}" || die
insinto "${dest}/lib-python/${PYVER}"
doins -r "${lib_py_modules[@]}"
cd - >/dev/null || die
cd "lib-python/${PYVER}/distutils" || die
insinto "${dest}/lib-python/${PYVER}/distutils"
doins -r "${distutils_modules[@]}"
cd - >/dev/null || die
cd lib_pypy || die
insinto "${dest}/lib_pypy"
doins -r "${lib_pypy_modules[@]}"
cd - >/dev/null || die
fi
dosym "../lib/pypy${PYVER}/pypy-c" /usr/bin/pypy
dodoc README.rst
local -x PYTHON="${ED}${dest}/pypy-c-${PYPY_PV}"
# temporarily copy to build tree to facilitate module builds
cp -p "${BROOT}${dest}/pypy-c-${PYPY_PV}" "${PYTHON}" || die
einfo "Byte-compiling Python standard library..."
"${PYTHON}" -m compileall \
-x 'bad_coding|badsyntax|make_ssl_data|lib2to3/tests/data' \
-q -f -d "${dest}" "${ED}/${dest}" || die
# remove to avoid collisions
rm "${PYTHON}" || die
}